数据结构 实验三 单链表

合集下载

数据结构实验报告--单链表

数据结构实验报告--单链表

数据结构实验报告--单链表数据结构实验报告--单链表1.引言1.1 研究目的本实验旨在通过实践的方式,深入了解单链表的数据结构以及相关操作,提升对数据结构的理解和应用能力。

1.2 实验内容本实验主要包括以下几个方面的内容:●单链表的基本定义和实现●单链表的插入、删除、遍历操作●单链表的逆置操作●单链表的查找和修改操作2.理论基础2.1 单链表的定义单链表是一种常见的线性数据结构,它由一系列的节点组成,每个节点包含数据和指向下一个节点的指针。

2.2 单链表的基本操作①单链表的插入操作在单链表中,可以通过插入操作在指定位置插入一个新节点,该操作主要包括以下步骤:●创建一个新的节点,并为其赋值●将新节点的next指针指向插入位置的后一个节点●将插入位置的前一个节点的next指针指向新节点②单链表的删除操作在单链表中,可以通过删除操作删除指定位置的节点,该操作主要包括以下步骤:●将删除位置的前一个节点的next指针指向删除位置的后一个节点●释放删除节点的内存③单链表的遍历操作单链表的遍历操作主要是依次访问链表中的每一个节点,并执行相应的操作。

④单链表的逆置操作单链表的逆置操作可以将一个单链表中的节点顺序进行颠倒。

⑤单链表的查找操作在单链表中,可以通过查找操作找到指定值的节点。

⑥单链表的修改操作在单链表中,可以通过修改操作修改指定位置的节点的值。

3.实验过程3.1 实验环境本次实验使用C语言进行编程,需要先安装相应的编程环境,如gcc编译器。

3.2 实验步骤①单链表的创建和初始化首先创建一个空链表,并初始化链表的头指针。

②单链表的插入操作按照需求,在链表的指定位置插入一个新节点。

③单链表的删除操作按照需求,删除链表中的指定位置的节点。

④单链表的遍历操作依次访问链表中的每一个节点,并输出其值。

⑤单链表的逆置操作将单链表中的节点顺序进行逆置。

⑥单链表的查找操作按照需求,在链表中查找指定值的节点。

3.2.7 单链表的修改操作按照需求,修改链表中指定位置的节点的值。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告实验目的:掌握单链表的基本操作,学会使用单链表实现各种算法。

实验内容:实现单链表的基本操作,包括创建、插入、删除、访问等。

利用单链表完成以下算法:- 单链表逆序- 查找单链表中的中间节点- 删除单链表中的倒数第K个节点- 合并两个有序单链表为一个有序单链表实验步骤:1. 创建单链表在创建单链表时,先定义一个结构体Node来表示链表中的节点,节点包括数据域和指针域,指针域指向下一个节点。

然后,用指针p指向链表的头节点,将头节点的指针域初始化为NULL。

2. 插入节点在单链表中插入节点的操作分为两种情况:- 在链表头插入节点- 在链表中间或尾部插入节点无论是哪种情况,先将新节点的指针域指向要插入的位置的下一个节点,再将要插入的位置的指针域指向新节点即可。

3. 删除节点删除链表节点的操作同样分为两种情况:- 删除头节点- 删除中间或尾部节点要删除头节点,先用一个指针将头节点指向的下一个节点保存起来,再将头节点释放掉。

要删除中间或尾部节点,先用一个指针指向要删除节点的前一个节点,然后将指向要删除节点的前一个节点的指针域指向要删除节点的下一个节点,最后将要删除的节点释放掉。

4. 单链表逆序单链表逆序可以使用三个指针来完成,分别为pre指针、cur指针和next指针。

首先将pre指针和cur指针指向NULL,然后循环遍历链表,将cur指针指向当前节点,将next指针指向当前节点的下一个节点,然后将当前节点的指针域指向pre指针,最后将pre指针和cur指针向前移动一个节点,继续进行循环。

