数据结构上机考试含答案.docx
《数据结构上机考试含答案.docx》由会员分享,可在线阅读,更多相关《数据结构上机考试含答案.docx(43页珍藏版)》请在冰豆网上搜索。
数据结构上机考试含答案
《数据结构》上机练习题
1、设有两个有序序列,利用归并排序将它们排成有序表,并输出。
2、设有一有序序列,从键盘输入一个数,判别是否在序列中,如果在输出“YSE”;否则,将它插入到序列中使它仍然有序,并输出排序后的序列。
3、设有一有序序列,从键盘输入一个数,判别是否在序列中,如果不在,则输出“NO”,否则,将它从序列中删除它,并输出删除后的序列。
4、从键盘输入一组任意数据,建立一个有序链表,并从链头开始输出该链,使输出结果是有序的。
5、从键盘输入一组任意数据,建立一个包含所有输入数据的单向循环链表,并从链表的任意开始,依次输出该链表中的所有结点。
10、设有一个链表,(自己建立,数据从键盘输入),再从键盘输入一个数,判别是否在链表中,如果不在,则输出“NO“,否则,将它从链表中删除,并输出删除后的链表。
11、设有一个链表,(自己建立,数据从键盘输入),再从键盘输入一个数,判别是否在链表中,如果在输出“YSE”,否则,将它从插入到链头,并输出插入后的链表。
12、设有一个链表,(自己建立,数据从键盘输入),再从键盘输入一个数,判别是否在链表中,如果在输出“YSE”,否则,将它从插入到链尾,并输出插入后的链表。
13、编写栈的压栈push、弹栈pop函数,从键盘输入一组数据,逐个元素压入堆栈,然后再逐个从栈中弹出它们并输出。
14、编写栈的压栈push、弹栈pop函数,用它判别()的匹配问题。
15、按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树中序遍历的结果。
16、按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树先序遍历的结果。
17、按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树后序遍历的结果。
18、按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树的总结点数。
19、按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出二叉树叶子结点数。
20、按类似先序遍历结果输入一序列,建立一棵二叉树(算法6、4),输出此二叉树的高度。
21、给出一个无向图的邻接矩阵,输出各个顶点的度。
22、给出一个有向图的邻接矩阵,输出各个顶点的入度与出度。
23、输入一个有序序列,利用折半查找来查找一个数是否在序列中,如在,则输出其位置,否则输出“NO”。
24、用插入排序方法对一组数据进行排序,并输出每趟排序的结果。
25、用选择排序方法对一组数据进行排序,并输出每趟排序的结果。
26、用希尔(SHELL)排序方法对一组数据进行排序,并输出每趟排序的结果。
27、用快速排序方法对一组数据进行排序,并输出每趟排序的结果。
.
答案:
1.#include
#include
#defineN5
#defineNULL0
//链表的存储结构
typedefstructLNode
{
intdata;
structLNode*next;
}LNode,*list;
//顺序创建链表
voidcreatList(list&l,intn)
{
inti;
listp,q;
l=(list)malloc(sizeof(LNode));//开辟头结点
p=l;//指针p指向头结点
for(i=0;i{
q=(list)malloc(sizeof(LNode));//新的结点
scanf("%d",&q->data);
p->next=q;//p的下一个结点指向新开辟的结点q
p=q;//将p指针指向q
}
p->next=NULL;
}
//归并排序
voidmergeList(list&la,list&lb,list&lc)
{//将已经排好序的la,lb中的数重新排列成有序(非递减)
listpa,pb,pc;
pa=la->next;pb=lb->next;
lc=pc=la;//默认将la做为lc的头结点(lb亦可)
while(pa&&pb)
{//让pc接到数据小的结点上,直到pa,pb两者有一指向空结点
if(pa->data<=pb->data)
{pc->next=pa;pc=pa;pa=pa->next;}
else
{pc->next=pb;pc=pb;pb=pb->next;}
}
pc->next=pa?
pa:
pb;//如果最后la有剩余结点,即将其直接加入到lc中,反之将lb的剩余结点加到lc中
free(lb);
}
voidprintList(listl)
{
listp;
p=l->next;
while(p)
{printf("%d",p->data);p=p->next;}
}
voidmain()
{
listla,lb,lc;
printf("创建两个含%d个元素的链表,请输入:
\n",N);
creatList(la,N);
creatList(lb,N);
mergeList(la,lb,lc);
printList(lc);
}
2.#include
#include
#defineN5
#defineNULL0
#defineOK1
#defineERROR0
//链表的存储结构
typedefstructLNode
{
intdata;
structLNode*next;
}LNode,*list;
//创建链表
voidcreatList(list&l,intn)
{
listp,q;
l=(list)malloc(sizeof(LNode));
p=l;
for(inti=0;i{
q=(list)malloc(sizeof(LNode));
scanf("%d",&q->data);
p->next=q;
p=q;
}
p->next=NULL;
}
//判断元素e是否在链表中
intinList(listl,inte)
{
listp;
p=l->next;
while(p)
{
if(p->data==e)
returnOK;//发现在里面,返回真值
p=p->next;//否则指针后移,继续找
}
returnERROR;//未找到,返回假值(没有执行returnOK;语句)
}
//插入元素
voidinsertList(list&l,int&e)
{
listp,q,s;//q为新插入的元素开辟一个存储空间的指针,s为p前一个指针,方便插入
p=l->next;
s=l;
while(p)
{
if(e<=p->data)
{//发现要插入的元素e比后面的小,开辟空间,并将e放入空间的数据域中
q=(list)malloc(sizeof(LNode));
q->data=e;
while(s->next!
=p)s=s->next;//找到p前的一个指针
q->next=p;//画图好好理解--->s--->p--->
s->next=q;//q--->
break;
}
p=p->next;
}
}
//输出链表
voidprintList(listl)
{
listp;
p=l->next;
while(p)
{printf("%d",p->data);p=p->next;}
}
voidmain()
{
listl;
inte;
printf("创建%d个元素的链表,请输入%d个元素:
\n",N,N);
creatList(l,N);
printf("请输入要判断的元素:
");
scanf("%d",&e);
if(inList(l,e))
printf("YES");
else
{
insertList(l,e);
printList(l);
}
}
3.#include
#include
#defineN5
#defineNULL0
#defineOK1
#defineERROR0
//链表的存储结构
typedefstructLNode
{
intdata;
structLNode*next;
}LNode,*list;
//创建链表
voidcreatList(list&l,intn)
{
listp,q;
l=(list)malloc(sizeof(LNode));
p=l;
for(inti=0;i{
q=(list)malloc(sizeof(LNode));
scanf("%d",&q->data);
p->next=q;
p=q;
}
p->next=NULL;
}
//判断元素e是否在链表中
intinsertDeleteList(listl,inte)
{
listp,q;
p=l->next;q=l;
while(p)
{
if(p->data==e)
{
while(q->next!
=p)q=q->next;//找到p前一个结点,方便删除操作
q->next=p->next;//删除结点p
free(p);
returnOK;
}//发现在里面,返回真值
p=p->next;//否则指针后移,继续找
}
returnERROR;//未找到,返回假值(没有执行returnOK;语句)
}
//输出链表
voidprintList(listl)
{
listp;
p=l->next;
while(p)
{printf("%d",p->data);p=p->next;}
}
voidmain()
{
listl;
inte;
printf("创建%d个元素的链表,请输入%d个元素:
\n",N,N);
creatList(l,N);
printf("请输入要判断的元素");
scanf("%d",&e);
if(!
insertDeleteList(l,e))
printf("NO");
else
printList(l);
}
4.#include
#include
#defineN5
#defineNULL0
#defineOK1
#defineERROR0
//链表的存储结构
typedefstructLNode
{
intdata;
structLNode*next;
}LNode,*list;
//创建链表
voidcreatList(list&l,intn)
{
listp,q;
l=(list)malloc(sizeof(LNode));
p=l;
for(inti=0;i{
q=(list)malloc(sizeof(LNode));
scanf("%d",&q->data);
p->next=q;
p=q;
}
p->next=NULL;
}
//链表排序
voidsortList(list&l)
{
listp,q,r;//p标记排序的轮数
intchang;//用于交换结点中的数据
p=l->next;
while(p->next!
=NULL)
{
q=l->next;//每次比较从首结点开始
while(q->next!
=NULL)
{
r=q->next;
if(q->data>r->data)//发现前一个比后一个大,交换数据
{chang=q->data;q->data=r->data;r->data=chang;}
q=q->next;//相邻间下一个比较
}
p=p->next;//下一轮比较
}
}
//输出链表
voidprintList(listl)
{
listp;
p=l->next;
while(p)
{printf("%d",p->data);p=p->next;}
}
voidmain()
{
listl;
printf("创建%d个元素的链表,请输入%d个元素:
\n",N,N);
creatList(l,N);
sortList(l);
printList(l);
}
5.#include
#include
#defineN5
#defineNULL0
#defineOK1
#defineERROR0
//链表的存储结构
typedefstructLNode
{
intdata;
structLNode*next;
}LNode,*list;
//创建链表
voidcreatList(list&l,intn)
{
listp,q;
l=(list)malloc(sizeof(LNode));
scanf("%d",&l->data);//头结点也添加元素,方便输出
p=l;
for(inti=1;i{
q=(list)malloc(sizeof(LNode));
scanf("%d",&q->data);
p->next=q;
p=q;
}
p->next=l;//让最后一个p->next指针指向头结点,构成循环链表
}
//输出链表
voidprintList(listl,intpos)
{
listp,q;
inti;
p=l;
for(i=1;inext;//找到指定位置的前一个位置
q=p->next;
do
{
if(pos==1){printf("%d",p->data);p=p->next;}//如果指定位置为1,即按原样输出
else{p=p->next;printf("%d",p->data);}//不然,p先移到指定的位置,输出其数据
}while(p->next!
=q);//结束条件(p移到的下一个位置不是q,即不是最初的p,完成循环输出)
}
voidmain()
{
listl;
intpos;
printf("创建%d个元素的循环链表,请输入%d个元素:
\n",N,N);
creatList(l,N);
printf("请指明从第几个位置输出循环链表中的元素:
");
scanf("%d",&pos);
while(pos<=0||pos>N)
{
printf("输入的位置不存在,请重新输入...");
scanf("%d",&pos);
}
printList(l,pos);
}
11#include
#include
#defineN5
#defineNULL0
#defineOK1
#defineERROR0
//链表的存储结构
typedefstructLNode
{
intdata;
structLNode*next;
}LNode,*list;
//创建链表
voidcreatList(list&l,intn)
{
listp,q;
l=(list)malloc(sizeof(LNode));
scanf("%d",&l->data);//头结点也添加元素,方便输出
p=l;
for(inti=1;i{
q=(list)malloc(sizeof(LNode));
scanf("%d",&q->data);
p->next=q;
p=q;
}
p->next=l;//让最后一个p->next指针指向头结点,构成循环链表
}
//输出链表
voidprintList(listl,intpos)
{
listp,q;
inti;
p=l;
for(i=1;inext;//找到指定位置的前一个位置
q=p->next;
do
{
if(pos==1){printf("%d",p->data);p=p->next;}//如果指定位置为1,即按原样输出
else{p=p->next;printf("%d",p->data);}//不然,p先移到指定的位置,输出其数据
}while(p->next!
=q);//结束条件(p移到的下一个位置不是q,即不是最初的p,完成循环输出)
}
voidmain()
{
listl;
intpos;
printf("创建%d个元素的循环链表,请输入%d个元素:
\n",N,N);
creatList(l,N);
printf("请指明从第几个位置输出循环链表中的元素:
");
scanf("%d",&pos);
while(pos<=0||pos>N)
{
printf("输入的位置不存在,请重新输入...");
scanf("%d",&pos);
}
printList(l,pos);
}
12#include
#include
#defineN5
#defineNULL0
#defineOK1
#defineERROR0
//链表的存储结构
typedefstructLNode
{
intdata;
structLNode*next;
}LNode,*list;
//创建链表
voidcreatList(list&l,intn)
{
listp,q;
l=(list)malloc(sizeof(LNode));
p=l;
for(inti=0;i{
q=(list)malloc(sizeof(LNode));
scanf("%d",&q->data);
p->next=q;
p=q;
}
p->next=NULL;
}
//判断元素e是否在链表中
intinList(listl,inte)
{
listp,q;
q=p=l->next;
while(p)
{
if(p->data==e)
returnOK;//发现在里面,返回真值
p=p->next;//否则指针后移,继续找
}
//没有执行returnOK;语句,说明未找到
while(q->next!
=p)q=q->next;//找到链尾
p=(list)malloc(sizeof(LNode));//为链尾重新开辟空间
p->data=e;//接到链尾
p->next=q->next;
q->next=p;
returnERROR;//未找到,返回假值
}
//输出链表
voidprintList(listl)
{
listp;
p=l->next;
while(p)
{printf("%d",p->data);p=p->next;}
}
voidmain()
{
listl;
inte;
printf("创建%d个元素的链表,请输入%d个元素:
\n",N,N);
creatList(l,N);
printf("请输入要判断的元素:
");
scanf("%d",&e);
if(inList(l,e))
printf("YES");
else
printList(l);
}
13#include
#include
#defineOK1
#defineError0
#defineNULL0
#definemaxSize100
//栈的存储结构
typedefstruct
{
int*base;
int*top;
intsize;
}stack;
//栈的初始化(顺序存储)
intinitStack(stack&s)
{//开辟maxSize大小的空间,base和top都指向基地址,同时判断是否开辟成功,不成功返回0
if(!
(s.base=s.top=(int*)malloc(maxSize*sizeof(int))))returnError;
s.size=maxSize;//栈的大小为maxSize
returnOK;
}
//进栈操作
intpush(stack&s,inte)
{
*s.top=e;//先将元素e赋值给s.top所指的存储空间
s.top++;//top指针上移
returnOK;
}
//出栈操作
intpop(stack&s,int&e)
{
if(s.base==s.top)returnError;//如果栈为空,返回0
s.top--;//top指针先后移
e=*s.top;//将其所指的元素值赋给e
returne;
}
voidmain()
{
stacks;
intn,e;
printf("请输入要创建栈的元素的个数:
");
scanf("%d",&n);
initStack(s);
for(inti=0;i{
scanf("%d",&e);
push(s,e);
}
while(s.base!
=s.top)
{
printf("%d",pop(s,e));
}
}
14#include
#include
#include
#include
#definestackincrement8
#defineOK1
#defineError0
#defineNULL0
#definemaxSize100
//栈的存储结