数据结构实验3王清华0907022107.docx

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

数据结构实验3王清华0907022107.docx

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

数据结构实验3王清华0907022107.docx

数据结构实验3王清华0907022107

《数据结构》实验报告

实验序号:

3          实验项目名称:

链式表的操作

学  号

0907022107

姓  名

 王青华

专业、班

11网络工程

实验地点

1#316

指导教师

林仙丽

实验时间

一、实验目的及要求

1.通过实验理解单链表的逻辑结构;

2.通过实验掌握单链表的基本操作和具体的函数实现。

二、实验设备(环境)及要求

微型计算机;

windows操作系统;

MicrosoftVisualStudio6.0集成开发环境。

三、实验内容与步骤

1.链式表表示和实现线性表的如下:

#include"stdio.h"

#include"string.h"

#include"stdlib.h"

#include"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,"y")==0||strcmp(num,"Y")==0){

printf("PleaseinputDelete_data:

");

scanf("%s",ch);//输入要删除的字符串

DeleteList(head,ch);

printlist(head);

}

DeleteAll(head);//删除所有结点,释放内存

}

//==========用尾插入法建立带头结点的单链表===========

LinkListCreatListR1(void)

{

char*ch;

ch=newchar[10];

LinkListhead=(LinkList)malloc(sizeof(ListNode));//生成头结点

ListNode*s,*r,*pp;

r=head;

r->next=NULL;

printf("Input#toend");//输入"#"代表输入结束

printf("PleaseinputNode_data:

");

scanf("%s",ch);//输入各结点的字符串

while(strcmp(ch,"#")!

=0){

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;//返回头指针

}

//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========

ListNode*LocateNode(LinkListhead,char*key)

{

ListNode*p=head->next;//从开始结点比较

while(strcmp(p->data,key)!

=0&&p)//直到p为NULL或p->data为key止

p=p->next;//扫描下一个结点

returnp;//若p=NULL则查找失败,否则p指向找到的值为key的结点

}

//==========删除带头结点的单链表中的指定结点=======

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

}

改写以上程序,实现功能如下:

1.编写一个函数计算值域为x的结点个数。

运行结果截图:

2.编写一个删除链表中值为x的结点的直接前趋结点的算法,若有多个值为x的结点,则删除第一个x的直接前趋结点。

运行结果截图:

3.写一个对单循环链表进行逆序遍历(打印每个结点的值)的算法。

运行结果截图:

4.改写CreatListR1函数,使得链表创建时为非降序排列,在上述链表中插入一个元素,使得链表依然升序;

运行结果截图:

 

四、实验结果与数据处理

详细记录程序在调试过程中出现的问题及解决方法。

记录程序执行的结果(贴图)。

五、分析与讨论

对上机实践结果进行分析,上机的心得体会。

六、教师评语

签名:

日期:

成绩

附源程序清单:

1.

#include"stdio.h"

#include"stdlib.h"

typedefstructListNode

{

intdata;

structListNode*next;

}ListNode,*LinkList;

voidInsertListNum(LinkListH)

{

ListNode*p,*q;

inti;

charch=NULL;

p=H;

while(ch!

='\n')

{

q=(LinkList)malloc(sizeof(ListNode));

scanf("%d",&i);

q->data=i;

q->next=p->next;

p->next=q;

q=q->next;

ch=getchar();

}

}

intCountListSameNum(LinkListH,intx)

{

ListNode*p;

intcount=0;

p=H->next;

while(p)

{

if(p->data==x)

count++;

p=p->next;

}

returncount;

}

voidPrintList(LinkListH)

{

ListNode*p;

p=H->next;

while(p)

{

printf("%d",p->data);

p=p->next;

}

printf("\n");

}

main()

{

intn,x;

LinkListH;

H=(LinkList*)malloc(sizeof(ListNode));

InsertListNum(H);

PrintList(H);

printf("EntertheNumberyoucount:

\n");

scanf("%d",&x);

n=CountListSameNum(H,x);

printf("n=%d",n);

}

2.

#include"stdio.h"

#include"stdlib.h"

typedefstructListNode

{

intdata;

structListNode*next;

}ListNode,*LinkList;

voidInsertListNum(LinkListH)

{

ListNode*p,*q;

inti;

charch;

p=H;

printf("Enterthenumbers:

\n");

while(ch!

='\n')

{

q=(LinkList)malloc(sizeof(ListNode));

scanf("%d",&i);

q->data=i;

q->next=p->next;

p->next=q;

q=q->next;

ch=getchar();

}

}

intCountListSameNum(LinkListH,intx)

{

ListNode*p;

intcount=0;

p=H->next;

while(p)

{

if(p->data==x)

count++;

p=p->next;

}

returncount;

}

voidDeleteListNum(LinkListH,intx)

{

ListNode*p,*r;

intn;

p=H;

n=CountListSameNum(H,x);

if(n==0)

printf("Nofounding!

");

else

{

while(p)

{

if(p->data==x)

{

r=p->next;

p->next=r->next;

free(r);

break;//若将break去点,则可以删除所有的值为x的前驱结点

}

p=p->next;

}

while(p->next==NULL)

{

printf("\nThisNO.1,NoHead!

\n");

break;

}

}

}

voidPrintList(LinkListH)

{

ListNode*p;

p=H->next;

while(p)

{

printf("%d",p->data);

p=p->next;

}

printf("\n");

}

main()

{

intn,x1,x2;

LinkListH;

H=(LinkList*)malloc(sizeof(ListNode));

InsertListNum(H);

PrintList(H);

printf("EntertheNumberyoucount:

\n");

scanf("%d",&x1);

n=CountListSameNum(H,x1);

printf("n=%d",n);

printf("\n");

printf("Enterthenumberyoudelete:

\n");

scanf("%d",&x2);

DeleteListNum(H,x2);

PrintList(H);

}

3.

#include"stdio.h"

#include"stdlib.h"

typedefstructListNode

{

intdata;

structListNode*next;

}ListNode,*LinkList;

voidInsertListNum(LinkListH)

{

ListNode*p,*q;

inti=0;

charch=NULL;

p=H;

printf("Enterthenumbers:

\n");

while(ch!

='\n')

{

q=(LinkList*)malloc(sizeof(ListNode));

scanf("%d",&i);

q->data=i;

q->next=p->next;

p->next=q;

p=p->next;

ch=getchar();

}

}

voidSortListNum(LinkListH)

{

ListNode*p,*q;

p=H->next;

H->next=NULL;

while(p)

{

q=p;

p=p->next;

q->next=H->next;

H->next=q;

}

}

voidPrintList(LinkListH)

{

ListNode*p;

p=H;

printf("ThenewLinklistis:

\n");

p=p->next;

while(p)

{

printf("%d",p->data);

p=p->next;

}

printf("\n");

}

main()

{

LinkListH;

H=(LinkList*)malloc(sizeof(ListNode));

InsertListNum(H);

PrintList(H);

SortListNum(H);

PrintList(H);

}

4.

#include"stdio.h"

#include"stdlib.h"

typedefstructListNode

{

intdata;

structListNode*next;

}ListNode,*LinkList;

voidInsertListNum(LinkListH)

{

ListNode*p,*q;

inti;

charch;

p=H;

printf("Enterthenumbers:

\n");

while(ch!

='\n')

{

q=(LinkList)malloc(sizeof(ListNode));

scanf("%d",&i);

q->data=i;

q->next=p->next;

p->next=q;

q=q->next;

ch=getchar();

}

}

voidPrintList(LinkListH)

{

ListNode*p;

p=H->next;

while(p)

{

printf("%d",p->data);

p=p->next;

}

printf("\n");

}

intCountAllListNum(LinkListH)

{

ListNode*p;

inti=0;

p=H->next;

while(p)

{

p=p->next;

i++;

}

returni;

}

voidSortListNum(LinkListH)

{

ListNode*p,*s,*pt;

p=H;

s=p->next;

while(p->next!

=NULL)

{

while(s->next!

=NULL)

{

if(p->next->data>s->next->data)

{

pt=p->next;

p->next=s->next;

s->next=p->next->next;

p->next->next=pt;

}

elses=s->next;

}

p=p->next;

s=p->next;

}

}

voidInsertANum(LinkListH,intx)

{

ListNode*p,*q;

p=(ListNode*)malloc(sizeof(ListNode));

p->data=x;

p->next=NULL;

q=H;

while(q->next!

=NULL)

{

if(q->next->data>=x)

{

p->next=q->next;

q->next=p;

break;

}

q=q->next;

}

while(q->next==NULL)

{

q->next=p;

}

}

main()

{

intm,n;

LinkListH;

H=(LinkList)malloc(sizeof(ListNode));

InsertListNum(H);

PrintList(H);

n=CountAllListNum(H);

printf("%d\n",n);

SortListNum(H);

PrintList(H);

printf("Enterthenum:

\n");

scanf("%d",&m);

InsertANum(H,m);

PrintList(H);

}

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

当前位置:首页 > 初中教育 > 数学

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

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