5. 查找单链表中的中间节点查找单链表中的中间节点可以使用双指针法,将两个指针p1和p2都指向链表头,然后p1每次向前移动一个节点,而p2每次向前移动两个节点,当p2指向了链表尾部时,p1指向的节点即为中间节点。

6. 删除单链表中的倒数第K个节点删除单链表中的倒数第K个节点可以使用双指针法,在链表中定义两个指针p1和p2,p1指向链表头,p2指向第K个节点,然后p1和p2同时向前移动,直到p2指向链表尾部,此时p1指向的节点即为要删除的节点。

实验三 单链表的基本操作

实验三 单链表的基本操作

实验三单链表的基本操作一、实验目的1、掌握线性表的链式存贮结构及基本操作,深入了解链表的基本特性,以便在实际问题背景下灵活运用它们。

2、巩固该存贮结构的构造方法,深入理解和灵活掌握链表的插入、删除等操作。

二、实验要求1、定义一链表类型,并定义带有头结点的单链表。

2、将教材中链表的建立、初始化、插入、删除等函数实现。

3、链表能够存储10名学生的基本信息(包括姓名、学号和成绩)。

4、由主函数按照用户要求对各个链表操作访问。

5、每操作之前要有明确的说明,操作后要输出操作结果。

6、分析顺序表链表的插入、删除、查找的时间和空间复杂度。

三、实验内容1、在自己的U盘的“姓名+学号”文件夹中创建“实验3”文件夹,本次实验的所有程序和数据都要求存储到本文件夹中。

2、完成链表操作的如下函数:单链表的建立、插入、删除#include<stdio.h>#include<stdlib.h>static int N=5;typedef struct _sy{ char name[12];int no;struct _sy *next;}stud;stud *Create(int m) //创建链表{ int i;stud *h,*p,*q;h=(stud*)malloc(sizeof(stud));if(h!=NULL){ p=h;for(i=0;i<m;i++){ q=(stud*)malloc(sizeof(stud));if(q!=NULL){ printf("依次输入第%d个人的姓名和学号:\n",i+1);scanf("%s%d",q->name,&q->no);q->next=NULL;p->next=q;p=q;}}}printf("\n");return(h);}stud *Delete(stud *sy,int post) //删除一个学生的数据{ int i;stud *cur,*pre;cur=sy;if(0==post){ return(sy);}else{ if(1==post){ cur=cur->next;sy->next=cur->next;free(cur);}else{ for(i=2;i<post+1;i++){ cur=cur->next;pre=cur;}cur=cur->next;pre->next=cur->next;free(cur);}return(sy); }}stud *Insert(stud *sy,int post) //插入一个新的学生的数据 { int i;stud *cur,*pre,*node;if(sy!=NULL){ cur=sy;node=(stud*)malloc(sizeof(stud));if(node!=NULL){ printf("请输入新人的姓名和学号:\n");scanf("%s%d",node->name,&node->no);if(1==post){ node->next=sy->next;sy->next=node;}else{ for(i=2;i<post+2;i++){ pre=cur;cur=cur->next;}node->next=pre->next;pre->next=node;}}}printf("\n");return(sy);}void Print(stud *sy) //输出学生信息{ int post=1;stud *cur;cur=sy->next;printf("当前的学生信息如下所示:\n");while(cur!=NULL){ printf("第%d个人的姓名是:%s,学号为:%d\n",post,cur->name,cur->no); cur=cur->next;post++;}N=--post;}int main(){ int mm,post,i;stud *head;head=Create(N);Print(head);for(i=0;i<1;i++){ printf("请输入要删除的学号的位置:\n");scanf("%d",&mm);Delete(head,mm);Print(head);printf("请输入要插入学号的位置:\n");scanf("%d",&post);Insert(head,post);Print(head);}return 0;}。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告数据结构单链表实验报告一、实验目的本次实验的主要目的是通过实现单链表数据结构,加深对链表的理解,并通过实际操作掌握链表的基本操作。

