数据结构C语言版实验报告.docx
《数据结构C语言版实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构C语言版实验报告.docx(32页珍藏版)》请在冰豆网上搜索。
![数据结构C语言版实验报告.docx](https://file1.bdocx.com/fileroot1/2022-10/28/bc07d4ed-e136-4d25-a0f3-e9ef5fca0ed7/bc07d4ed-e136-4d25-a0f3-e9ef5fca0ed71.gif)
数据结构C语言版实验报告
(此文档为word格式,下载后您可任意编辑修改!
)
数据结构(C语言版)实验报告
学院计算机科学与技术
专业计算机大类强化
学号xxx
班级xxx
姓名xxx
指导教师xxx
实验1
实验题目:
单链表的插入和删除
实验目的:
了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。
实验要求:
建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。
实验主要步骤:
1、分析、理解给出的示例程序。
2、调试程序,并设计输入数据(如:
bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序的如下功能:
不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。
3、修改程序:
(1)增加插入结点的功能。
(2)将建立链表的方法改为头插入法。
程序代码:
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"ctype.h"
typedefstructnode//定义结点
{
chardata[10];//结点的数据域为字符串
structnode*next;//结点的指针域
}ListNode;
typedefListNode*LinkList;//自定义LinkList单链表类型
LinkListCreatListR1();//函数,用尾插入法建立带头结点的单链表
LinkListCreatList(void);//函数,用头插入法建立带头结点的单链表
ListNode*LocateNode();//函数,按值查找结点
voidDeleteList();//函数,删除指定值的结点
voidprintlist();//函数,打印链表中的所有值
voidDeleteAll();//函数,删除所有结点,释放内存
ListNode*AddNode();//修改程序:
增加节点。
用头插法,返回头指针
//==========主函数==============
voidmain()
{
charch[10],num[5];
LinkListhead;
head=CreatList();//用头插入法建立单链表,返回头指针
printlist(head);//遍历链表输出其值
printf("Deletenode(y/n):
");//输入"y"或"n"去选择是否删除结点
scanf("%s",num);
if(strcmp(num,"y")==0||strcmp(num,"Y")==0){
printf("PleaseinputDelete_data:
");
scanf("%s",ch);//输入要删除的字符串
DeleteList(head,ch);
printlist(head);
}
printf("Addnode?
(y/n):
");//输入"y"或"n"去选择是否增加结点
scanf("%s",num);
if(strcmp(num,"y")==0||strcmp(num,"Y")==0)
{
head=AddNode(head);
}
printlist(head);
DeleteAll(head);//删除所有结点,释放内存
}
//==========用尾插入法建立带头结点的单链表===========
LinkListCreatListR1(void)
{
charch[10];
LinkListhead=(LinkList)malloc(sizeof(ListNode));//生成头结点
ListNode*s,*r,*pp;
r=head;
r->next=NULL;
printf("Input#toend");//输入"#"代表输入结束
printf("\nPleaseinputNode_data:
");
scanf("%s",ch);//输入各结点的字符串
while(strcmp(ch,"#")!
=0){
pp=LocateNode(head,ch);//按值查找结点,返回结点指针
if(pp==NULL){//没有重复的字符串,插入到链表中
s=(ListNode*)malloc(sizeof(ListNode));
strcpy(s->data,ch);
r->next=s;
r=s;
r->next=NULL;
}
printf("Input#toend");
printf("PleaseinputNode_data:
");
scanf("%s",ch);
}
returnhead;//返回头指针
}
//==========用头插入法建立带头结点的单链表===========
LinkListCreatList(void)
{
charch[100];
LinkListhead,p;
head=(LinkList)malloc(sizeof(ListNode));
head->next=NULL;
while
(1)
{
printf("Input#toend");
printf("PleaseinputNode_data:
");
scanf("%s",ch);
if(strcmp(ch,"#"))
{
if(LocateNode(head,ch)==NULL)
{
strcpy(head->data,ch);
p=(LinkList)malloc(sizeof(ListNode));
p->next=head;
head=p;
}
}
else
break;
}
returnhead;
}
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========
ListNode*LocateNode(LinkListhead,char*key)
{
ListNode*p=head->next;//从开始结点比较
while(p!
=NULL&&strcmp(p->data,key)!
=0)//直到p为NULL或p->data为key止
p=p->next;//扫描下一个结点
returnp;//若p=NULL则查找失败,否则p指向找到的值为key的结点
}
//==========修改程序:
增加节点=======
ListNode*AddNode(LinkListhead)
{
charch[10];
ListNode*s,*pp;
printf("\nPleaseinputaNewNode_data:
");
scanf("%s",ch);//输入各结点的字符串
pp=LocateNode(head,ch);//按值查找结点,返回结点指针
printf("ok2\n");
if(pp==NULL){//没有重复的字符串,插入到链表中
s=(ListNode*)malloc(sizeof(ListNode));
strcpy(s->data,ch);
printf("ok3\n");
s->next=head->next;
head->next=s;
}
returnhead;
}
//==========删除带头结点的单链表中的指定结点=======
voidDeleteList(LinkListhead,char*key)
{
ListNode*p,*r,*q=head;
p=LocateNode(head,key);//按key值查找结点的
if(p==NULL){//若没有找到结点,退出
printf("positionerror");
exit(0);
}
while(q->next!
=p)//p为要删除的结点,q为p的前结点
q=q->next;
r=q->next;
q->next=r->next;
free(r);//释放结点
}
//===========打印链表=======
voidprintlist(LinkListhead)
{
ListNode*p=head->next;//从开始结点打印
while(p){
printf("%s,",p->data);
p=p->next;
}
printf("\n");
}
//==========删除所有结点,释放空间===========
voidDeleteAll(LinkListhead)
{
ListNode*p=head,*r;
while(p->next){
r=p->next;
free(p);
p=r;
}
free(p);
}
实验结果:
Input#toendPleaseinputNode_data:
bat
Input#toendPleaseinputNode_data:
cat
Input#toendPleaseinputNode_data:
eat
Input#toendPleaseinputNode_data:
fat
Input#toendPleaseinputNode_data:
hat
Input#toendPleaseinputNode_data:
jat
Input#toendPleaseinputNode_data:
lat
Input#toendPleaseinputNode_data:
mat
Input#toendPleaseinputNode_data:
#
mat,lat,jat,hat,fat,eat,cat,bat,
Deletenode(y/n):
y
PleaseinputDelete_data:
hat
mat,lat,jat,fat,eat,cat,bat,
Insertnode(y/n):
y
PleaseinputInsert_data:
put
position:
5
mat,lat,jat,fat,eat,put,cat,bat,
请按任意键继续...
示意图:
心得体会:
本次实验使我们对链表的实质了解更加明确了,对链表的一些基本操作也更加熟练了。
另外实验指导书上给出的代码是有一些问题的,这使我们认识到实验过程中不能想当然的直接编译执行,应当在阅读并完全理解代码的基础上再执行,这才是实验的意义所在。
实验2
实验题目:
二叉树操作设计和实现
实验目的:
掌握二叉树的定义、性质及存储方式,各种遍历算法。
实验要求:
采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。
实验主要步骤:
1、分析、理解程序。
2、调试程序,设计一棵二叉树,输入完