东北大学计算机专业研究生入学考试2008年真题

//http://www.cskaoyan.com/thread-756-1-1.html

/*-------------------------------------------------------C语言部分------------------------------------------------------------------*/
/*二.输入N个数,编写一个递归函数,求出N个数中的最大值。*/
int findMax(int n)
{
	int max;  //记录前n-1个数中的最大值
	int num;   //读取的第n个值
	
	if(n == 1)  //求前1个数中的最大值
	{
		scanf("%d",&num);
		return num;
	}
	else
	{
		//求前n个数的最大值
		max = findMax(n - 1);  //step1:求前n-1个数的最大值
		scanf("%d",&num);   //step2:读取第n个数
		if(num > max)    //step3:返回num ,max之间的最大值
			max = num;
		else
			return max;
	}
}

/*三.编写函数str(s,t),返回字符串s在t中出现的次数。*/
#include <stdio.h>
#include <stdlib.h>
int findsub(char* src, char* s)
{    
	char *ptr = src, *p = s;    //定义两个指针   
	char *ptr2 = src+strlen(src), *prev=NULL;    //ptr2为src的末位置指针    
	int len = strlen(s), n = 0;        //子串的长度和计数器  
	for(;*ptr;ptr++)    //循环整个串    
	{      
		if(ptr2-ptr < len)    //如果一开始子串就大于src,则退出   
			break;     
		for(prev = ptr;*prev == *p;prev++,p++)    //寻找第一个相等的位置,然后从此位置开始匹配子串     
		{      
			if(*(p+1) == 0 || *(p+1) == 10)    //如果已经到了子串的末尾      
			{         
				n++;    //自增       
				p=s;    //重新指向子串       
				break;//退出     
			}     
		}   
	}   
	return n;
}
int main(void)
{    
	char a[81],b[81];        //定义两个字符数组  
	printf("输入原字符串:");  
	fgets(a,81,stdin);    //输入   
	printf("输入子字符串:");   
	fgets(b,81,stdin);  
	printf("找到:%d\n",findsub(a,b));    
	return 0; 
}

/*四.N个班参加比赛,每个班人数不同,要求输入人名和分数,按照每班平均分排序。*/ 


/*--------------------------------------------------------数据结构部分---------------------------------------------------------------*/
/*二.已知一个带头结点的双向链表L,包括以下几个域,data存放数据,prior指向前一结点,next指向后一结点,freq记录结点访问
     频度,初始化为0,每访问一次加一。
	 编写函数Locate(L,x)访问链表中数据为X的结点,并对该结点调整,使其位于频度大于它的之后,小于它的之前,使频度越大的
	 越靠近头结点。*/
typedef struct DLinkList  //双链表结点类型
{
	ElemType data;
	struct DLinkList *prior;
	struct DLinkList *next;
	int freq;
}DLinkList;

int Locate(DLinkList *L,int x)
{
	DLinkList *p = L->next,*q;
	while(p != NULL && p->data != x)
		p = p->next;
	if(p == NULL)
		return 0;
	else
	{
		p->freq++;
		q = p->prior;
		if(q != L)
		{
			while(q != L && q->freq < p->freq)
				q = q->prior;
			p->prior->next = p->next;
			if(p->next != NULL)
				p->next->prior = p->prior;
			p->next = q->next;
			if(q->next != NULL)
				q->next->prior = p;
			q->next = p;
			p->prior q;
		}
		return 1;
	}
}
	 
/*三.树的每一层的结点数为此层的宽度,二叉树的宽度定义为各层宽度的最大值。要求写一算法,返回二叉树的宽度,并输出此层的叶
     结点。对树只能遍历一次。*/
//采用分层遍历的方法求出所有结点的层编号,然后求出各层的结点总数,通过比较找出层结点总数最多的值。
int BTWidth(BTNode *b)
{
	struct
	{
		int lno;      //结点的层次编号
		BTNode *p;    //结点指针
	}Qu[MaxSize];     //定义顺序非环形队列
	
	int front = 0,rear = 0;   //定义队首队尾指针
	int lnum,max,i,n;
	if(b != NULL)
	{
		rear++;
		Qu[rear].p = b;     //根结点指针入队
		Qu[rear].lno = 1;   //根结点的层次编号为1
		while(rear != front)   //队列不为空
		{
			front++;
			b = Qu[front].p;    //队头出队
			lnum = Qu[front].lno;
			if(b->lchild != NULL)   //左孩子入队
			{
				rear++;
				Qu[front].p = b->lchild;
				Qu[front].lno = lnum + 1;
			}
			if(b->rchild != NULL)    //右孩子入队
			{
				rear++;
				Qu[front].p = b->rchild;
				Qu[front].lno = lnum + 1;
			}
		}
		printf("各结点的层编号:\n");
		for(i = 1;i <= rear;i++)
			printf(" %c,%d\n",Qu[i].p->data,Qu[i].lno);
		max = 0; lnum = 1;i = 1;
		while(i <= rear)
		{
			n = 0;
			while(i <= rear && Qu[i].lno == lnum)
			{
				n++;
				i++;
			}
			lnum = Qu[i].lno;
			if(n > max)
				max = n;
		}
		return max;
	}
	else
		return 0;
}

/*四.无向图以邻接表存储,删除结点I到J的一条弧。*/
void DeletEdge(AdjList g,int i,j)
{ 
	//先删除顶点i的边(i,j)
	p = g[i].firstarc; 
	pre = NULL;  //pre是前驱指针
	
	while (p)//删顶点i 的边结点(i,j)
	if (p->adjvex == j)
	{ 
		if(pre == NULL) 
			g[i].firstarc = p->next;
		else 
			pre->next = p->next; 
		free(p);//释放结点空间
	} 
	else
	{
		pre = p; 
		p = p->next;//沿链表继续查找 
	}
	
	//删顶点j 的边结点(j,i)
	p = g[j].firstarc; 
	pre = NULL; 
	while(p) 
	if (p->adjvex == i) 
	{ 
		if(pre == NULL)
			g[j].firstarc = p->next; 
		else 
			pre->next = p->next;
		free(p);//释放结点空间 
	} 
	else
	{ 
		pre = p; 
		p = p->next;//沿链表继续查找 
	}
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值