二、实验环境1.操作系统:Windows 102.开发环境:C/C++语言3.开发工具:Visual Studio 2019三、实验内容本次实验的内容包括以下几个方面:1.单链表的定义与初始化1.1 单链表的结构定义1.2 创建一个空链表1.3 判断链表是否为空2.单链表的基本操作2.1 在链表头部插入节点2.3 在指定位置插入节点2.4 删除链表的指定节点2.5 查找链表中指定位置的节点2.6 修改链表中指定位置的节点2.7 输出链表中的所有节点3.单链表的应用示例3.1 操作链表实现栈3.2 操作链表实现队列3.3 链表逆置四、实验步骤与结果1.实验步骤1.1 定义一个节点结构体,包含数据域和指针域 1.2 创建一个空链表1.3 插入节点到链表的指定位置1.4 删除链表中的指定节点1.5 修改链表中的指定节点1.7 实现链表的应用示例2.实验结果经过以上步骤的操作,我们成功实现了单链表的各种基本操作,并实现了链表作为栈和队列的应用示例。

五、实验总结通过本次实验,我们深入理解了单链表的原理和基本操作,掌握了链表的插入、删除、查找等操作方法。

同时,我们还学会了如何应用链表来实现栈和队列等数据结构。

通过实际操作,巩固了对数据结构的理解和应用能力。

附件:无法律名词及注释:1.数据结构:是计算机存储、组织数据的方式,是指一组数据的表达方式,以及定义在该组数据上的一组操作。

2.链表:链表是一种常见的数据结构,用于存储有序的元素集合。

每个节点包含一个元素和一个指向下一个节点的指针。

单链表的实现实验报告

单链表的实现实验报告

单链表的实现实验报告篇一:数据结构单链表实验报告一、设计人员相关信息1. 设计者姓名、学号和班号:12地信李晓婧120122429832. 设计日期:2014.3. 上机环境:VC++6.0二、程序设计相关信息1. 实验题目:编写一个程序,实现单链表的各种基本运算(假设单链表的元素类型为char),并在此基础上设计一个程序,完成如下功能:(1)初始化单链表;(2)采用尾插法依次插入元素a,b,c,d,e;(3)输出单链表(4)输出单链表长度(5)判断单链表是否为空(6)输出单链表第3个元素(7)输出元素a的位置(8)在第4个元素位置上插入元素f(9)输出单链表(10)删除第三个元素(11)输出单链表(12)释放单链表2. 实验项目组成:(1)插入和删除节点操作(2)建立单链表尾插法建表(3)线性表基本运算在单链表中的实现初始化线性表销毁线性表判断线性表是否为空表求线性表的长度3. 实验项目的程序结构(程序中的函数调用关系图):4. 实验项目包含的各个文件中的函数的功能描述:? 尾插法建表CreateListR:将新节点插到当前链表的表尾上,为此必须增加一个尾指针r,使其始终指向当前链表的尾节点。

? 初始化线性表InitList:该运算建立一个空的单链表,即创建一个头节点;? 销毁线性表DestroyList:释放单链表占用的内存空间,即逐一释放全部节点的空间; ? 判断线性表是否为空表ListEmpty:若单链表没有数据节点,则返回真,否则返回假; ? 求线性表的长度ListLength:返回单链表中数据节点的个数;? 输出线性表DispList:逐一扫描单链表的每个数据节点,并显示各节点的data域值;? 求线性表中某个数据元素值GetElem:在单链表中从头开始找到第i个节点,若存在第i个数据节点,则将其data域值赋给变量e;? 按元素值查找LocateElem:在单链表中从头开始找第一个值域与e相等的节点,若存在这样的节点,则返回逻辑序号,否则返回0;? 插入数据元素ListInsert:先在单链表中找到第i1个节点*p,若存在这样的节点,将值为e的节点*s插入到*p节点的后面;? 删除数据元素ListDelete:先在单链表中找到第i1个节点*p,若存在这样的节点,且也存在后继节点*q;删除*q节点,返回TRUE;否则返回FALSE表示参数i错误。

《数据结构》实验3链表

