数据结构实验3王清华0907022107Word文档格式.docx

上传人:b****5 文档编号:16428612 上传时间:2022-11-23 格式:DOCX 页数:18 大小:57.08KB
下载 相关 举报
数据结构实验3王清华0907022107Word文档格式.docx_第1页
第1页 / 共18页
数据结构实验3王清华0907022107Word文档格式.docx_第2页
第2页 / 共18页
数据结构实验3王清华0907022107Word文档格式.docx_第3页
第3页 / 共18页
数据结构实验3王清华0907022107Word文档格式.docx_第4页
第4页 / 共18页
数据结构实验3王清华0907022107Word文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数据结构实验3王清华0907022107Word文档格式.docx

《数据结构实验3王清华0907022107Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验3王清华0907022107Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

数据结构实验3王清华0907022107Word文档格式.docx

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);

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

当前位置:首页 > 医药卫生 > 基础医学

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

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