其他分享
首页 > 其他分享> > 山东师范大学硕士研究生入学考试试题汇总

山东师范大学硕士研究生入学考试试题汇总

作者:互联网

山东师范大学2018年硕士研究生入学考试试题

1、设计一个算法,删除单链表L(有头结点)中的一个最小值结点。P48

LinkList Delete_Min(LinkList &L){
//L带头结点的单链表,本算法删除其最小值结点
	LNode *pre=L,*p=pre->next;		//p为工作指针,pre指向其前驱
	LNode *minpre=pre,*minp=p;		//保存最小值结点及其前驱
	while(p!=NULL){
		if(p->data<minp->data){
			minp=p;					//找到比之前找到的最小值结点更小的结点
			minpre=pre;
		}
		pre=p;
		p=p->next;					//继续扫描下一个结点
	}
	minpre->next=minp->next;		//删除最小值结点
	free(minp);
	return L;
}

2、如果在循环队列的两端都可以进行插入和删除操作,写出从队尾出队元素的算法。

Status DeQueue(SqQueue &Q){
	//若队列不空,则删除Q的队尾元素,并返回ok
	//否则返回ERROR
	if(Q.front == Q.rear)
		return ERROR;
	Q.rear = (Q.rear - 1 + MAXQSIZE) % MAXQSIZE;
	return OK;
}

3、假设二叉树采用二叉链表存储结构,设计一个算法,计算一棵给定二叉树的所有叶子结点数。

Status POLeafNodeNum(int &i,BiTree &T){
	if(T){
		if(!T->lchild && !T->rchild)
			i++;
		POLeafNodeNum(i,T->lchild);
		POLeafNodeNum(i,T->rchild);
	}
	return OK;
}

4、奇偶交换排序是一种交换排序。它的第一趟对序列中的所有奇数项i扫描,第二趟对序列中的所有偶数项i扫描,若A[i]>A[i+1],则交换它们。第三趟对序列中的所有奇数项扫描,第四题对序列中的所有偶数项i扫描,…,如此反复,直至整个序列全部排好序为止。写出奇偶交换排序的算法。

此算法是用Java所写,尚未找到C语言版的

private void core(int[] array) {
        int arrayLength = array.length;
        boolean oddSorted = false;
        boolean evenSorted = false;
        
        while(!oddSorted || !evenSorted) {
            int base = 0;
            oddSorted = true;
            evenSorted = true;
            
            for (int i = base; i < arrayLength - 1; i += 2) {
                if (array[i] > array[i + 1]) {
                    ArrayUtils.swap(array, i, i + 1);
                    oddSorted = false;
                }
            }
            
            base = 1;
            for (int i = base; i < arrayLength - 1; i += 2) {
                if (array[i] > array[i + 1]) {
                    ArrayUtils.swap(array, i, i + 1);
                    evenSorted = false;
                }
            }
        }
    }
#include<iostream>
using namespace std;
int n,flag=0;
int A[100]={0};
int shulu(){
	cin>>n;
	cout<<"n的值是"<<n<<end1;
	for(int i=1;i<=n;i++){
		cout<<"第"<<i<<end1;
		cin>>A[i];
	}
	return 0;
}
int paixu()[
	flag=0;
	for(int i=1;i+1<=n;i+=2){
		if(A[i]>A[i+1]){
			int p;
			p=A[i];
			A[i]=A[i+1];
			A[i+1]=p;
			flag=1;
		}
		else
			continue;
	}
	for(i=2;i+1<=n;i+=2){
		if(A[i]>a[i+1]){
			int p;
			p=A[i];
			A[i]=A[i+1];
			A[i+1]=p;
			flag=1;
		}
		else
			continue;
	}
	return 0;
}
int main(){
	shulu();
	flag=1;
	cout<<"开始排序"<<end1;
	while(flag!=0){
		paixu();
	}
	cout<<end1;
	for(int i=1;i<=n;i++)
		cout<<A[i]<<" ";
	return 0;
}

山东师范大学2017年硕士研究生入学考试试题

1、有一个递增非空链表,设计一个算法删除值域重复的结点。例如,{1,1,2,3,3,3,4,4,7,7,7,9,9}。