《数据结构》实验3链表
二、源代码以及输入数据输出结果为:
三、源代码以及实验结果为
四、源代码以及实验结果为
五、源代码以及实验结果为
六、源代码以及实验结果为
七、附加题以及实验体会:
{
NODE *s; /*定义指向结点类型的指针*/
s=(NODE *)malloc(sizeof(NODE));
/*生成新结点*/
3
4
5
return 1;
}
/*删除P所指向的结点的后继结点*/
void DelLinkList(NODE *p)
{ NODE *q;
if(p->next!=0)
{ q=p->next; /* q指向p的后继结点*/
ch=getchar();
while(ch!='$')
{ p=(NODE *)malloc(sizeof(NODE));
p->data=ch;
1
2
ch=getchar();
}
return (head);
}
/*在链表的P指定结点之后插入值为x的结点*/
int InsLinkList(NODE *p, char x)
四、设有两个单链表A、B,其中元素递增有序,编写算法将A、B归并成一个按元素值递减(允许有相同值)有序的链表C,要求用A、B中的原结点形成,不能重新申请结点。
五、已知单链表表示的线性表中含有两类的数据元素(字母字符,数字字符)。试设计算法,按结点的值将单链表拆分成两个循环链表,分别只含有数字或字母。要求:利用原表中的结点空间作为这两个表的结点空间,头结点可另开辟空间。
附加题:如果换成循环单链表该如何实现?
即题目变成:已知单循环链表表示的线性表中含有两类的数据元素(字母字符,数字字符)。试设计算法,按结点的值将单链表拆分成两个循环链表,分别只含有数字或字母。

链表实验报告

链表实验报告

链表实验报告一、实验目的链表是一种常见的数据结构,本次实验的主要目的是深入理解链表的概念、原理和操作,通过实际编程实现链表的创建、插入、删除、遍历等基本操作,掌握链表在数据存储和处理中的应用,提高对数据结构的理解和编程能力。

二、实验环境本次实验使用的编程语言为 C 语言,开发工具为 Visual Studio Code。

三、实验原理链表是一种动态的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

链表的优点是可以灵活地进行插入和删除操作,不需要像数组那样移动大量的数据。

链表分为单向链表、双向链表和循环链表等。

单向链表只有一个指向下一个节点的指针,双向链表有指向前一个节点和后一个节点的指针,循环链表的尾节点指向头节点,形成一个环形结构。

四、实验步骤1、单向链表的创建定义链表节点结构体,包含数据域和指针域。

编写创建链表的函数,通过动态分配内存创建链表节点,并将节点连接起来。

2、单向链表的插入操作实现头部插入、尾部插入和中间插入的函数。

在插入时,需要处理指针的更新,确保链表的连接正确。

3、单向链表的删除操作编写删除指定节点的函数。

删除节点时,要释放被删除节点的内存,并更新相邻节点的指针。

4、单向链表的遍历实现遍历链表并打印节点数据的函数。

5、双向链表的创建与操作类似于单向链表,定义双向链表节点结构体,并实现创建、插入、删除和遍历的函数。

注意双向链表中指针的更新方式与单向链表的不同。

6、循环链表的创建与操作定义循环链表节点结构体,创建循环链表。

实现循环链表的插入、删除和遍历操作,处理好尾节点与头节点的连接。

五、实验结果与分析1、单向链表成功创建了单向链表,并能够正确进行头部、尾部和中间的插入操作。

删除操作也能准确删除指定节点,并释放内存。

遍历输出的结果与预期相符。

2、双向链表双向链表的创建和各种操作都能正常执行,指针的更新没有出现错误。

在双向链表中,插入和删除操作的效率相对单向链表有所提高,因为可以直接通过前向指针进行操作。

数据结构实验报告--单链表

数据结构实验报告--单链表

2016级数据结构实验报告实验名称:实验一线性表——题目1学生姓名:李文超班级: 2015661131班内序号: 15学号: 2015522147日期: 2016年11月13日1.实验要求实验目的:根据线性表的抽象数据类型的定义,选择下面任一种链式结构实现线性表,并完成线性表的基本功能。

线性表存储结构(五选一):1、带头结点的单链表2、不带头结点的单链表3、循环链表4、双链表5、静态链表线性表的基本功能:1、构造:使用头插法、尾插法两种方法2、插入:要求建立的链表按照关键字从小到大有序3、删除4、查找5、获取链表长度6、销毁7、其他:可自行定义编写测试main()函数测试线性表的正确性。

2.程序分析2.1 存储结构单链表的存储:(1)链表用一组任意的存储单元来存放线性表的结点。

这组存储单元既可以是连续的,也可以是不连续的,甚至零散地分布在内存的某些位置。

(2)链表中结点的逻辑次序和物理次序不一定相同。

为了能正确表示结点间的逻辑关系,在存储每个元素值的同时,还要存储该元素的直接后继元素的位置信息,这个信息称为指针或链。

结点结构┌──┬──┐ data域---存放结点值的数据域│data│next│ next域---存放结点的直接后继的地址的指针域└──┴──┘单链表在内存中的存储示意地址内存单元1000H头指针 1020H1080H10C0H2.2 关键算法分析1、关键算法:(1)头插法自然语言描述:a:在堆中建立新结点b:将a[i]写入到新结点的数据域c:修改新结点的指针域d:修改头结点的指针域。

将新结点加入链表中伪代码描述a:Node <T> * s=new Node <T>b:s->data=a[i]c:s->next=front->next;d:front->next=s(2)尾插法自然语言描述:a:在堆中建立新结点:b:将a[i]写入到新结点的数据域:c:将新结点加入到链表中d:修改修改尾指针伪代码描述a:Node <T> * s=new Node <T>b:s->data=a[i]c:r->next=s;d:r=s(3)遍历打印函数自然语言描述:a:判断该链表是否为空链表,如果是,报错b:如果不是空链表,新建立一个temp指针c:将temp指针指向头结点d:打印temp指针的data域e:逐个往后移动temp指针,直到temp指针的指向的指针的next域为空伪代码描述a: If front->next==NULL①Throw ”an empty list ”②Node<T>* temp=front->next;b:while(temp->next)c:cout<<temp->data<<" ";d:temp=temp->next;(4) 获取链表长度函数自然语言描述:a:判断该链表是否为空链表,如果是,输出长度0b:如果不是空链表,新建立一个temp指针,初始化整形数n为0c:将temp指针指向头结点d:判断temp指针指向的结点的next域是否为空,如果不是,n加一,否则return n e: 使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next域为0,返回n伪代码描述a:if ront->next==NULLb:Node<T>* temp=front->next;c:while(temp->next)d:temp=temp->next;(5)析构/删除函数自然语言描述:a:新建立一个指针,指向头结点b:判断要释放的结点是否存在,c:暂时保存要释放的结点d:移动a中建立的指针e:释放要释放的指针伪代码描述a:Node <T> * p=frontb:while(p)c:front=pd:p=p->nexte:delete front(6)按位查找函数a:初始化工作指针p和计数器j,p指向第一个结点,j=1b:循环以下操作,直到p为空或者j等于1①:p指向下一个结点②:j加1c:若p为空,说明第i个元素不存在,抛出异常d:否则,说明p指向的元素就是所查找的元素,返回元素地址伪代码描述a:Node <T> * p=front->next;j=1;b:while(p&&j!=1)①:p=p->next②:j++c:if(!p) throw ”error”d:return p(7)按位查找函数自然语言描述:a:初始化工作指针p和计数器j,p指向第一个结点,j=1b:循环以下操作,找到这个元素或者p指向最后一个结点①:判断p指向的结点是不是要查找的值,如果是,返回j,否则p指向下一个结点,并且j的值加一c:如果找到最后一个结点还没有找到要查找的元素,返回查找失败信息伪代码描述a:Node <T> * p=front->next;j=1;b:while(p)①: if(p->next==x) return jp=p->nextj++c:return “error”(8)插入函数自然语言描述:a:在堆中建立新结点b:将要插入的结点的数据写入到新结点的数据域c:修改新结点的指针域d:修改前一个指针的指针域,使其指向新插入的结点的位置伪代码描述a:Node <T> * s=new Node <T>;b:s-data=p->datac:s->next=p->nextd:p->next=se:p->data=x(9)删除函数a:从第一个结点开始,查找要删除的位数i前一个位置i-1的结点b:设q指向第i个元素c:将q元素从链表中删除d:保存q元素的数据e:释放q元素伪代码描述a:q=p->nextb:p->next=q->nextc:x=q->datad:delete q2、代码详细分析(插入):(1)从第一个结点开始,查找节点,使它的数据比x大,设p指向该结点:while (x>p->data) { p=p->next;}(2)新建一个节点s,把p的数据赋给s: s->data=p->data;(3)把s加到p后面:s->next=p->next; p->next=s;(4)p节点的数据用x替换:p->data=x;示意图如图所示3、关键算法的时间复杂度:O(1)3.程序运行结果1. 流程图:2、结果截图3.测试结论:可以正确的对链表进行插入,删除,取长度,输出操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

}
void GetElem_L(LinkList L,int i, ElemType &e) { LinkList p=L->next; int k=1; while (p&&k<i) { k++; p=p->next; } if(p!=NULL) e=p->data; else ErrorMessage("i值不合法!"); } // 7. 在链表中查找第一个值和e相等的数据元素,若存在,则返回它在 链表中的位置, // 即指向该数据元素所在结点的指针;否则返回 NULL LNode* LocateElem_L( LinkList L, ElemType e) { LNode *p=L->next; while ( p && p->data.num!=e.num ) { p=p->next; } return p; } // 8. 依次输出链表中每一个结点中的数据元素的内容(遍历) void visit(ElemType e) //输出单个数据元素的内容 { cout<<setiosflags(ios_base::left)<<setw(8)<<e.num<<setw(10)<< <<resetiosflags(ios_base::left)<<setw(4)<<e.sex<<setw(8) <<e.score<<endl;; } void ListTraverse_L( LinkList L) { cout<<" ======== 学生基本信息表 ========"<<endl<<endl; cout<<" 编号 姓名 性别 成绩"<<endl;
LinkList p=L->next; while ( p ) { visit(p->data); p=p->next; }; } // 9. 在链表中将 s 结点插入到 p 结点之前 void ListInsert_L( LinkList &L, LNode *p, LNode* s ) //带头结点 { LNode *q = L; while (q->next!=p ) q = q->next; // 查找 p 的前驱 q q->next = s; s->next = p; // 在q结点之后插入s结点 } //将对首元结点的操作和其他结点的操作统一起来 // 10. 从链表中删除p结点并由e返回其元素 void ListDelete_L( LinkList &L, LNode* p, ElemType &e ) //带头结点 { LNode *q = L; while (q->next !=p) q = q->next; // 查找 p 的前驱结点 q q->next = p->next ; // 修改 q 结点的指针域 e = p->data; // 返回被删结点的数据元素 delete p; // 并释放结点空间 } // 11. 逆置创建单链表 // 已知一维数组A[n]中存有线性表的数据元素,逆序创建单链线性表L void CreateList_H(LinkList &L, ElemType A[], int n ) //带头结点 { LinkList s; L = new LNode; L->next=NULL; // 先建立一个空的单链表 for ( int i=n-1; i>=0; --i ) { s = new LNode; nkList.h" const int N=3; void main() { LinkList L; ElemType a[N]; cout<<"请放入"<<N<<"个学生的编号、姓名、性别和成绩建立单链 表:\n"; for(int i=0;i<N;i++) cin>>a[i].num>>a[i].name>>a[i].sex>>a[i].score; CreateList_L(L,a,N); cout<<"建立的单链表为:"<<endl; ListTraverse_L(L); LNode *s=new LNode; cout<<"请输入要插入的学生的编号、姓名、性别和成绩:\n"; cin>>s->data.num>>s->>>s->data.sex>>s->data.score; ListInsert_L(L,L->next,s); cout<<"在第一个结点前插入结点后:"<<endl; ListTraverse_L(L); ElemType e; cout<<"请输入要删除学生的编号:\n"; cin>>e.num; if (LocateElem_L(L,e)) { ListDelete_L(L,LocateElem_L(L,e),e); cout<<"删除的元素为:"<<e.num<<" "<<<<" "<<e.sex<<" " <<e.score<<endl; } else cout<<"链表中不存在该元素."<<endl; ListTraverse_L(L); InvertLinkedList(L); cout<<"逆置单链表后:"<<endl; ListTraverse_L(L); cout<<"单链表长度为: "<<ListLength_L(L)<<endl;
LinkList p=L->next; while(p!=NULL) { L->next=p->next; delete p; p=L->next; } } // 4. 判断链表是否为空 bool ListEmpty_L( LinkList L) { if (!L->next) return true; return false; } // 5. 求链表的长度 int ListLength_L( LinkList L) { LinkList p=L->next; int k=0; while ( p ) { k++; p=p->next; } return k; } // 6. 查找链表中的第i个元素 void ErrorMessage(char* s) { cout<<s<<endl; exit(0); }
实验三 单链表的C++实现
一、实验目的:掌握单链表的定义及操作的C++语言实现方法。 二、实验内容: 已知数据元素的类型定义如下: typedef struct { long num;// 编号 char name[20]; //姓名 char sex; //性别 float score; //成绩 }ElemType; 1.设计头文件LinkList.h,包含数据类型定义和顺序表的基本操作; 2.设计程序文件LinkList.cpp,利用单链表完成一个班级学生信息的管 理,实现:学生信息的输入、删除、插入、查询、输出、逆置等功能。 注:学生基本信息存入二进制文件Student.dat 学生表格式如下: 编号 姓名 性别 成绩 1001 LI M 78 1002 ZHANG F 87 1003 WANG F 67 …… 附程序清单: LinkList.h #include <iostream> #include <iomanip> #include <fstream> #include <process.h> using namespace std; // 数据元素结构定义 typedef struct { long num; //编号 char name[20]; //姓名 char sex; //性别
float score; //成绩 }ElemType; // 结点的结构定义 struct LNode { ElemType data; struct LNode *next; }; typedef struct LNode LNode; // LNode为结点类型 typedef struct LNode *LinkList; //LinkList为指针类型 //基本操作的实现 // 1. 初始化操作 void InitList_L(LinkList &L) //带头结点的单链表 { L= new LNode ; //生成一个头结点 L->next=NULL; //设置一个空表让头结点的指针域为空 } // 2. 销毁线性表 void DestroyList_L(LinkList &L) { LinkList p=L->next; while(p!=NULL) { L->next=p->next; delete p; p=L->next; } delete L; } // 3. 清空线性表 void ClearList_L(LinkList &L) {
s->data = A[i]; // 赋元素值 s->next = L->next; L->next= s; } // 插入在第一个结点之前 } // 12. 建立单链表(正序) // 已知一维数组A[n]中存有线性表的数据元素,创建顺序单链线性表L void CreateList_L(LinkList &L, ElemType A[], int n ) //带头结点 { LNode *p,*s; L = new LNode; L->next=NULL; p=L; // 先建立一个空的单链表 for ( int i=0; i <= n-1; ++i ) { s=new LNode; // 生成新结点 s->next= NULL; s->data = A[i]; // 赋元素值 p->next =s; p=s; } } // 13. 逆置单链表 void InvertLinkedList( LinkList &L ) //带头结点 { LNode *p,*s; p = L->next; L->next = NULL; while ( p ) { s = p; p = p->next; // 从 p 所指链表中删除第一个结点(s 结点) s->next = L->next; L->next = s; } // 将 s 结点插入到逆置表的表头 } LinkList.cpp
相关文档
最新文档