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

/*-------------------------------------------------------C语言部分------------------------------------------------------------------*/
/*三.设有算术表达式,其中包含有大括号”{ " " }"  中括号"[" "]" 小括号 "(" ")",试编写一个递归函数,判断表达式中的括号是否匹配*/
typedef char StackEntry;
int Check( )
{
    STACK S;        //定义栈结构S
    char ch;
	InitStack(&S);      //初始化栈S
	while ((ch = getchar()) != '\n')
	{   
		//以字符序列的形式输入表达式
		switch (ch)
		{
			case (ch == '(' || ch == '[' || ch == '{'):
				Push(&S,ch);break;  //遇左括号入栈
			//在遇到右括号时,分别检测匹配情况
			case (ch == ')'):
				if (StackEmpty(S))
					retrun FALSE;     
                else 
				{
					Pop(&S,&ch);
                    if (ch != '(') 
						return FALSE;
				}
                break;
			case (ch == ']'): 
				if (StackEmpty(S))
					retrun FALSE;
                else
				{
					Pop(&S,&ch);
					if (ch != '[')
						return FALSE;
				}
                break;
			case (ch == '}'): 
				if (StackEmpty(S)) 
					retrun FALSE;
                else 
				{
					Pop(&S,&ch);
                    if(ch != '{') 
						return FALSE;
				}
                break;
			default:break;
		}
	}
	if (StackEmpty(S)) 
		return TRUE;
	else 
		return FALSE;
}

/*四.设有一个整数序列,有n个整数(0<n<100).试编写程序,根据整数的大小,对其从小到大进行连续编号。
 要求:1 不能改变序列的顺序;  2相同的整数只保留一个。
 例如: 输入序列为:5,3,5,7,8,3,5,10,6    输出为: 序列-- 5,3,7,8,10,6   编号-- 2,1,4,5,6,3*/
#include<stdio.h>
void main()
{
	struct n
	{
		int di;  //存放整数
		int k;   //存放di的编号
	}num[100] = {{0,0}}; //全部置零
	
	int i = 0,j = 0,t,m,temp;
	scanf("%d",&temp);

	while( temp != -1)//输入整数序列,输入-1表示结束,整个循环结束后,i的值就是序列中的整数个数
	{  
		while(j <= i) 
		{    
			//从数组开头查询,是否有与temp相等的数字
			if(temp != num[j].di)
				j++;
			else
				break;
		}
		if(j > i)//没有与temp相等的数字,temp加入数组
		{   			
			num[j-1].di = temp;
			i++;
			j = 0;       //j指向数组开头,做下一次判断
			scanf("%d",&temp);        
		}
		else //有与temp相等的数字,j指向数组开头,做下一次判断
		{
			j = 0; 
			scanf("%d",&temp);
		}     
	}

	for(j = 1;j <= i;j++) //开始编号
	{            
		for(t = 0;t < i;t++)        //找到第一个没有编号的数,这个循环结束后,t指向序列中最前面的没有编号的数.
			if(num[t].k != 0)   //如果条件成立,说明此数已经编号,跳过!
			else
				break;
		for(m = 0;m < i;m++)  //在没有编号的数里面寻找最小的,让t指向它
		{
			if((num[m].di < num[t].di) &&num[m].k == 0)
				t = m;
			else 
				continue;
		}
		num[t].k = j;     //编号
	}

	for(j = 0;j < i;j++)   //输出序列
	printf("%d  ",num[j].di);
	printf("\n");

	for(j = 0;j < i;j++)   //输出对应的编号
	printf("%d  ",num[j].k);
	printf("\n");
}

/*五.设有两个有序链表,一为升序,一为降序。试编写程序,将这两个链表合并为一个序链表。*/
//假设升序的链表为链表1,降序的链表为链表2
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h> 
typedef struct list_node
{
	int data;
	struct list_node *next;
}list_node;

list_node *list1 = NULL; //链表1头结点
list_node *list2 = NULL; //链表2头结点

void list_print(const list_node *p)//打印该链表函数
{
	if(p == NULL)
		return;
	while(p != NULL)   
    {
		printf("%d ",p->data);
		p = p->next;
    }
	printf("\n");
}

void list_create(list_node* &head, int data[], int N)//创建链表
{
	if(data == NULL)
		return;
	int i;
	list_node *p;
	p = (list_node*)malloc(sizeof(list_node));
	p->data = data[0];
	p->next = NULL;
	head = p; 
	for(i = 1;i < N; i++) 
	{
		p->next = (list_node*)malloc(sizeof(list_node));
		p->next->data = data;
		p->next->next = NULL;
		p = p->next;
	}
}

void list_reverse(list_node* &head)  //使链表反序
{
	if(head == NULL) //如果head1为空,则返回
		return ;
	list_node *p,*q;
	q = head;
	p = head->next;

    while(p!=NULL)
    {
		head->next=p->next; //将头指针的next指向p的下一个节点
		p->next=q;          //将p的next值反指向它的前一个节点q
		q=p;                //q移向p的位置
		p=head->next;       //p移向它的下一个位置
    }
    head = q;
}

void list_destroy(list_node *head)  //销毁函数
{
	list_node *pmove = NULL,*pdel = NULL;
	pmove = head;

	while(pmove!=head)
    {
		pdel = pmove;
		free(pdel);  
		pmove = pmove->next;
    }
}

