数据结构实验答案.docx
《数据结构实验答案.docx》由会员分享,可在线阅读,更多相关《数据结构实验答案.docx(53页珍藏版)》请在冰豆网上搜索。
数据结构实验答案
重庆文理学院软件工程学院
实验报告册
专业:
_____软件工程___
班级:
_____软件工程2班___
学号:
_____************___
***********________***
课程名称:
___数据结构_
**********************
2013年06月25日
实验序号
1
实验名称
实验一线性表基本操作
实验地点
S-C1303
实验日期
2013年04月22日
实
验
内
容
1.编程实现在顺序存储的有序表中插入一个元素(数据类型为整型)。
2.编程实现把顺序表中从i个元素开始的k个元素删除(数据类型为整型)。
3.编程序实现将单链表的数据逆置,即将原表的数据(a1,a2….an)变成(an,…..a2,a1)。
(单链表的数据域数据类型为一结构体,包括学生的部分信息:
学号,姓名,年龄)
实
验
过
程
及
步
骤
1.
#include
#include
#include
#defineOK1
#defineERROR0
#defineTRUE1
#defineFALSE0
#defineElemTypeint
#defineMAXSIZE100/*此处的宏定义常量表示线性表可能达到的最大长度*/
typedefstruct
{ElemTypeelem[MAXSIZE];/*线性表占用的数组空间*/
intlast;/*记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表置为-1*/
}SeqList;
#include"common.h"
#include"seqlist.h"
voidpx(SeqList*A,intj);
voidmain()
{SeqList*l;
intp,q,r;
inti;
l=(SeqList*)malloc(sizeof(SeqList));
printf("请输入线性表的长度:
");
scanf("%d",&r);
l->last=r-1;
printf("请输入线性表的各元素值:
\n");
for(i=0;i<=l->last;i++)
{
scanf("%d",&l->elem[i]);
}
px(l,i);
printf("请输入要插入的值:
\n");
scanf("%d",&l->elem[i]);
i++;
px(l,i);
l->last++;
for(i=0;i<=l->last;i++)
{printf("%d",l->elem[i]);
}
printf("\n");
}
voidpx(SeqList*A,intj)
{inti,temp,k;
for(i=0;i{for(k=0;k{if(A->elem[i]elem[k])
{temp=A->elem[i];
A->elem[i]=A->elem[k];
A->elem[k]=temp;
}}
}
}
2.
#include
#include
#include
#defineOK1
#defineERROR0
#defineTRUE1
#defineFALSE0
#defineElemTypeint
#defineMAXSIZE100/*此处的宏定义常量表示线性表可能达到的最大长度*/
typedefstruct
{ElemTypeelem[MAXSIZE];/*线性表占用的数组空间*/
intlast;/*记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表置为-1*/
}SeqList;
#include"common.h"
#include"seqlist.h"
voidpx(SeqList*A,intj);
intDelList(SeqList*L,inti,SeqList*e,intj)
/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值。
i的合法取值为1≤i≤L.last+1*/
{intk,a,b,c;
if((i<1)||(i>L->last+2))
{printf("删除位置不合法!
");
return(ERROR);
}
if(j>L->last-i)
{printf("删除位置不合法!
");
return(ERROR);
}
for(b=0,a=i-1;a
{e->elem[b]=L->elem[a];}
e->last=b;/*将删除的元素存放到e所指向的变量中*/
for(k=i;k+j-1<=L->last;k++)
{L->elem[k-1]=L->elem[k+j-1];}/*将后面的元素依次前移*/
L->last=L->last-j;
printf("删除的元素值为:
");
for(c=0;c
{printf("%d",e->elem[c]);}
printf("\n");
return(OK);
}
voidmain()
{SeqList*l,*q;
intp,r;
inti,j,m;
l=(SeqList*)malloc(sizeof(SeqList));
q=(SeqList*)malloc(sizeof(SeqList));
printf("请输入线性表的长度:
");
scanf("%d",&r);
l->last=r-1;
printf("请输入线性表的各元素值:
\n");
for(i=0;i<=l->last;i++)
{scanf("%d",&l->elem[i]);
}
px(l,i);
for(i=0;i<=r-1;i++)
{printf("%d",l->elem[i]);}
printf("\n");
printf("请输入要删除的元素位置(位置+个数):
\n");
scanf("%d%d",&p,&j);
m=DelList(l,p,q,j);
if(m==0)
{printf("无法删除");
exit(0);}
elseif(m==1)
{printf("线性表内余下元素为:
\n");
for(i=0;i<=r-j-1;i++)
{printf("%d",l->elem[i]);}
printf("\n");}
}
voidpx(SeqList*A,intj)
{inti,temp,k;
for(i=0;i{for(k=0;k{if(A->elem[i]elem[k])
{temp=A->elem[i];
A->elem[i]=A->elem[k];
A->elem[k]=temp;
}}
}
printf("排序完成!
");
}
3.#include
#include
#include
/*#defineElemTypechar*/
typedefstructNode/*结点类型定义*/
{intnum;
charname[10];
intage;
structNode*next;
}Node,*LinkList;/*LinkList为结构指针类型*/
LinkListCreateFromTail()
/*通过键盘输入表中元素值,利用尾插法建单链表,并返回该单链表头指针L*/
{LinkListL;
Node*r,*s;
inta;
charb[10];
intc;
intflag=1;/*设置一个标志,初值为1,当输入"-1"时,flag为0,建表结束*/
L=(Node*)malloc(sizeof(Node));
L->next=NULL;/*为头结点分配存储空间,建立空的单链表L*/
r=L;/*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
/*循环输入表中元素值,将建立新结点s插入表尾*/
printf("输入学生的信息:
\n");
printf("学号姓名年龄\n");
while(flag)
{scanf("%d",&a);
if(a==-1)
flag=0;
else
{scanf("%s%d",b,&c);
s=(Node*)malloc(sizeof(Node));
s->num=a;
strcpy(s->name,b);
s->age=c;
r->next=s;
r=s;
}
}r->next=NULL;
returnL;
}
voidReverseList(LinkListL)
{Node*p,*q;
p=L->next;
L->next=NULL;
while(p!
=NULL)
{q=p->next;/*q指针保留p->next得值*/
p->next=L->next;
L->next=p;/*将p结点头插入到单链表L中*/
p=q;/*p指向下一个要插入的结点*/
}
}
voidmain()
{LinkListl;
Node*p;
printf("请输入链表数据,以-1结束!
\n");
l=CreateFromTail();
printf("输入的单链表为:
\n");
p=l->next;
while(p!
=NULL)
{printf("%d%s%d\n",p->num,p->name,p->age);
p=p->next;
}
ReverseList(l);
printf("逆置后的单链表为:
\n");
p=l->next;
while(p!
=NULL)
{printf("%d%s%d\n",p->num,p->name,p->age);
p=p->next;
}
}
实
验
结
果
及
分
析
1.实验结果:
实验分析:
我做了三次实验,分别插入数列前,中,后的数字,实验证明代码没有错误,能正常运行、排序、输出。
存在的问题:
我不明白为什么我写的是降序排序,计算机运行后就是升序排序了。
希望老师能帮我修改一下。
2.实验结果
实验分析:
我通过三次实验(正常删除、删除个数超出、删除位置不正确)证明代码的正确性。
改代码可实现派讯,删除,读取删除的内容和输出的功能。
4.实验结果
实验分析:
我做了两次测试,测试证明代码没有错误。
教
师
评
阅
教师签名:
年月日
实验序号
2
实验名称
实验二栈和队列基本操作
实验地点
S-C1303
实验日期
2013年05月13日
实
验
内
容
1.利用栈的运算实现数制转换—--分别将十进制转换为八进制和十六进制。
2.编程判断一个字符序列是否是回文序列。
输入形式为“*****#*****”,*为输入的字符,#为两序列的分隔符。
3.实现链队列管理---输入一个整数,如果是奇数就入队,如果是偶数就让队头出队,直到输入0就结束,最后输出队列的所有元素。
实
验
过
程
及
步
骤
(代码)
1.
#include
#include
#include
#defineNULL0
typedefstructNumber
{intnum;
structNumber*next;
}Num;
voidConversion(intiNum,inti);//转换数字,进栈,iNum为待转换的数,i代表进制
voidPop(structNumber*top,inti);//显示结果,出栈,top为栈顶指针,i代表进制
voidmain()
{intm=8,n=2,j=16;
intiNum;
charchoose,c;
printf("数制转换\n\n");
printf("请输入一个十进制数:
");
scanf("%d",&iNum);
printf("转换后结果为:
\n");
printf("\n八进制:
");
Conversion(iNum,m);
printf("十六进制:
");
Conversion(iNum,j);
printf("\n转换完毕!
\n");
}
voidConversion(intiNum,inti)//进栈
{structNumber*top=NULL,*NewP;
while(iNum!
=0)
{
NewP=(structNumber*)malloc(sizeof(structNumber));
if(top==NULL)
{NewP->next=NULL;
top=NewP;
top->num=iNum%i;}
else
{NewP->next=top;
top=NewP;
top->num=iNum%i;
}
iNum=iNum/i;
}//while
Pop(top,i);
printf("\n");
}
voidPop(structNumber*top,inti)//出栈
{if(top==NULL)
printf("栈空!
\n");
else
{charcell[]="0123456789ABCDEF";
structNumber*temp,*q;
switch(i)
{case8:
//输出八进制
case16:
//输出十六进制
{temp=top;
while(temp!
=NULL)
{printf("%c",cell[temp->num]);
q=temp;temp=temp->next;free(q);}
break;}
}//switch
}//else
}
2.
#include
#include
#include
inthuiWen(constchar*p);
intmain()
{chartest[225];
printf("请输入序列:
\n");
gets(test);
if(huiWen(test))
{printf("是回文!
\n");}
else{printf("不是回文!
\n");}
getch();return0;}
inthuiWen(constchar*p)
{inti=0,n=strlen(p);
while(p[i]==p[n-i-1]&&i{i++;}
return((i0:
1);}//若i3.
#defineTRUE1
#defineFALSE0
#defineMAXSIZE50/*队列的最大长度*/
typedefstruct
{intelement[MAXSIZE];/*队列的元素空间*/
intfront;/*头指针指示器*/
intrear;/*尾指针指示器*/
}SeqQueue;
/*初始化操作*/
voidInitQueue(SeqQueue*Q)
{/*将*Q初始化为一个空的循环队列*/
Q->front=Q->rear=0;
}
/*入队操作*/
intEnterQueue(SeqQueue*Q,intx)
{
/*将元素x入队*/
if((Q->rear+1)%MAXSIZE==Q->front)/*队列已经满了*/
return(FALSE);
Q->element[Q->rear]=x;
Q->rear=(Q->rear+1)%MAXSIZE;/*重新设置队尾指针*/
return(TRUE);/*操作成功*/
}
/*出队操作*/
intDeleteQueue(SeqQueue*Q)
{/*删除队列的队头元素,用x返回其值*/
if(Q->front==Q->rear)/*队列为空*/
return(FALSE);
Q->front=(Q->front+1)%MAXSIZE;/*重新设置队头指针*/
return(TRUE);/*操作成功*/
}
intoutput(SeqQueue*Q)
{intx,i=Q->front;
/*提取队列的队头元素,用x返回其值*/
if(Q->front==Q->rear)/*队列为空*/
return(FALSE);
while(i!
=Q->rear)
{x=Q->element[i];
printf("%d",x);
i++;}
return(TRUE);/*操作成功*/
}
#include"seqqueue1.h"
#include
voidmain()
{intc;
SeqQueueQ;
InitQueue(&Q);
printf("请输入整数:
");
scanf("%d",&c);
while(c!
=0)
{if(c%2==1)
EnterQueue(&Q,c);
else
DeleteQueue(&Q);
printf("请输入整数:
");scanf("%d",&c);
}
output(&Q);
}
实
验
结
果
及
分
析
(每道题的运行结果及分析总结)
1.实验结果:
实验分析:
我测视了两组数据,均正确,证明我的代码没有错误。
该代码可实现将一个十进制数转换为八进制和十六进制的数。
2.实验结果
实验分析:
我做了四次实验有不同长度的回文序列、长度相同的非回文序列和长度不同的非回文序列。
实验正经代码正确。
3.
实验分析:
测试了3组不同的数据,均能满足实验要求,证明代码是正确的。
教
师
评
阅
教师签名:
年月日
实验序号
3
实验名称
实验三二叉树基本操作
实验地点
S-C1303
实验日期
2013年05月27日
实
验
内
容
1.统计一棵二叉树中每种类型结点数(度为0、1、2的结点数)。
2.分别输入一棵有6个结点和8个结点的二叉树,编程序输出先序、中序和后序的遍历结果。
3.哈夫曼树及哈夫曼编码。
实
验
过
程
及
步
骤
(代码)
1.#include
#include
#include
typedefcharDataType;
intLeafCount,onecount,twocount;
typedefstructNode
{DataTypedata;
structNode*LChild;
structNode*RChild;
}BiTNode,*BiTree;
voidCreateBiTree(BiTree*bt)
{charch;
ch=getchar();
if(ch=='.')*bt=NULL;
else
{*bt=(BiTree)malloc(sizeof(BiTNode));//生成一个新结点
(*bt)->data=ch;
CreateBiTree(&((*bt)->LChild));//生成左子树
CreateBiTree(&((*bt)->RChild));//生成右子树
}
}
voidleaf_a(BiTreeroot)
{if(root!
=NULL)
{leaf_a(root->LChild);
leaf_a(root->RChild);
if(root->LChild==NULL&&root->RChild==NULL)
LeafCount++;
elseif(((root->LChild!
=NULL)&&(root->RChild==NULL))||((root->LChild==NULL)&&(root->RChild!
=NULL)))
onecount++;
elseif((root->LChild!
=NULL)&&(root->RChild!
=NULL))
twocount++;
}
}
#include"head.h"
voidmain()
{BiTreeT;
inttreeleaf;
LeafCount=0;
printf("按扩展先序遍历序列建立二叉树,请输入序列:
\n");
CreateBiTree(&T);
leaf_a(T);
printf("求得的叶子结点数目为:
%d\n",LeafCount);
printf("求得的度为1的结点数目为:
%d\n",onecount);
printf("求得的度为2的结点数目为:
%d\n",twocount);
getch();
}
2.#include
#include
#include
typedefcharDataType;
intLeafCount,onecount,twocount;
typedefstructNode
{DataTypedata;
structNode*LChild;
structNode*RChild;
}BiTNode,*BiTree;
voidCreateBiTree(BiTree*bt)
{charch;
ch=getchar();
if(ch=='.')*bt=NULL;
else