void Del_Same(LinkList &L){
//L是递增有序的单链表,本算法删除表中数值相同的元素
	LNode *p=L->nest,*q;
	if(p==NULL)
		return;
	while(p->next!=NULL){
		q=p->next;					//q指向*p的后继结点
		if(p->data==q->data){		//找到重复值的结点
			p->next=q->next;		//释放*q结点
			free(q);				//释放相同元素值的结点
		}
		else
			p=p->next;
	}
}

2、写一个函数,逆序打印单链表中的数据,假设指针L指向单链表的开始结点(用递归算法)。

void reprintList(LNode *L){
	if(L!=NULL){
		reprintList(L->next);		//递归逆序打印开始结点之后的结点数据
		print("%d\t",L->data);		//打印结点数据
	}
}

3、在二叉树中查找值为x的结点。假设值为x的结点不多于一个,打印出值为x的结点所在的层次。

算法思路 :结点查找–>>遍历二叉树;要判断当前所在层次,利用函数参数和返回值传递信息的作用实现。

int h=0;
int find_node_level(BTNode *bt, ElemType x,int h){
	if(bt == NULL)
		return 0;
	else if(bt->data == x)
		return h;
	else{
		int l = find_node_level(bt->lchild, x, h+1);
		if(l != 0)
			return l;
		else
			return find_node_level(bt->rchild, x, h+1);
	}
}

4、写出直接插入排序的算法。

不带“哨兵”, 此方法优于带“哨兵”

void InsertSort(ElemType A[],int n){
	int i,j,temp;
	for(i=1;i<n;i++)							//将各元素插入已排好序的的序列中
		if(A[i]<A[i-1]){						//若A[i]关键字小于前驱
			temp=A[i];							//用temp暂存A[i]
			for(j=i-1;j>=0 && A[j]>temp;--j)	//检查所有前面已排好序的元素
				A[j+1]=A[j];					//所有大于temp的元素都向后挪位
			A[j+1]=temp;						//复制到插入位置
		}
}

带“哨兵”

void InsertSort(ElemType A[],int n){
	int i,j;
	for(i=2;i<=n;i++)					//依次将A[2]~A[n]插入到前面已排好序序列
		if(A[i]<A[i-1]){				//若A[i]关键码小于其前驱,将A[i]插入有序表
			A[0]=A[i];					//复制为哨兵,A[0]不存放元素
			for(j=i-1;A[0]<A[j];--j)	//从后往前查找待插入位置
				A[j+1]=A[j];			//向后挪位
			A[j+1]=A[0];				//复制到插入位置
		}
}

山东师范大学2016年硕士研究生入学考试试题

1、设计一个算法,从一给定的顺序表L中删除下标i到j(i<=j,包括i,j)之间的所有元素,假定i,j都是合法的。

使用单链表存储顺序表L中的所有值,要删除i到j之间的所有元素,因为下标i到j是连续的,故可以将第i个结点的下一个指针next指向下标为j+1的结点。

bool Del_List(SqList &l,ElemType i,ElemType j){
	//删除顺序表L中下标在i到j之间(要去i<=j)的所有元素
	int m,k=0;
	if(i>j || L.length==0)
		return false;		//顺序表为空或当下标i>j时,返回
	for(m=i; m<=j; m++)
		k++;
	L.data[i]=L.data[j+1];		//当前元素移动到下标为i的结点位置
	L.length-=k;		//长度减小
	return true;
}

2、设有一元素为整数的线性表L,存放在一维数组A[0…n-1]中,设计一个算法,以A[n-1]为参考值,将该数组分为左右两部分,其中左半部分的元素均小于等于A[n-1],右半部分的元素均大于等于A[n-1],A[n-1]位于这两部分之间,要求结果扔存放在A数组中。

算法思路:类似于“快速排序”的一趟排序,经过一趟排序后A[n-1]确定了其最终位置。

