数据结构C语言版实验报告docWord文档下载推荐.docx
《数据结构C语言版实验报告docWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构C语言版实验报告docWord文档下载推荐.docx(51页珍藏版)》请在冰豆网上搜索。
3、修改程序:
(1)增加插入结点的功能。
(2)将建立链表的方法改为头插入法。
程序代码:
#include"
stdio.h"
string.h"
stdlib.h"
ctype.h"
typedefstructnode
{
//定义结点
chardata[10];
//结点的数据域为字符串
structnode*next;
//结点的指针域
}ListNode;
typedefListNode*LinkList;
LinkListCreatListR1();
//自定义LinkList单链表类型
//函数,用尾插入法建立带头结点的单链表
LinkListCreatList(void);
ListNode*LocateNode();
//函数,用头插入法建立带头结点的单链表
//函数,按值查找结点
voidDeleteList();
//函数,删除指定值的结点
voidprintlist();
voidDeleteAll();
//函数,打印链表中的所有值
//函数,删除所有结点,释放存
ListNode*AddNode();
//修改程序:
增加节点。
用头插法,返回头指针
//==========主函数==============
voidmain()
//输入各结点的字符串
charch[10],num[5];
LinkListhead;
head=CreatList();
printlist(head);
printf("
Deletenode(y/n):
"
);
scanf("
%s"
num);
//用头插入法建立单链表,返回头指针
//遍历链表输出其值
//输入"
y"
或"
n"
去选择是否删除结点
if(strcmp(num,"
)==0||strcmp(num,"
Y"
)==0){
PleaseinputDelete_data:
ch);
//输入要删除的字符串
DeleteList(head,ch);
}
Addnode?
(y/n):
//输入"
去选择是否增加结点scanf("
)==0)
head=AddNode(head);
DeleteAll(head);
//删除所有结点,释放存
//==========用尾插入法建立带头结点的单链表===========
LinkListCreatListR1(void)
charch[10];
LinkListhead=(LinkList)malloc(sizeof(ListNode));
//
ListNode*s,*r,*pp;
r=head;
r->
next=NULL;
Input#toend"
#"
代表输入结束
生成头结点
\nPleaseinputNode_data:
while(strcmp(ch,"
)!
=0){
pp=LocateNode(head,ch);
//按值查找结点,返回结点指针
if(pp==NULL){//没有重复的字符串,插入到链表中
s=(ListNode*)malloc(sizeof(ListNode));
strcpy(s->
data,ch);
next=s;
r=s;
PleaseinputNode_data:
returnhead;
//返回头指针
//==========用头插入法建立带头结点的单链表===========
LinkListCreatList(void)
charch[100];
LinkListhead,p;
head=(LinkList)malloc(sizeof(ListNode));
head->
while
(1)
if(strcmp(ch,"
))
if(LocateNode(head,ch)==NULL)
strcpy(head->
p=(LinkList)malloc(sizeof(ListNode));
p->
next=head;
head=p;
else
break;
//==========按值查找结点,找到则返回该结点的位置,否则返回ListNode*LocateNode(LinkListhead,char*key){
NULL==========
ListNode*p=head->
next;
//从开始结点比较
while(p!
=NULL&
&
strcmp(p->
data,key)!
=0)
p=p->
//扫描下一个结点
returnp;
//若p=NULL则查找失败,否则
//直到p为NULL
p指向找到的值为
或p->
data为key的结点
key止
//==========修改程序:
增加节点=======
ListNode*AddNode(LinkListhead)
ListNode*s,*pp;
\nPleaseinputaNewNode_data:
//按值查找结点,返回结点指针printf("
ok2\n"
ok3\n"
s->
next=head->
//==========删除带头结点的单链表中的指定结点=======
voidDeleteList(LinkListhead,char*key)
ListNode*p,*r,*q=head;
p=LocateNode(head,key);
//按key值查找结点的
if(p==NULL){//若没有找到结点,退出
positionerror"
exit(0);
while(q->
next!
=p)//p为要删除的结点,q为p的前结点
q=q->
r=q->
q->
next=r->
free(r);
//释放结点
//===========打印链表=======
voidprintlist(LinkListhead)
//从开始结点打印
while(p){
%s,"
p->
data);
\n"
//==========删除所有结点,释放空间===========
voidDeleteAll(LinkListhead)
ListNode*p=head,*r;
while(p->
next){
r=p->
free(p);
p=r;
实验结果:
Input#toendPleaseinputNode_data:
bat
cat
eat
fat
hat
jat
lat
mat
#
mat,lat,jat,hat,fat,eat,cat,bat,
Deletenode(y/n):
y
mat,lat,jat,fat,eat,cat,bat,
Insertnode(y/n):
PleaseinputInsert_data:
put
position:
5
mat,lat,jat,fat,eat,put,cat,bat,
请按任意键继续...
示意图:
head
matlatjathatfateatcatbat
NULL
matlatjatfateatcatbat
心得体会:
本次实验使我们对链表的实质了解更加明确了,对链表的一些基本操作也更