数据结构实验3王清华0907022107Word文档格式.docx
《数据结构实验3王清华0907022107Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验3王清华0907022107Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
ctype.h"
typedefstructnode//定义结点
{
chardata[10];
//结点的数据域为字符串
structnode*next;
//结点的指针域
}ListNode;
typedefListNode*LinkList;
//自定义LinkList单链表类型
LinkListCreatListR1();
//函数,用尾插入法建立带头结点的单链表
ListNode*LocateNode(LinkListhead,char*key);
//函数,按值查找结点
voidDeleteList(LinkListhead,char*key);
//函数,删除指定值的结点
voidprintlist(LinkListhead);
//函数,打印链表中的所有值
voidDeleteAll(LinkListhead);
//函数,删除所有结点,释放内存
//==========主函数==============
voidmain()
{
char*ch,*num;
num=newchar;
ch=newchar[10];
LinkListhead;
head=CreatListR1();
//用尾插入法建立单链表,返回头指针
printlist(head);
//遍历链表输出其值
printf("
Deletenode(y/n):
"
);
//输入"
y"
或"
n"
去选择是否删除结点
scanf("
%s"
num);
if(strcmp(num,"
)==0||strcmp(num,"
Y"
)==0){
PleaseinputDelete_data:
scanf("
ch);
//输入要删除的字符串
DeleteList(head,ch);
printlist(head);
}
DeleteAll(head);
//删除所有结点,释放内存
}
//==========用尾插入法建立带头结点的单链表===========
LinkListCreatListR1(void)
char*ch;
LinkListhead=(LinkList)malloc(sizeof(ListNode));
//生成头结点
ListNode*s,*r,*pp;
r=head;
r->
next=NULL;
Input#toend"
#"
代表输入结束
PleaseinputNode_data:
//输入各结点的字符串
while(strcmp(ch,"
)!
=0){
s=(ListNode*)malloc(sizeof(ListNode));
strcpy(s->
data,ch);
r->
next=s;
r=s;
scanf("
returnhead;
//返回头指针
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========
ListNode*LocateNode(LinkListhead,char*key)
ListNode*p=head->
next;
//从开始结点比较
while(strcmp(p->
data,key)!
=0&
&
p)//直到p为NULL或p->
data为key止
p=p->
//扫描下一个结点
returnp;
//若p=NULL则查找失败,否则p指向找到的值为key的结点
//==========删除带头结点的单链表中的指定结点=======
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;
free(p);
}
改写以上程序,实现功能如下:
1.编写一个函数计算值域为x的结点个数。
运行结果截图:
2.编写一个删除链表中值为x的结点的直接前趋结点的算法,若有多个值为x的结点,则删除第一个x的直接前趋结点。
3.写一个对单循环链表进行逆序遍历(打印每个结点的值)的算法。
4.改写CreatListR1函数,使得链表创建时为非降序排列,在上述链表中插入一个元素,使得链表依然升序;
四、实验结果与数据处理
详细记录程序在调试过程中出现的问题及解决方法。
记录程序执行的结果(贴图)。
五、分析与讨论
对上机实践结果进行分析,上机的心得体会。
六、教师评语
签名:
日期:
成绩
附源程序清单:
1.
#include"
#include"
typedefstructListNode
intdata;
structListNode*next;
}ListNode,*LinkList;
voidInsertListNum(LinkListH)
ListNode*p,*q;
inti;
charch=NULL;
p=H;
while(ch!
='
\n'
)
q=(LinkList)malloc(sizeof(ListNode));
%d"
&
i);
data=i;
next=p->
p->
next=q;
q=q->
ch=getchar();
intCountListSameNum(LinkListH,intx)
ListNode*p;
intcount=0;
p=H->
while(p)
if(p->
data==x)
count++;
p=p->
}
returncount;
voidPrintList(LinkListH)
%d"
p=p->
main()
intn,x;
LinkListH;
H=(LinkList*)malloc(sizeof(ListNode));
InsertListNum(H);
PrintList(H);
EntertheNumberyoucount:
x);
n=CountListSameNum(H,x);
n=%d"
n);
2.
charch;
Enterthenumbers:
voidDeleteListNum(LinkListH,intx)
ListNode*p,*r;
intn;
if(n==0)
Nofounding!
else
break;
//若将break去点,则可以删除所有的值为x的前驱结点
next==NULL)
\nThisNO.1,NoHead!
intn,x1,x2;
H=(LinkList*)malloc(sizeof(ListNode));
x1);
n=CountListSameNum(H,x1);
Enterthenumberyoudelete:
x2);
DeleteListNum(H,x2);
3.
inti=0;
q=(LinkList*)malloc(sizeof(ListNode));
voidSortListNum(LinkListH)
H->
next=NULL;
q=p;
next=H->
ThenewLinklistis:
SortListNum(H);
4.
intCountAllListNum(LinkListH)
inti=0;
i++;
returni;
voidSortListNum(LinkListH)
ListNode*p,*s,*pt;
s=p->
next!
=NULL)
while(s->
=NULL)
if(p->
next->
data>
s->
data)
pt=p->
p->
next=s->
s->
next=pt;
}
elses=s->
}
p=p->
s=p->
voidInsertANum(LinkListH,intx)
p=(ListNode*)malloc(sizeof(ListNode));
data=x;
q=H;
=NULL)
{
if(q->
=x)
next=q->
next=p;
intm,n;
H=(LinkList)malloc(sizeof(ListNode));
n=CountAllListNum(H);
%d\n"
Enterthenum:
m);
InsertANum(H,m);