list_node* merge_two_list() //合并链表1和链表2
{
	list_reverse(list2);    //反转链表使之与链表1一样升序排列
	list_node *list_merged;  //和并后的链表
	list_node *p1,*p2,*p0;      
	list_merged = (list_node*)malloc(sizeof(list_node));
	list_merged->data = 0;
	list_merged->next = NULL;
	p0 = list_merged;
	p1 = list1;
	p2 = list2;
	while(p1 != NULL && p2 != NULL)
	{
		if(p1->data < p2->data)
		{
		   p0->next = (list_node*)malloc(sizeof(list_node));
		   p0->next->data = p1->data;
		   p0->next->next = NULL;
		   p0 = p0->next;
		   p1 = p1->next;
		}
		else
		{
		   p0->next = (list_node*)malloc(sizeof(list_node));
		   p0->next->data = p2->data;
		   p0->next->next = NULL;
		   p0 = p0->next;
		   p2 = p2->next;
		}
	}
	while(p1!=NULL)
	{
	    p0->next = (list_node*)malloc(sizeof(list_node));
	    p0->next->data = p1->data;
	    p0->next->next = NULL;
	    p0 = p0->next;
	    p1 = p1->next;
	}
	while(p2 != NULL)
	{
		p0->next = (list_node*)malloc(sizeof(list_node));
	    p0->next->data = p2->data;
	    p0->next->next = NULL;
	    p0 = p0->next;
	    p2 = p2->next;
	}
	return list_merged;
}

/*--------------------------------------------------------数据结构部分---------------------------------------------------------------*/
/*二.某商店有一皮手机,按价格从高价到底构成一个单链表,结点包括数量、价格、指针。现新到n台价格不同的手机,编写将新到手机插入到原链表中的算法。*/
//定义此单链表的结点结构:
typedef  struct  Lnode
{
    int  number;  //数量域
    int  value;   //价格域
    struct  Lnode *next;  //指针域
}Lnode,*Linklist;
void  insert_link(Linklist &L, int n )
{
    //将新到n台价格不同的手机插到有序链表中
  for(i = 1;i <= n; i++)
	{
        scanf(&price);     //读入每台手机价格
    s = (Linklist)malloc( sifeof(Lnode) );
        s->value = price;
		s->number = 1;
		p = L->next;
		       
		if(p->value < s->value)//插入首部
		{ 
      s->next = L->next; 
			L->next = s;
        }
        else
		{
            while(p->next && (p->next->value > s->value))
                p = p->next;
            if(!p->next) //插入表尾
			{
        s->next = p->next;
				p->next = s;
            } 
            else if(p->next->value = s->value)
                p->next->number++;
			else
			{
				s->next = p->next;
				p->next = s;
			}
		}
	}//for
}

/*三.假设哈希函数为H(key),编写用链地址解决冲突的哈希表的插入和删除算法。*/
(1)//哈希表插入,用链地址解决冲突
void Insert_HS(HashTable &H,keytype key)
{
	i = H(key); //获得哈希地址
	if(H[i] == NULL)
	{
		s = (Linklist)malloc(sizeof(Lnode));
		s->data = key;
		s->next = H[i];
		H[i] = s;
	}//if
	else
	{
		//在链表中查找key
		p = H[i];
		while(p && p->data != key)
			p = p->next;
		if(p->data == key)
			exit(1);
		else
		{
			//插入表头
			s = (Linklist)malloc(sizeof(Lnode));
			s->next = H[i];
			H[i] = s;
		}//else
	}//else
}

(2)//哈希表删除,用链地址解决冲突
void Delete_HS(HashTable &H,keytype key)
{
	i = H(key); //获得哈希地址
	if(H[i] == NULL) 
		exit(1);
	p = H[i];
	q = p; //p为工作指针,q为p前趋
	while(p && p->data != key)
	{
		//查找
		q = p;
		p = p->next;
	}//while
	
	if(!p)  
		exit(1);
	if(q == H[i])
	{
		//key为第一结点
		H[i] = p->next;
		free(p);
	}//if
	else 
	{
		q->next = p->next;
		free(p);
	}//else
}

/*四.设用输入广义表表示的字符串来创建二叉链表结构的二叉树,具体规定如下:广义表的表名作为树的根结点,每个结点的左子树和右子树用逗号分割,
     若仅有右子树,则逗号不能省略,以特殊符号'$'表示广义表的结尾。
     (1)若输入的字符串为A(B(C),D(E(,F),G)),画出所表示的二叉树。
     (2)实现用上述方法创建二叉树的算法。*/
(1)//画图我就不画了,你自己画吧,不难
(2)//用栈来实现
void CreatTree(BiTree &T ,char *str)
{
	// 生成二叉树
	BiTree stack[maxsize],p;
	int k,j = 0,top = -1;//j为str指针,top为栈顶指针
	T = NULL; //初始化
	char ch = str[j];
	while(ch != '$')
	{
		switch(ch)
		{
		    case '(':
				top++;
				stack[top] = p;  //入栈
			    k = 1;  //k=1,为左孩子	
				break;
		    case ')':
				top--;
				break; //出栈	
			case ',':
				k = 2;
				break; //k=2,为右孩子
			default:
				p = (BiTree)malloc(sizeof(BTNode));
				p->data = ch;
				p->lchild = p->rchild = NULL;
				if(T == NULL)
					T = p;//创建根结点
				else 
				{
					switch(k) 
					{
					    case '1':
							stack[top]->lchild = p;
					        break;
					    case '2': 
							stack[top]->rchild = p;
					        break;

				    }
				}
		}//switch
		j++; 
		ch = str[j];
 	}//while
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值