数据结构实验报告答案.docx

上传人:b****2 文档编号:1602182 上传时间:2022-10-23 格式:DOCX 页数:34 大小:42.37KB
下载 相关 举报
数据结构实验报告答案.docx_第1页
第1页 / 共34页
数据结构实验报告答案.docx_第2页
第2页 / 共34页
数据结构实验报告答案.docx_第3页
第3页 / 共34页
数据结构实验报告答案.docx_第4页
第4页 / 共34页
数据结构实验报告答案.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

数据结构实验报告答案.docx

《数据结构实验报告答案.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告答案.docx(34页珍藏版)》请在冰豆网上搜索。

数据结构实验报告答案.docx

数据结构实验报告答案

 

数据结构(C语言版)实验报告

 

专业班级学号姓名

实验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,

请按任意键继续...

 

示意图:

lat

jat

hat

fat

eat

cat

bat

mat

NULL

head

lat

jat

hat

fat

eat

cat

bat

mat

head

lat

jat

fat

eat

put

cat

bat

mat

head

NULL

NULL

心得体会:

本次实验使我们对链表的实质了解更加明确了,对链表的一些基本操作也更加熟练了。

另外实验指导书上给出的代码是有一些问题的,这使我们认识到实验过程中不能想当然的直接编译执行,应当在阅读并完全理解代码的基础上再执行,这才是实验的意义所在。

实验2

实验题目:

二叉树操作设计和实现

实验目的:

掌握二叉树的定义、性质及存储方式,各种遍历算法。

实验要求:

采用二叉树链表作为存储

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1