Advertisement

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

阅读量:
复制代码
 /*---------------------------------数据结构部分---------------------------------*/

    
 /*二.设有一个正整数序列组成的有序单链表(按递增次序有序,且允许有相等的整数存在),试编写能实现下列功能的算法:(要求用最少的时间和最小的空间)
    
 (1)确定在序列中比正整数x大的数有几个(相同的数只计算一次,如序列(20,20,17,16,15,15,11,10,8,7,7,5,4)中比10大的数有5个);
    
 (2)在单链表中将比正整数x小的数按递减次序排列;
    
 (3)在单链表中将比正整数x大的偶数从单链表中删除;*/
    
  void  exam(Linklist La,int,x)
    
  {
    
     p = La->next;
    
 	q = p;    //p为工作指针,q指最小元素
    
 	int k = 0;          
    
     pre = la;  
    
 	la->next = NULL;    
    
     while( p && p->data < x)
    
 	{ //比x小的数递减
    
     r = p->next;
    
 		p->next = La->next; 
    
     La->next = p; 
    
 		p = r ;   //置逆
    
     } 
    
 	q->next = p;   
    
     pre = q;   //重新链接
    
     while(p->data = x) 
    
 	{  //  考察等于x的情况
    
     pre = p; 
    
 		p = p->next; 
    
     }
    
     while(p)
    
 	{ // k为计数器
    
     k++;  
    
 		x = p->data;    //避免重复计算
    
     if(x%2 == 0)
    
 		{   //删除偶数
    
 			while(p->data == x)
    
 			{ // 考察等于x的情况
    
             u=p ;  
    
 				p=p->next; 
    
 				free(u);
    
         } 
    
         pre->next=p; 
    
     } 
    
     else// 处理奇数
    
     {
    
 			while(p->data == x)
    
 			{
    
             pre->next = p;
    
 				pre = p; 
    
 				p = p->next;
    
         } 
    
 		}
    
     } 
    
 } 
    
  
    
 /*三.设T是一棵满二叉树,编写一个将T的先序遍历序列转换为后序遍历序列的递归算法。
    
 对于满二叉树,已知任一遍历序列可唯一确定一棵二叉树,即可将任一遍历序列转换为另一遍历序列。*/
    
 void  pretopost(ElemType pre[],ElemType post[],int L1,int H1,int L2,int H2)//H1为主段,L1为序列位置
    
 {     
    
     if(H1>L1)
    
 	{
    
     post[ H2]=pre[L1]; // 根结点
    
     half=(H1-L1)/2;
    
     pretopost(pre ,post, L1+1, L1+half, L2+half-1);
    
     pretopost(pre, post, L1+half+1 ,H1, L2+half, H2-1)
    
     } //if
    
 } // preropost
    
  
    
 /*四.2.写出后序线索二叉树的非递归遍历算法。*/
    
 void  PreorderTraverse_Thr(BiThrTree T)// T指向头结点,T的左链指向根结点.
    
  {
    
     p=T→lchild;
    
     while(p!=T)
    
 	{
    
     printf(p->data);
    
     if(p->rtag == 0)
    
         p = p->rchild;
    
     else 
    
 			p = p->lchild;
    
     } // while
    
 } //PreorderTraverse_Thr
    
  
    
 /*五.在有向图G中,如果r到G的每个结点都有路径可达,则称结点r为G的根结点,编写一个算法完成下列功能:
    
 (1) 建立有向图G的邻接表存储结构:
    
 (2) 判断有向图G是否有根,若有,则打印出所有根结点的值。*/
    
 (1)void CreatALG(ALGraph &G)
    
  {
    
     // 建立有向图的邻接表存储结构
    
     int i;
    
 	ArcNode *p;
    
     scanf(&G->vexnum, &G->arcnum);
    
     for(i = 0;i < G->vexnum;i++)
    
 	{
    
     scanf((&G->ver[ i ].data);
    
     G->ver[ i ].firstarc = NULL;
    
     } //for
    
     for(i = 0; i < G->arcnum; i++)
    
 	{
    
     scanf(&v1,&v2);
    
     j = Locatevex(G,v1);
    
 		k = Locatevex(G,v2);   // 确定v1,v2在G中位置
    
     p = (ArcNode)malloc(sizeof(ArcNode));
    
     p->adjvex = k;
    
     p->next = G.ver[ j ].firstarc;
    
     G.ver[ j ].Firstarc = p;
    
     } //for
    
 } //CreatALG
    
  
    
 (2)void DfsTraverse(ALGraph G) 
    
 {
    
     //利用深度优先搜索,判断有向图G是否有根结点。
    
     int  visited[maxsige],count; //count为记录结构的顶点数。
    
     for(v = 0;v < G.vexnum; v++)
    
 	{
    
 		for(v = 0;v < G.vexnum ; v++) 
    
 			visited[ v ] = 0;
    
     count = 0; 
    
 		DFS(G,v)  ;
    
 		if(count == G.vexnum) 
    
 			printf(G.ver[ v ].data);
    
     } //for
    
 } //DfsTraverse
    
  
    
 void DFS(ALGraph G,int v) 
    
 {
    
     //从第v个顶点出发递归地深度优先遍历图G
    
     visited[ v ] = 1; 
    
 	count++;
    
     for(p = G.vertices[ v ].firstarc; p; p = p->nextarc)
    
 	{
    
     w = p->adjvex;
    
     if(!visited[ w ])
    
     } //for
    
 } // DFS
    
  
    
 /*六.对下面的关键字集(30,15,21,40,25,26,36,37),若查找表的装填因子为0.8,采用线性探测再散列解决冲突,做:
    
 (1)设计哈希函数;
    
 (2)画出哈希表;
    
 (3)计算查找成功和查找失败的平均查找长度;
    
 (4)写出将哈希表中某个数据元素删除的算法;*/
    
 (4)将删除后的空间置标记为'EMPTY'
    
 Void HSDelete(HashTable &H,KeyType key)
    
 {
    
     // 删除哈希素中等于key的关键字,用线性探测再散列解决冲突
    
     i = H(key );  //  取得哈希地址
    
     if(H[ i ]==Null)  
    
 		exit(1);
    
     if(H[ i ]==key)
    
 	{
    
     e = H [ i ];   
    
 		H[ i ] = EMPTY;
    
     } //if
    
     else
    
 	{
    
     di=1;
    
 		j=(H(key)+di)%m;   // m 为表长
    
     while(H[ j ]&&j != i)
    
 		{
    
         di=di+1;
    
         j=((H(key)+di)%m;
    
     } //while
    
 		if(H[ j ] == Null)
    
 			exist(1);
    
     else if(j = i)
    
 			exist(1);
    
     else if(H[ j ] == key)
    
 		{
    
         e=H[ j ];
    
         H[ j ]=EMPTY;
    
     } 
    
     } //else
    
 } //HSDelete
    
  
    
 /*----------------------------------C语言部分------------------------------*/
    
 /*三.编写一个函数,求字符串a和b的最长公共子串。(不能使用字符串标准函数)*/
    
 #include<string.h>
    
 #include<stdlib.h>
    
 #include<stdio.h>
    
  
    
 #define M 100
    
  
    
 char* LCS(char left[],char right[])
    
 {   
    
     int lenLeft = strlen(left),lenRight = strlen(right);
    
 	int start,end = 0,len = 0,i,j,k;//start公共子串的起始点,end公共子串的终止点,len公共子串的长度
    
     char *c, *p;    
    
     c = (char *)malloc(lenRight);
    
 	for(i = 0;i < lenLeft;i++)//串1从前向后比较
    
     {  
    
 		for(j = lenRight-1;j >= 0;j--)//串2从后向前比较                                       
    
 		{   
    
 			if(left[i] == right[j])
    
         {   
    
 				if(i == 0||j == 0)
    
                 c[j] = 1;
    
             else
    
 					c[j] = c[j-1]+1;
    
         }
    
         else
    
             c[j] = 0;
    
  
    
         if(c[j] > len)
    
         { 
    
 				len = c[j];
    
             end = j;
    
         }
    
     }
    
     }
    
  
    
     start = end-len+1;
    
     p = (char*)malloc(len+1);//数组p记录最长公共子串
    
     for(i = start; i <= end;i++)
    
     {    
    
 		p[i-start] = right[i];
    
     }
    
     p[len] = '\0';
    
     return p;
    
 }
    
 void main()
    
 {  
    
 	char str1[M],str2[M];
    
     printf("请输入字符串1:");
    
     gets(str1);
    
     printf("请输入字符串2:");
    
     gets(str2);
    
     printf("公共子串为:");
    
     printf("%s\n",LCS(str1,str2));
    
 }
    
  
    
 /*四.编写一个函数,将数组a按每行的最大值从小到大对数组的行进行排序*/
    
 #define MAXSIZE 10
    
 void changeRow(int i, int j, int a[][MAXSIZE], int n)
    
 {
    
 	if(i == j)
    
 		return;
    
 	for(int k = 0; k < n; k++)
    
 	{
    
 		int temp;
    
 		temp = a[i][k];
    
 		a[i][k] = a[j][k];
    
 		a[j][k] = temp;
    
 	}
    
 }
    
 void Sort(int a[][MAXSIZE], int m, int n)
    
 {
    
 	int MaxKey[MAXSIZE];
    
 	int i,j;
    
 	for(i = 0; i < m; i++)
    
 	{
    
 		iMax = a[i][0];
    
 		for(j = 1; j < n; j++)
    
 		{
    
 			if(a[i][j] > iMax)
    
 			{
    
 				iMax = a[i][j];
    
 			}
    
 		}
    
 		MaxKey[i] = iMax;
    
 	}
    
 	for(i = 0; i < m; i++)//用选择排序,每次找最大的
    
 	{
    
 		iMax = MaxKey[0];
    
 		k = 0;
    
 		for(j = 0; j < m-i; j++)
    
 		{
    
 			if(iMax < MaxKey[j])
    
 			{
    
 				iMax = MaxKey[j];
    
 				k = j;
    
 			}
    
 		}
    
 		changeRow(k, m-i-1, a, n);
    
 		temp = MaxKey[m-i-1];
    
 		MaxKey[m-i-1] = MaxKey[k];
    
 		MaxKey[k] = temp;
    
 	}
    
 }
    
  
    
 /*五.编写一个递归函数,判断两棵二叉树是否相似。如果两棵二叉树s和t相似,那么或者它们的左右子树都相似,或者s和t都为空。*/
    
 int IsEqual(BiTree s, BiTree t)
    
 {
    
 	if((!s)&&(!t))
    
 		return 1;
    
 	else
    
 	{
    
 		if((s)&&(!t))
    
 			return 0;
    
 		if((!s)&&(t))
    
 			return 0;
    
 		if(IsEqual(s->lchild, t->lchild))
    
 		{
    
 			if(IsEqual(s->rchild, t->rchild))
    
 				return 1;
    
 			else
    
 				return 0;
    
 		}
    
 		else
    
 			return 0;
    
 	}
    
 }
    
  
    
 /*六.一个英文文本文件,仅由英文字母、空格、逗号、句号和换行符组成,文本中的句子由句号分割。
    
    1.编写一个函数char *getsen(FILE *fp),用于从文本中读取句子。函数返回的是指向一个句子的指针;
    
    2.编写一个程序,当输入一个英文单词,如run时,判断该单词是否在这个文件中。若文件中有这个词,则将包含该单词的所有句子,输出到以该单词命名的.TXT文件中,如run.txt文件。*/
    
    
    
  /*七.接上题,要求用单向链表结构实现:
    
    1.对上题所生成的文件,如run.txt进行统计,统计文件中包含的单词总数、不同单词的数量以及每个单词的词频(即单词出现的次数); 
    
    2.编写一个函数,对单词按词频进行降序排序;
    
    3.输出最后的统计结果*/

全部评论 (0)

还没有任何评论哟~