数据结构报告实验报告.docx
- 文档编号:30167708
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:50
- 大小:458.81KB
数据结构报告实验报告.docx
《数据结构报告实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构报告实验报告.docx(50页珍藏版)》请在冰豆网上搜索。
数据结构报告实验报告
院系:
计算机科学学院
专业:
计科
年级:
2013
课程名称:
数据结构
学号:
201321091135
姓名:
司少武
指导教师:
刘晶
2016年6月12日
实验一线性结构的基本操作和应用
实
验
目
的
及
要
求
一、实验目的:
1、掌握线性表的结构特点和实现方法,能够编写程序实现线性表的基本操作:
初始化,插入,删除,查找,判空,求线性表长度等运算。
2、能够掌握特殊线性表(栈和队列)的结构特点及其基本操作;
3、能利用栈的特性进行实际应用。
二、实验题目及要求:
线性结构部分共包含三个实验内容:
1、用顺序表或者链表实现线性表的基本操作:
初始化,插入,删除,查找,判空,求线性表长度。
2、线性表的基本应用:
从以下两个实验题目中任选一个实现:
1)利用线性表实现一元多项式的相加。
2)利用线性表实现约瑟夫环问题。
3、利用栈的基本操作,编写程序实现括号匹配问题:
从键盘输入一组括号,当程序接收第一个左括号之后,期待与之匹配的右括号,如果等到的是另外一组括号的左一半则等待,若等到另外一个不匹配的右括号则程序结束并提示括号不匹配;若整个括号序列判断完毕,但栈未空则表示仍有括号未配对,提示不匹配。
否则提示匹配。
三、实验报告书写要求:
简明清晰的写出每个实验题目的算法步骤,可以混合使用自然语言、流程图及伪代码的方式,不能直接复制源程序。
每个实验题目需要附上程序正确运行结果的截图。
题目一线性表的基本操作
算
法
步
骤
的
简
要
说
明
(
流
程
图
或
伪
代
码
)
题目:
用顺序表或者链表实现线性表的基本操作:
初始化,插入,删除,查找,判空,求线性表长度。
1.算法思想:
主要设计了一个包含数据和指针域的结点。
Data*next
主要思想:
插入:
删除:
1.主函数intmain():
初始化一个链表L,显示菜单,主要语句:
switch语句,while语句,goto语句。
2.创建并输入链表数据linklistcreatelist(),在该函数中创建头结点,并输入结点上的数据。
伪代码:
while(当x!
=00)
{
p=newlist;
p->data=x;
p->next=NULL;
q->next=p;
q=p;
}
3.显示链表数据voidshow(linklistL)
1)先判断是否是空表,再逐个寻找想要的元素。
2)主要代码:
while(p)
{
cout<
p=p->next;
}
4.获取链表长度intgetlength(linklistL)
1)先判断是否为空,再遍历链表,算出链表长度。
2)主要代码:
while(p)
{
p=p->next;
length++;
}
5.获取第i个元素intgetdata(linklistL,inti)
1)当0
2)主要代码:
while(p&&j
{
j++;
p=p->next;
}
6.改变链表数据intchangedata(linklistL,inte,intd)
1)找到要修改的值e,再把d赋值给e.
2)主要代码:
while(p&&p->data!
=e)
{
p=p->next;
}
if(!
p)
returnERROR;
p->data=d;
7.插入一个结点linklistinsertlist(linklistL,inti,inte)
1)因为要插入第i个元素,所以要先找到第i-1个元素,在i-1后面插入。
2)主要代码:
s->data=e;
s->next=p->next;
p->next=s;
8.删除一个结点linklistdeletelist(linklistL,inti)
1)同插入差不多,先找到第i-1个元素,然后再把i-1结点指针域指向原本指向结点的下一个,把中间那个删除,再free,释放空间,
主要代码:
q=p->next;
p->next=q->next;
free(q);
实验截图:
心得体会:
源代码:
/*线性表的操作(单链表)*/
#include
#include
typedefstructLNode
{
intdata;
structLNode*next;
}LNode,*Linklist;/*线性表的结构*/
/*基本操作函数*/
/*构造空线性表。
操作结果:
构造空线性表,如成功返回1,否则返回0。
*/
intInitList(LinklistL)
{
L=(Linklist)malloc(sizeof(LNode));
if(L)
{
L->next=NULL;
return1;
}
else
return0;
}
/*顺序创建一个线性链表函数。
当输入的结点的数据值为0时,线性链表创建结束。
返回线性表的头结点指针。
*/
Linklisthrear_create()
{
intx;
Linklisthead,p,rear;
head=(Linklist)malloc(sizeof(LNode));
head->data=0;
rear=head;
printf("请输入线性表中的元素值,以0结束输入:
\n");
scanf("%d",&x);
while(x!
=0)
{
p=(Linklist)malloc(sizeof(LNode));
p->data=x;
rear->next=p;
rear=p;
scanf("%d",&x);
}
rear->next=NULL;
returnhead;
}
/*判断链表是否为空。
初始条件:
线性表存在。
操作结果:
若线性表为空,返回1,否则返回0。
*/
intListEmpty(LinklistL)
{
if(L->next==NULL){return1;}
else
{return0;}
}
/*求线性链表的长度函数。
初始条件:
线性表存在。
操作结果:
返回线性表中数据元素的个数。
*/
intListlength(LinklistL)
{
Linklistp;
intcount=0;
p=L;
while(p->next!
=NULL)
{
p=p->next;
count++;
}
returncount;
}
/*确定元素e的位置。
初始条件:
线性表存在。
操作结果:
返回第一个与e相同的元素的位置;如果这样的元素不存在,则返回0。
*/
intLocateElem(LinklistL,inte)
{
Linklistp;
intpos=1;
p=L->next;
while(p!
=NULL)
{
if(p->data!
=e)
{
p=p->next;
pos++;
}
else
returnpos;
}
return0;
}
/*在第i个元素前插入元素。
初始条件:
线性表存在,且1<=i<=ListLength(L)+1*。
操作结果:
在L中第i个位置之前插入新的元素e,插入成功返回1,否则返回0。
*/
intListInsert(LinklistL,inti,inte)
{
Linklistp,findpri;/*p用于申请空间,findpri用于找第i个节点的前驱*/
intj;
if((1<=i)&&(i<=Listlength(L)+1))/*判断i是否合法*/
{
p=(Linklist)malloc(sizeof(LNode));
if(!
p)return0;/*判断申请空间是否成功*/
else
p->data=e;
findpri=L;
for(j=1;j
{findpri=findpri->next;}
p->next=findpri->next;
findpri->next=p;
return1;
}
else
return0;
}
/*删除第i个结点,并将其数据元素作为返回值返回。
初始条件:
线性表非空且1<=i<=ListLength(L)。
操作结果:
删除第i个结点并将结点的数据域的值返回。
*/
intListDelete(LinklistL,inti)
{
Linklistp,q;
intj=1,e;
if(!
ListEmpty(L))
{
if((1<=i)&&(i<=Listlength(L)))
{
p=L;
while(jnext;j++;}
q=p->next;
e=q->data;
p->next=q->next;
free(q);
returne;
}
else
{printf("ierror!
\n");return0;}
}
else
{printf("Thisisanemptylist.\n");return0;}
}
/*销毁线性链表。
初始条件:
线性表存在。
操作结果:
销毁线性表并返回1。
*/
LinklistDestroyList(LinklistL)
{
Linklistp,rear;
rear=L->next;
while(rear!
=NULL)
{
p=rear;
L->next=rear->next;
rear=rear->next;
free(p);
}
free(L);
returnNULL;
}
/*此函数用于输出创建的链表中的元素*/
voidListOut(LinklistL)
{
Linklistp;
p=L->next;
while(p!
=NULL)
{
printf("%d",p->data);
p=p->next;
}
}
/*操作菜单*/
voidmenu()
{intm;
printf("此程序用于实现线性表的相关基本操作\n");
printf("1.创建2.判空3.求长度\n4.查找定位5.插入一个元素\n6.删除一个元素7.销毁线性表");
}
intmain()
{
chargoon;
intchoice;
LinklistList=NULL;
inti,e,length,position;
do
{
menu();
printf("\n请选择测试函数序号:
");
scanf("%d",&choice);
if((!
List)&&(choice!
=1))
{
printf("\n线性表还没被创建,请先创建线性表!
");
goon='y';
getchar();
continue;
}
switch(choice)
{
case1:
{
printf("\n创建一个线性表为:
\n");
List=hrear_create();
if(List)ListOut(List);
break;
}
case2:
{
printf("\n此程序将判断一个线性表是否为空\n");
if(ListEmpty(List)){printf("这是一个空的线性表.\n");break;}
else
{printf("线性表非空,表中元素有:
");ListOut(List);break;}
}
case3:
{
if(List)
{
printf("\n此程序将求一个线性表的长度\n");
printf("已创建线性表为:
\n");ListOut(List);
length=Listlength(List);
printf("length=%d\n",length);break;
}
else{printf("失败!
\n");break;}
}
case4:
{
if(List)
{printf("已创建线性表为:
\n");ListOut(List);}
printf("请输入您需要查找定位的元素:
\n");
scanf("%d",&e);
position=LocateElem(List,e);
if(position)
{printf("position=%d\n",position);break;}
else
{printf("线性表中没有此元素!
\n");break;}
}
case5:
{
if(List)
{
printf("\n将在一个线性表中插入一个元素\n");
printf("已创建线性表为:
\n");ListOut(List);
printf("请输入您要插入的元素的位置i和值e:
i,e\n");
scanf("%d,%d",&i,&e);
if(ListInsert(List,i,e)){printf("插入!
");}
else
{printf("插入成功!
\n");break;}
}
else
{
printf("空间不足!
");break;
}
ListOut(List);break;
}
case6:
{
printf("\n此程序将在一个线性表中删除元素\n");
if(List)
{
printf("已创建线性表为:
\n");ListOut(List);
printf("请输入您需要删除的元素的位置:
\n");
scanf("%d",&i);
if(ListDelete(List,i)){printf("删除成功!
\n");}
else
{printf("删除失败!
\n");break;}
}
else
{
printf("空间不足!
");break;
}
ListOut(List);break;
}
case7:
{
if(List)
{
printf("一个线性表已经被创建!
\n");ListOut(List);
printf("\n此操作将销毁已创建的线性表\n");
if(!
(List=DestroyList(List))){printf("销毁成功!
\n");break;}
else
{printf("销毁失败!
\n");break;}
}
}
default:
printf("选择错误!
\n");
}
printf("\n继续测试?
(Y/N):
");
goon=getchar();
goon=getchar();
}while(goon=='y'||goon=='Y');
return1;
}
题目二线性表的基本应用
算
法
步
骤
的
简
要
说
明
(
流
程
图
或
伪
代
码
)
题目:
线性表的基本应用:
利用线性表实现约瑟夫环问题
一、算法设计:
1)先在主函数中输入几个人和初始密码
2)按照单链表那样先构造一个单链表,给结点输入元素,再把尾指针指向头结点。
3)定义两个指针,一个临时指针和一个头指针,当临时指针p和头指针head不在同一个结点时,说明还剩下多个结点,写一个for循环,找出第password个结点,用p->next=head->next将其删除,并把值pasword保留下来,然后把head指向p的下个结点,直到整个链表删除完毕。
2、基本函数:
1.主函数main()
1)写了dowhile循环,当输入y或者Y,继续循环。
2)主要代码:
do{
}while(stop=='y'||stop=='Y');
2.创建循环链表linklistcreatlist(intn)
1)先构造两个指针,头指针head和临时指针p,然后创造一个结点,把元素password和顺序数i放入结点,再把p指向下一个结点,等快达到要求的个数n-1后,退出循环,输入最后一个结点的数据,把尾指针指向头结点。
2)主要代码:
for(i=1;i { p->i=i; cout<<“请输入第”< "< cin>>pass; p->password=pass; p->next=newlist; p=p->next; } 3.约瑟夫环实现函数voidjosefuhuan(linklisthead,intpassword) 1)构造一个临时指针,然后判断该指针是否与头指针指向同一处,如果指向同一处则退出循环,然后再来一个循环,寻找密码,找到指令密码所指,并将其删除,把所删除的密码值留下来,作下一次的循环密码。 2)主要代码: for(i=1;p! =head;i++) { for(j=1;j { p=head; head=head->next; } p->next=head->next; 实验结果: 图1.进入系统界面 图2、输入人数和上限值界面 图3、输出结果界面 心得体会: 源代码 #include usingnamespacestd; typedefstructnode{ intpassword; inti; node*next; }list,*linklist; linklistcreatlist(intn)//初始化链表并输入链表数据 { list*head,*p; inti,pass; head=p=newlist; for(i=1;i { p->i=i; cout<<"请输入第"< "< cin>>pass; p->password=pass; p->next=newlist; p=p->next; } p->i=i; cout<<"请输入第"< "< cin>>pass; p->password=pass; p->next=head; returnhead; } voidjosefuhuan(linklisthead,intpassword)//约瑟夫环的实现 { inti,j; list*p; p=newlist; for(i=1;p! =head;i++) { for(j=1;j { p=head; head=head->next; } p->next=head->next; cout<<"\n第"< " < " < password=head->password; deletehead; head=p->next; } i=head->password; j=head->i; cout<<"\n第7个出局的编号是: "< "< deletehead; } intmain()//主函数 { intn,password; charstop; list*head; cout<<"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"< cout<<"+++++++++++++++++^o^……欢迎来玩“约瑟夫环”……^o^+++++++++++++++++++"< do { cout<<"\n\t\t开始......\n\n输入约瑟夫环问题的人数和起始密码: "< cin>>n>>password; head=creatlist(n); cout<<"------------------------------------------------\n"< cout<<"输出结果如下: \n"< josefuhuan(head,password); cout<<"------------------------------------------------\n"< cout<<"是否继续进行? 是按: Y(y),否按: N(n)"< cin>>stop; if(stop=='n'||stop=='N') break; cout<<"------------------------------------------------\n"< }while(stop=='y'||stop=='Y'); system("pause"); return0; } 题目三栈的应用——括号匹配 算 法 步 骤 的 简 要 说 明 ( 流 程 图 或 伪 代 码 ) 题目: 利用栈的基本操作,编写程序实现括号匹配问题: 从键盘输入一组括号,当程序接收第一个左括号之后,期待与之匹配的右括号,如果等到的是另外一组括号的左一半则等待,若等到另外一个不匹配的右括号则程序结束并提示括号不匹配;若整个括号序列判断完毕,但栈未空则表示仍有括号未配对,提示不匹配。 否则提示匹配。 需求分析: 1).输入的形式和输入值的范围: 从键盘上以字符串的形式输入括号序列。 2).输出的形式: 括号匹配或是括号不匹配。 3).程序所能达到的功能: 检验括号是否匹配。 4).测试数据: 输入([ ]()),结果“匹配”输入 [(( )],结果“此串括号匹配不合法” 概要设计: (1)typedef struct{ } 定义栈结构体 Status Cr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 报告 实验