/*-------------------------------------------------------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
}
东北大学计算机专业研究生入学考试2004年真题
最新推荐文章于 2021-04-14 21:57:18 发布