void Partition(ElemType A[]. int low, int high){
	ElemType pivot = A[high];		//将当前表中的第n个(即下标为n-1)的元素设为枢轴,对表进行划分
	while(low<high){		//循环跳出的条件
		while(low<high && A[low]<=pivot)
			++low;
		A[high] = A[low];		//将比枢轴大的元素移动到右端
		while(low<high && A[high]>=pivot)
			--high;
		A[low] = A[high];		//将比枢轴小的元素移动到左端
	}
	A[high] = pivot;		//枢轴元素(即下标为n-1的元素)存放的最终位置
}

3、设计一个算法,对给定的一个整型m*n矩阵A,统计这个矩阵中具有下列特征的元素个数并输出它们的坐标及数值:它们既是所有行中的最小值,又是所在列中的最小值。

算法思路:只需要找出某行中的最小值,然后再判断其是否为该列的最小值即可。

void Find_Min(int A[][MAXSIZE], int m, int n){
	int rowMin;
	int count = 0;		//计数器,记录符合条件的元素数目
	for(int i=0; i<m; i++){			//遍历行
		rowMin = A[i][0];		//将每行的第一个元素赋予为其所在行的最小值
		int x = i, y = 0;		//记录行最小值的行下标和列下标
		for(int j=0; j<n; j++){			//遍历列
			if(A[i][j] < rowMin){
				rowMin = A[i][j];
				x = i;
				y = j;
			}
		}
		int temp = rowMin;
		for(int q=0; q<m; q++){
			if(A[q][y] < rowMin)
				rowMin = A[q][y];
		}
		if(temp == rowMin){
			count++;
			printf("%d,[%d][%d]\n",temp,x,y);
	}
	printf("既是所在行又是所在列最小值的元素的个数为:%d\n",count);
}

4、设一棵二叉树以二叉链表为存储结构,结点结构为lchild|data|rchild。设计一个算法,求在前根序列中处于第k个位置的结点。

设置一个全局变量i记录已访问过的结点的序号,其初值是根结点在先序序列中的序号,即1。

int i=1;
ElemType PreNode(BiTree b, int k){
	if(b==NULL)
		return '#';		//空结点,返回特殊字符
	if(i==k)
		return b->data;		//相等,则当前结点即为第k个结点
	i++;		//下一个结点
	ch = PreNode(b->lchild, k);			//左子数中递归寻找
	if(ch!=‘#’)
		return ch;		//在左子树中,则返回该值
	ch = PreNode(b->rchild, k);
		return ch;		//在右子树中递归寻找
}

山东师范大学2015年硕士研究生入学考试试题

1、设计一个算法,将一个头结点为A的单链表(其数据域为整数)分解为两个单链表A和B,使得A链表只含有原来链表中的data域为奇数的结点,而B链表只含有原来data域为偶数的结点,且保持原来相对顺序。

算法思路:根据结点的数据域奇偶性来判断插入哪个链表中,使用尾插法来保持顺序不变。

LinkList DisCreat_l(LinkList &A){
	B=(LinkList)malloc(sizeof(LNode));		//创建B表表头
	B->next=NULL;			//B表初始化
	LNode *ra=A, *rb=B;			//ra和rb将分别指向将创建的A表和B表的尾结点
	p=A->next;
	while(p!=NULL){
		if(p->data%2==0){
			rb->next=p;		//在B的表尾插入新结点
			rb=p;		//rb指向新的尾结点
		}
		else{
			ra->next=p;
			ra=p;		//在A表尾插入新结点
		}
		p=p->next;			//将p恢复为指向新的待处理结点
	}
	ra->next=NULL;
	rb->next=NULL;
	return A;
	return B;
}

2、设有浮点型数组A[0···n],设计求数组A中最大值的递归算法。

int i=0, j=n;
float FindMax(flaot A[], int i, int j){
	float max;
	if(i==j)
		return A[i];
	else{
		max=FloatMax(A, i+1, j);
		if(A[i]>max)
			return A[i];
		else
			return max;
	}
}

3、在二叉树中查找值为x的结点。假设值为x的结点不多于一个,打印出值为x的结点的所有祖先。

算法思路:采用非递归后序遍历,最后访问根结点,访问到值为x的结点时,栈中所有元素均为该结点的祖先,依次出栈打印即可。 王道书P163

typedef struct{
	BiTree t;
	int tag;
}stack;			//tag=0表示左子女被访问,tag=1表示右子女被访问
void Search(BiTree bt,ElemType x){
	//在二叉树bt中,查找值为x的结点,并打印其左右祖先
	stack s[];
	top=0;
	while(bt!=NULL||top>0){
		while(bt!=NULL&&bt->data!=x){
			s[++top].t=bt;
			s[top].tag=0;
			bt=bt->lchild;			//沿左分支向下
		}
		if(bt->data==x){
			printt("所查结点的所有祖先结点的值为:\n");
			for(i=1;i<=top;i++)
				printf("%d",s[i].t->data);
			exit(1);
		}
		while(top!=0 && s[top].tag==1)
			top--;				//退栈(空遍历)
		if(top!=0){
			s[top].tag=1;
			bt=s[top].t->rchild;		//沿右分支向下遍历
		}
	}
}

4、设有一组初始记录关键字序列(K1,K2,…,Kn),要求设计一个算法能够在O(n)的时间复杂度内将线性表划分成两部分,其中左半部分的每个关键字均小于Ki,右半部分的关键字均大于等于Ki。

void QuickPass(int K[], int s, int t){
	int i=s;j=t,x=K[s];
	while(i<j){
		while(i<j && K[i]>x){
			j=j-1;
			if(i<j){
				K[i]=K[j];
				i=i+1;
			}
		}
		while(i<j && K[i]<x){
			i=i+1;
			if(i<j){
				K[j]=K[i];
				j=j-1;
			}
		}
	}
	K[i]=x;
}

山东师范大学2011年硕士研究生入学考试试题

1、设计在单链表中删除值相同的多余结点的算法。

void DeleteSame(LinkList *L){
	LNode *p,*q,*s;
	p=(*L)->next;
	for(p;p!=NULL;p=p->next){
		s=p;		//s指向要删除结点的前驱
		for(q=p->next;q!=NULL;){
			if(q->data==p->data){
				s->next=q->next;
				free(q);
				q=s->next;
			}
			else{
				s=q;
				q=q->next;
			}
		}
	}
}

2、设计一个求结点x在二叉树中的双亲结点算法。

typedef struct BiTNode{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode *BiTree;
BiTNode *parent(BiTree T,ElemType x){
	BiTNode *ans;
	if(T==NULL)
		return NULL;
	if(T->lchild==NULL&&T->rchild==NULL)
		return NULL;
	else{
		if(T->lchid->data==x||T->rchild->data==x)
			return T;
		else{
			ans=parent(T->lchid,x);
			if(ans)
				return ans;
			ans=parent(T->rchild,x);
			if(ans)
				return ans;
			return NULL;
		}
	}
}

3、写一个算法利用折半查找方法在一个有序表中插入元素x,且保持表的有序性。

void InsertSort(int num[],int n,int x){
	int mid;
	int low=0,high=n-1;
	int flag=0;			//标记是否发生插入
	int pos;
	while(low<=high&&flag==0){
		mid=(low+high)/2;
		if(num[mid]==x)
			flag=1;		//若关键字等于x,则将flag置为1
		else if(num[mid]>x)
			high=mid-1;
		else
			low=mid+1;			
	}
	if(flag==1)
		pos=mid;
	else
		pos=low;		//若x最大,且不在原有序表中,则low指向最后一个元素下标的下一个位置
	for(int i=n-1;i>pos;i--)
		num[i+1]=num[i];
	num[pos]=x;
}

4、写出冒泡排序算法。

void swap(int &a,int &b){
	int temp=a;
	a=b;
	b=temp;
}
void BubbleSort(ElemType A[],int n){
	for(i=0;i<n-1;i++){
		bool flag=false;
		for(int j=n-1;j>i;j--)
			if(A[j-1]>A[j]){
				swap(A[j-1],A[j]);
				flag=true;
			}
		if(flag==false)
			return;
	}
}

标签:结点,return,试题,int,山东师范大学,next,算法,入学考试,NULL
来源: https://blog.csdn.net/weixin_47574063/article/details/109956164