实验数据结构实验指导书及答案.docx
《实验数据结构实验指导书及答案.docx》由会员分享,可在线阅读,更多相关《实验数据结构实验指导书及答案.docx(23页珍藏版)》请在冰豆网上搜索。
实验数据结构实验指导书及答案
【关键字】实验
数据结构课程
实验指导书
数据结构课程组编
西南交通大学电气工程学院
一、实验教学的目的与基本要求
实验目的:
用计算机来解决实际问题时,就要涉及到数据的表示及数据的处理,而数据表示及数据处理正是数据结构课程的主要研究对象,通过这两方面内容的学习,为后续课程,特别是软件方面的课程打下了厚实的知识基础,同时也提供了必要的技能训练。
因此,数据结构课程在计算机应用中具有举足轻重的作用。
通过实验实践内容的训练,突出学生程序思维训练和动手上机调试程序的能力,使学生掌握数据结构的基本原理和编程方法,提高学生组织数据及编写程序的能力。
实验要求:
1、实验前要预习:
实验前必须认真预习相关的知识,做好充分准备。
2、学生进入实验室,要保持室内整洁和安静。
按照指定的内容进行实验。
3、学生在实验前做好预习,写好算法;实验完毕由教师验收合格后方可离开,并写好实验报告。
4、报告内容包括实验目的、实验内容、程序清单和实验结果等。
要求书写文字整齐简洁。
5、 实验过程中要注意人身和设备安全,遇到事故或出现异常现象,应立即切断电源,保持现场并报告指导教师处理。
二、实验报告要求、实验考核方式、内容及成绩评定标准
实验报告要求内容清晰完整,写出实验结果。
实验考核方式依据实验报告完成情况和实验上机情况综合考核。
根据实验报告和实验课出席情况给出实验成绩,满分10分。
三、实验教材及参考书
《数据结构》严蔚敏清华大学出版社2005
实验一熟悉开发环境和抽象数据类型
一.实验目的
1.熟悉VC软件开发环境。
2.熟悉抽象数据类型的定义与应用。
二.实验内容
1.在VC下编写程序,实现求出从键盘输入的两个数的最大值。
例如,从键盘输入a=4,b=5。
得出结果c=5
2.在VC下编写程序,实现求出两个复数的和。
定义复数的数据类型,复数由实部和虚部构成。
复数的和是两个复数的实部和虚部分别求和得出。
其中的两个复数分别从键盘输入,例如,输入3,4表示复数Z1:
3+4i;输入1,2表示复数Z2:
1+2i。
得出结果Z3=Z1+Z2=4+6i
三.实验步骤
1.设计算法,编写程序,求出两个数的最大值。
2.设计算法,编写程序,求出两个复数的和。
四.实验结果
根据实验输入,分别得出实验结果。
程序:
#include"iostream.h"
intMAX(int&c)
{inta,b;
cout<<"请输入要比较大小的两个数:
"<cin>>a>>b;
if(a>b)
c=a;
else
c=b;
cout<<"较大的数为:
"<return1;
}
#include"iostream.h"
typedefstruct
{
floatre;floatim;
}complex;
voidSUM(complex&z3)
{
complexz1,z2;
cout<<"请输入一个复数z1:
"<cin>>z1.re>>z1.im;
cout<<"请输入一个复数z2:
"<cin>>z2.re>>z2.im;
z3.re=z1.re+z2.re;
z3.im=z1.im+z2.im;
cout<<"z3="<}
voidmain()
{complexz3;intc;
MAX(c);
SUM(z3);
}
运行结果:
五.实验总结
六.实验评价
实验二顺序表的基本操作
一、实验目的
1.掌握使用VC上机调试线性表的基本方法
2.掌握线性表的基本操作:
插入、删除、查找等运算在顺序存储结构上的实现。
二、实验内容
当我们要在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。
若要删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。
1.输入几个数,建立一个顺序表。
2.向顺序表中的某一个位置i插入一个数据元素e。
3.删除顺序表中某一个位序i的数据元素,并用参数e记录被删除数据元素的值。
三、实验步骤
1.设计算法,编写程序,建立一个顺序表。
2.设计算法,编写程序,向顺序表中的某一个位置i插入一个数据元素e。
3.设计算法,编写程序,删除顺序表中某一个位序i的数据元素,并用参数e记录被删除数据元素的值。
四.实验结果
根据实验输入,分别得出实验结果。
程序:
#include"iostream.h"
#include"stdlib.h"
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
typedefintElemType;
typedefintStatus;
typedefstruct{
ElemType*elem;
intlength;
intListSize;
}SqList;//定义数据类型
StatusInitList_Sq(SqList&L){//初始化一个线性表
L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)exit(0);
L.length=0;
L.ListSize=LIST_INIT_SIZE;
return1;
}//InitList_Sq
voidcreate_sq(SqList&L){//创建一个顺序表
inti,p;
cout<<"请输入顺序表的长度:
"<cin>>p;
L.length=p;
cout<<"请输入该顺序表:
"<for(i=0;icin>>L.elem[i];
cout<<"该顺序表为:
"<for(i=0;icout<cout<}
StatusInsert_Sq(SqList&L,inti,ElemTypee){//插入一个元素
int*q,*p;ElemType*newbase;
if(i<1||i>L.length+1)return0;
if(L.length>=L.ListSize){
newbase=(ElemType*)realloc(L.elem,(L.ListSize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)exit(0);//存储分配失败
L.elem=newbase;//新基址
L.ListSize+=LISTINCREMENT;//增加存储容量
}
q=&(L.elem[i-1]);//q为插入位置
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;//插入位置及之后的元素右移
*q=e;
++L.length;//表增长1
cout<<"插入元素后的顺序表为:
"<for(i=0;icout<cout<return1;
}
StatusDelete_Sq(SqList&L,inti,ElemType&e){//删除顺序表中的一个元素
int*p,*q;
if((i<1)||(i>L.length))return0;//i值不合法
p=&(L.elem[i-1]);//p为被删除元素的位置
e=*p;
q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p)
*(p-1)=*p;//被删除元素之后的元素左移
--L.length;//表长减一
cout<<"所删除的元素为:
"<cout<<"删除后的顺序表为:
"<for(i=0;icout<cout<return1;
}
voidmain()
{SqListL;
InitList_Sq(L);
create_sq(L);
inte,i;
cout<<"请输入要插入的元素:
"<cin>>e;
cout<<"请输入要插入的位置:
"<cin>>i;
Insert_Sq(L,i,e);
cout<<"请输入要删除的元素位置:
"<cin>>i;
Delete_Sq(L,i,e);
}
运行结果:
五.实验总结
六.实验评价
实验三链表的基本操作
一、实验目的
1.掌握使用VC上机调试线性表的基本方法
2.掌握线性表的基本操作:
插入、删除、查找等运算在链式存储结构上的实现。
二、实验内容
当我们要在线性表的链式存储结构上的第i个位置上插入一个元素e时,必须先建立一个结点,然后找到第i-1个数据元素,修改相应结点的指针,完成新元素的插入。
若要删除第i个元素时,必须先找到第i-1个数据元素,然后修改相应结点指针,释放被删除结点。
1.分别输入几个非递减的数,建立两个单链表la,lb。
2.向链表la中的某一个位置i插入一个数据元素e。
3.删除链表la中某一个位序i的结点,并用e返回被删除的数据元素。
4.合并la,lb为一个链表lc,使得lc仍然按值非递减有序排列。
三、实验步骤
1.设计算法,编写程序,建立一个单链表。
2.设计算法,编写程序,向链表中的某一个位置i插入一个数据元素e。
3.设计算法,编写程序,删除链表中某一个位序i的数据元素,并用参数e记录被删除数据元素的值。
4.设计算法,编写程序,合并la,lb为一个链表lc,使得lc仍然按值非递减有序排列。
四.实验结果
根据实验输入,分别得出实验结果。
程序:
#include"iostream.h"
#include"stdlib.h"
typedefintStatus;
typedefstructLNode{
intdata;//数据域
structLNode*next;//指针域
}LNode,*LinkList;
voidCreateList_L(LinkList&L,intn)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//建立一个带头节点的单链表
cout<<"请输入该单链表中元素的个数:
"<cin>>n;
cout<<"请输入该单链表中所有的元素(从大到小):
"<LinkListp,q=L;
for(inti=n;i>0;--i)//将元素输入单链表
{
p=(LinkList)malloc(sizeof(LNode));//生成新节点
cin>>p->data;p->next=q->next;q->next=p;
}
cout<<"该单链表为:
"<q=L->next;
while(q)
{
cout<data<<"";
q=q->next;
}
cout<}
StatusListInsert_L(LinkList&L,inti,inte)//向单链表中插入一个元素
{LinkListp=L;LNode*s;
intj=0;
while(p&&j{
p=p->next;++j;
}
if(!
p||j>i-1)return0;//i小于1或者大于表长加1
s=(LinkList)malloc(sizeof(LNode));
s->data=e;s->next=p->next;
p->next=s;//插入元素
cout<<"该单链表为:
"<p=L->next;
while(p)
{
cout<data<<"";
p=p->next;
}
cout<return1;
}//ListInsert_L
StatusListDelete_L(LinkList&L,inti,int&e)//删除
{
LinkListp=L;
intj=0;
while(p->next&&j{
p=p->next;++j;
}
if(!
(p->next)||j>i-1)return0;
LinkListq;
q=p->next;p->next=q->next;
e=q->data;free(q);//删除元素并释放节点
cout<<"所删除的元素为:
"<cout<<"删除元素后的单链表为:
"<p=L->next;
while(p)
{
cout<data<<"";
p=p->next;
}
cout<return1;
}//ListDelete_L
voidMergeList_L(LinkListLa,LinkListLb,LinkList&Lc)//合并两个单链表为一个单链表,并按非递减有序排列
{
LinkListpa,pb,pc,p=Lc;
pa=La->next;pb=Lb->next;
Lc=pc=La;
while(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;//插入剩余段
free(Lb);
cout<<"合并后的单链表为(非递减有序排列):
"<p=La->next;
while(p)
{
cout<data<<"";
p=p->next;
}
cout<}//MergeList_L
voidmain()
{
LinkListLe;intn=0,i,e;
CreateList_L(Le,n);
cout<<"请输入要插入的元素:
"<cin>>e;
cout<<"请输入要插入的位置:
"<cin>>i;
ListInsert_L(Le,i,e);
cout<<"请输入要删除元素的位置:
"<cin>>i;
ListDelete_L(Le,i,e);
LinkListLa,Lb,Lc;
CreateList_L(La,n);CreateList_L(Lb,n);
MergeList_L(La,Lb,Lc);
}
运行结果:
五.实验总结
六.实验评价
实验四栈的基本操作
一、实验目的
1.掌握使用VC上机调试栈的基本方法
2.掌握栈的基本操作:
插入、删除运算在顺序存储结构上的实现。
二、实验内容
当我们要在栈的顺序存储结构上插入一个元素e时,只能在栈顶完成元素的插入。
若要删除顺序栈中的元素,也只能在栈顶完成删除。
用top表示栈顶指针,用base表示栈底指针。
当top=base时候,表示栈空。
当top–base=stacksize时,表示栈满。
插入数据元素时,先判断栈空间是否用完,如果已经用完,则可以再申请分配STACK_INIT_SIZE个数据元素的空间,然后在栈顶完成插入。
当删除数据元素时,如果栈空,则返回ERROR。
不管是插入还是删除数据元素,都是top指针变化。
插入时,top+1;删除时,top-1。
1.输入几个数,建立一个顺序栈SqStack_A。
2.向顺序栈SqStack_A中插入一个数据元素e。
3.删除顺序栈SqStack_A中的一个数据元素,并用e返回被删除的数据元素。
4.输入一个十进制数a,转换为二进制输出。
三、实验步骤
1.设计算法,编写程序,建立一个顺序栈。
2.设计算法,编写程序,向顺序栈中插入一个数据元素e。
3.设计算法,编写程序,删除顺序栈中的一个数据元素,并用参数e记录被删除数据元素的值。
4.设计算法,编写程序,输入一个十进制数a,转换为二进制输出。
四.实验结果
根据实验输入,分别得出实验结果。
程序:
#include"iostream.h"
#include"stdlib.h"
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefintSElemType;
typedefintStatus;
typedefstruct{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;//定义结构体类型
StatusInitStack(SqStack&s){//构造一个空栈
s.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
s.base)exit(0);//存储分配失败
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return1;
}
voidcreate_SqStack(SqStack&s){
inti,n;
cout<<"请输入栈的大小:
"<cin>>n;
cout<<"请输入栈中的所有元素:
"<for(i=0;icin>>s.top[i];
}
cout<<"该栈为:
"<s.top=s.base;
for(i=0;icout<<*s.top<<"";
s.top=s.top+1;
}
cout<}
StatusPush(SqStack&s,SElemTypee){//在栈顶插入一个元素
if(s.top-s.base>=s.stacksize){
s.base=(SElemType*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
s.base)exit(0);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return1;
}
StatusPop(SqStack&s,SElemType&e){//删除栈顶元素
if(s.top==s.base)return0;
e=*--s.top;
return1;
}
StatusStackEmpty(SqStacks){
if(s.top==s.base)
return0;
else
return1;
}
voidconversion(intn){
SqStacks;inte;
InitStack(s);
while(n){
Push(s,n%2);
n=n/2;
}
cout<<"转换后的二进制数为:
"<while(StackEmpty(s)){
Pop(s,e);
cout<}
cout<}
voidmain(){
SqStacks;inte,*p,n;
InitStack(s);
create_SqStack(s);
cout<<"请输入要插入的元素:
"<cin>>e;
Push(s,e);
p=s.top;
s.top=s.base;
cout<<"插入元素后的栈为:
"<for(inti=0;icout<<*s.top<<"";
s.top=s.top+1;
}
cout<Pop(s,e);
p=s.top;
s.top=s.base;
cout<<"删除元素后的栈为:
"<for(i=0;icout<<*s.top<<"";
s.top=s.top+1;
}
cout<cout<<"请输入要转换的十进制数:
"<cin>>n;
conversion(n);
}
运行结果:
五.实验总结
六.实验评价
实验五队列的基本操作
一、实验目的
1.掌握使用VC上机调试队列的基本方法
2.掌握队列的基本操作:
插入、删除运算在循环上的实现。
二、实验内容
当在循环队列上插入或者删除数据元素时,首先需要判断队列是满还是空的状态。
在本实验中采用牺牲一个元素空间来标识队列是队满还是队空的状态,队头指针为front指向队列中第一个元素,队尾指针为rear,指向队列中最后一个元素的下一个位置。
当front=rear时,表示队列为空,不能取得数据元素;当(rear+1)%MAXSIZE=front时,表示队列满,不能插入数据元素。
插入数据元素在队尾进行,删除数据元素在队头进行。
1.输入几个数,建立一个循环队列SqQueue_A。
2.向循环队列中SqQueue_A插入一个数据元素e。
3.删除循环队列SqQueue_A中的一个数据元素,并用e返回被删除的数据元素。
三、实验步骤
1.设计算法,编写程序,建立一个循环队列。
2.设计算法,编写程序,向循环队列中插入一个数据元素e。
3.设计算法,编写程序,删除循环队列中的一个数据元素,并用参数e记录被删除数据元素的值。
四.实验结果
根据实验输入,分别得出实验结果。
程序:
#include"iostream.h"
#include"stdlib.h"
#defineMAXQSIZE100
typedefintStatus;
typedefintQElemType;
typedefstructQ