数据结构课程实验报告(链表)

合集下载

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构实验报告

数据结构实验报告

数据结构实验报告
本次数据结构实验的任务主要包括两部分,分别是学习使用链表数据结构和掌握链表排序算法。

在此基础上,我们完成了一组关于链表基本操作和排序算法的实验。

实验一:链表基本操作
在这个实验中,我们学习了链表的插入、删除、查找等基本操作。

链表的插入和删除操作是通过一个链表节点来实现的。

链表节点包括一个数据域和一个指向下一个节点的指针域。

通过修改指针域,我们就可以实现节点的插入和删除操作。

具体来说,我们编写了一个基本的链表程序,其中包括链表头指针初始化、链表节点插入、链表节点删除、查找指定节点等操作。

通过对程序的调试和功能测试,我们验证了链表操作的正确性。

实验二:链表排序算法
在这个实验中,我们学习了链表排序算法,并编写了链表的快速排序和归并排序两种算法。

快速排序是一种分治思想的排序算法,通过选择一个基准元素,分别将小于和大于基准元素的元素分别放在它的左右两边,再递归地对左右两个子序列进行排序,最终得到有序序列。

归并排序是另一种经典的排序算法,它利用归并思想,将两个有序序列合并成一个更大的有序序列,这个过程不断重复,最终得到完整的有序序列。

通过实现这两种排序算法,并在大样本数据下进行测试,我们验证了算法的正确性和效率。

实验总结:
通过本次实验,我们深入学习了链表数据结构的相关基本操作和排序算法的实现原理。

同时,在实际编程实践中,我们也掌握了链表程序的调试、测试和优化技术。

这些都是我们今后从事软件开发工作需要掌握的重要技能,在这个方面的积累将会对我们有很大帮助。

数据结构实验报告2

数据结构实验报告2

数据结构实验报告2一、实验目的本次数据结构实验旨在通过实际操作和编程实践,深入理解和掌握常见的数据结构,如链表、栈、队列、树等,并能够运用所学知识解决实际问题,提高编程能力和算法设计能力。

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

三、实验内容(一)链表的实现与操作1、单向链表的创建首先,定义了链表节点的结构体,包含数据域和指向下一个节点的指针域。

然后,通过函数实现了单向链表的创建,从用户输入获取节点的数据,依次创建新节点并连接起来。

2、链表的遍历编写函数实现对单向链表的遍历,依次输出每个节点的数据。

3、链表的插入与删除实现了在指定位置插入节点和删除指定节点的功能。

插入操作时,需要找到插入位置的前一个节点,修改指针完成插入。

删除操作时,同样找到要删除节点的前一个节点,修改指针并释放删除节点的内存。

(二)栈的实现与应用1、栈的基本操作使用数组实现了栈的数据结构,包括入栈、出栈、判断栈空和获取栈顶元素等操作。

2、表达式求值利用栈来实现表达式求值的功能。

将表达式中的数字和运算符分别入栈,按照运算规则进行计算。

(三)队列的实现与应用1、队列的基本操作使用循环数组实现了队列,包括入队、出队、判断队空和队满等操作。

2、模拟银行排队系统通过创建队列来模拟银行客户的排队情况,实现客户的入队和出队操作,统计平均等待时间等。

(四)二叉树的遍历1、二叉树的创建采用递归的方式创建二叉树,用户输入节点数据,构建二叉树的结构。

2、先序、中序和后序遍历分别实现了二叉树的先序遍历、中序遍历和后序遍历,并输出遍历结果。

四、实验结果与分析(一)链表实验结果成功创建、遍历、插入和删除单向链表。

通过对链表的操作,深入理解了链表的动态存储特性和指针的运用。

在插入和删除操作中,能够正确处理指针的修改和内存的释放,避免了内存泄漏和指针错误。

(二)栈实验结果栈的基本操作运行正常,能够正确实现入栈、出栈等功能。

数据结构单链表实验报告

数据结构单链表实验报告

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

二、实验环境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_城市链表

数据结构课程设计实验1_城市链表

数据结构课程设计实验报告实验一链表部分选题为:2.4.3—城市链表1、需求分析(1)创建一个带有头结点的单链表。

(2)结点中应包含城市名和城市的位置坐标。

(3)对城市链表能够利用城市名和位置坐标进行有关查找、插入、删除、更新等操作。

(4)能够对每次操作后的链表动态显示。

2、概要设计为了实现以上功能,可以从以下3个方面着手设计。

(1)主界面设计为了实现城市链表相关操作功能的管理,设计一个含有多个菜单项的主控菜单子程序以系统的各项子功能,方便用户使用本程序。

本系统主控菜单运行界面如下所示。

(2)存储结构设计本系统主要采用链表结构类型来表示存储在“城市链表”中的信息。

其中链表结点由4个分量组成:城市名name、城市的横坐标posx、城市的纵坐标posy、指向下一个结点的指针next。

(3)系统功能设计本程序设计了9个功能子菜单,其描述如下:①建立城市链表。

由函数creatLink()实现。

该功能实现城市结点的输入以及连接。

②插入链表记录。

由函数insert()实现。

该功能实现按坐标由小到大的顺序将结点插入到链表中。

③查询链表记录。

由searchName()函数和searchPos()函数实现。

其中searchName()实现按照城市名查询的操作,searchPos()实现按照城市坐标查询的操作。

④删除链表记录。

由delName()函数和delPos()函数实现。

其中delName()函数实现按照城市名删除的操作,delPos()函数实现按照城市坐标删除的操作。

⑤ 显示链表记录。

由printList ()函数实现。

该功能实现格式化的链表输出操作,可以显示修改后的链表状态。

⑥ 更新链表信息。

由update ()函数实现。

该功能实现按照城市名更新城市的坐标信息。

⑦ 返回城市坐标。

由getPos ()函数实现。

该功能实现给定一个已存储的城市,返回其坐标信息的操作。

⑧ 查看与坐标P 距离小于等于D 的城市。

由getCity ()函数实现。

数据结构实验报告之链表(终极版本)

数据结构实验报告之链表(终极版本)

五、 用户使用说明
1、 本程序的运行环境为 Microsofe VC++ 6.0,执行文件为:***.c。 2、 进入界面后只需汇编、建立、执行即可得出结果。
六、测试结果: 1:70 3:75 2:85 4:90 ********************** ********************** ********************** ********************** 8:50 5:60 7:76 6:80 ********************** ********************** ********************** ********************** 8:50 5:60 1:70 3:75 7:76 6:80 2:85 4:90 ********************** ********************** ********************** ********************** ********************** ********************** ********************** ********************** Press any key to continue
} a=a->next; } }
4. 编写函数实现链表 a 和链表 b 的合并:
list *merge(list *a,list *b)
{
list *rt=NULL,*n=NULL,*now=NULL; while (a&&b) { n=(list *)malloc(sizeof(node)); n->next=NULL; if (a->score<=b->score) { n->id=a->id; n->score=a->score; a=a->next; } else { n->id=b->id; n->score=b->score; b=b->next ; } if (!rt) { rt=now=n; } else{ now->next=n; now=n; } } while (a) { n=(list *)malloc(sizeof(node)); n->next=NULL; n->id=a->id; n->score=a->score; now->next=n; now=n; a=a->next ; } while (b) { n=(list *)malloc(sizeof(node));

链表实验报告总结

链表实验报告总结

篇一:链表实验报告数据结构实验报告姓名;方钢学号:20105567 专业:电子商务班级: 10-1班指导教师:实验时间:实验地点:新区实验楼4楼(实验题目)单链表实验1.实验内容和要求1.1实验要求①本次实验中的链表结构均为带头结点的单链表;②链表结构定义,算法实现放入库文件“linklist.h”;运算和变量命名直观易懂,并有相应的注释1.2实验内容&lt;1&gt;求链表中第i个结点的指针(函数),若不存在,则返回null。

&lt;2&gt;在第i 个结点前插入值为x的结点。

&lt;3&gt;删除链表中第i个元素结点。

&lt;4&gt;在一个递增有序的链表l中插入一个值为x的元素,并保持其递增有序特性。

&lt;5&gt;将单链表l中的奇数项和偶数项结点分解开(元素值为奇数、偶数),申请2个头结点,把分开的奇数项和偶数项分别链接到这2个头结点上,然后再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以便对照求解结果。

&lt;6&gt;求两个递增有序链表l1和l2中的公共元素,并以同样方式连接成链表l3。

2.实验目的2.1 理解线性表的链式存储结构。

2.2熟练掌握单链表结构及有关算法的设计。

2.3根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。

3.数据结构设计&lt;1&gt;求链表中第i个结点的指针(函数),若不存在,则返回null。

实验代码node *l,*p;int i; createnode(*&amp;l); //尾插法创建一个链表,cout&lt;&lt;链表包含:&lt;&lt;endl;p=l-&gt;next; while(p){cout&lt;&lt;p-&gt;data&lt;&lt;,;p=p-&gt;next; }cout&lt;&lt;endl;cout&lt;&lt;请输入待求元素序号:;cin&gt;&gt;i; locatenode (l, i, &amp;p );if(p!=null)cout&lt;&lt;序号&lt;&lt;i&lt;&lt;的元素值为:&lt;&lt;p-&gt;data&lt;&lt;endl;elsecout&lt;&lt;null&lt;&lt;endl;destroylist(l); //销毁链表,释放heap内存_crtdumpmemoryleaks(); //debug 模式下检测是否内存泄漏测试截图&lt;2&gt;在第i个结点前插入值为x的结点。

链表实验报告1

链表实验报告1

1、熟练掌握线性表的基本操作在两种存储结构上的实现。

2、会用线性链表解决简单的实际问题。

该程序的功能是实现单链表的定义和操作。

该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。

其中,程序中的单链表(带头结点)结点为结构类型,结点值为整型。

单链表操作的选择以菜单形式浮现,如下所示:please input the operation:1.初始化2.清空3.求链表长度4.检查链表是否为空5.检查链表是否为满 6.遍历链表(设为输出元素) 7.从链表中查找元素 8.从链表中查找与给定元素值相同的元素在表中的位置9.向链表中插入元素 10. 从链表中删除元素其他键退出。

设编号为 1,2,3,……, n 的 n(n>0)个人按顺时针方向围坐一圈,每一个人持有一个正整数密码。

开始时任选一个正整数做为报数上限 m,从第一个人开始顺时针方向自 1 起顺序报数,报到 m 时住手报数,报 m 的人出列,将他的密码作为新的m 值,从他的下一个人开始重新从 1 报数。

如此下去,直到所有人全部出列为止。

令n 最大值取 30。

要求设计一个程序摹拟此过程,求出出列编号序列。

struct node //结点结构{int number; /* 人的序号*/int cipher; /* 密码*/struct node *next; /* 指向下一个节点的指针*/};/* 定义 DataType 为 int 类型 */typedef int DataType;/* 单链表的结点类型 */typedef struct LNode{ DataType data;struct LNode *next;}LNode,*LinkedList;LinkedList LinkedListInit(){ //函数功能:对链表进行初始化参数:链表(linklist L) 成功初始化返回 1, 否则返回 0 }void LinkedListClear(LinkedList &L){//函数功能:把链表清空参数:链表(linklist L) 成功清空链表返回 1 }int LinkedListEmpty(LinkedList L){ //函数功能:判断链表是否为空参数:链表(linklist L) 链表为空时返回 0, 不为空返回 1 }void LinkedListTraverse(LinkedList L){ //函数功能:遍历链表,输出每一个节点的 elem 值参数:链表(linklist L) 通过循环逐个输出节点的 elem 值 }int LinkedListLength(LinkedList L){ //函数功能:返回链表的长度参数:链表(linklistL) 函数返回链表的长度 }LinkedList LinkedListGet(LinkedList L,int i){ //函数功能: 从链表中查找有无给定元素参数;链表(linklist L),给定元素 (int i) 如果链表中有给定元素(i)则返回 1,否则返回 0 }LinkedList LinkedListLocate(LinkedList L, DataType x){//函数功能: 从链表中查找给定元素的位置参数;链表(linklist L),给定元素(int i) 如果链表中有给定元素 i 则返回元素的位置, 没有则返回 0 }void LinkedListInsert(LinkedList &L,int i,DataType x)}void LinkedListDel(LinkedList &L,DataType x)i 个结点 }(二)、zhujiemian();cin>>a;do{switch(a){case 1:if(init(L)==1)cout<<"成功初始化! "<<endl;elsecout<<"初始化失败! "<<endl;break;case 2:if(makeempty(L)==1)cout<<"链表已清空! "<<endl;elsecout<<"链表清空失败! "<<endl;break;case 3:b=getlength(L);cout<<"链表的长度为: "<<b<<endl;break;case 4:if(isempty(L)==1)cout<<"链表不为空! "<<endl;elsecout<<"链表为空! "<<endl;break;case 5:if(isfull(L)==1)cout<<"链表不满! "<<endl;elsecout<<"链表已满! "<<endl;break;case 6:show(L);break;case 7:cout<<"输入您要查找的元素: ";cin>>b;if(find(L,b)==1)cout<<"链表中有该元素"<<b<<endl;elsecout<<"链表中没有您要查找的元素"<<b<<endl;break;case 8:cout<<"您要查找的元素为: "<<endl;cin>>b;if(location(L,b)==0)cout<<"没有您要查找的元素"<<b<<endl;elsecout<<"您查找的元素 "<<b<<"在第"<<location(L,b)<<"个位置。

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

5、 使用说明及测试结果
程序执行后显示以下内容: 创建单链表; 选择以下功能:1插入,2删除,3查找,4求表长; 选择各自功能时执行各自的程序; 结束程序;
六、 源程序(带注释)
#include <stdio.h> #include <stdlib.h> #define listType int #define placeholder d // 此单链表的头结点不用来存储数据。 typedef struct _NODE{
数据结构课程实验报告
实验题ቤተ መጻሕፍቲ ባይዱ:单链表的基本算法
班级 通信143 姓名 刘峻霖 星期四 学号 2014101108 日期 2015年6月18日
1、 需求分析
1. 程序的功能: 本程序主要你完成单链表的生成,实现在任意位置的插入、删除, 链表的查找和求表长等功能。 2. 输入输出的要求: 当选择删除功能时,从键盘读入欲删除的元素位置,按指定位置删 除;当选择插入功能时,从键盘读入新元素值和被插入位置,在指 定位置插入;当选择查找功能时,从键盘读入欲查找的元素值,返 回其位置序号;当选择求表长功能时,返回该单链表表长的数值。 每种操作结束后,都能在屏幕上打印出此时单链表元素的遍历结果 3. 测试数据: A:插入操作中依次输入数据,如输入11,12,13,14,15,16,生成一个 单链表。 B:查找操作中依次输入12,15,22,返回3个元素在单链表中的位置。 C:删除操作中依次输入2,5,删除位于2和5的元素。
node *p; init_list( ); while (1) { printf("\n-----------------options------------------\n"); printf("------1, 插入数据-------------------------\n"); printf("------2, 删除数据-------------------------\n"); printf("------3, 数据查找-------------------------\n"); printf("------4, 求出长度-------------------------\n"); printf("------5, 结束程序-------------------------\n"); printf("------------------------------------------\n"); printf("------------------------------------------\n"); printf("请选择(1,2,3,4):"); scanf(" %c", &choice); switch (choice) { case '1': printf("\nPlease input the index that you want to insert :"); scanf("%d", &pos); printf("\nPlease input the data that you want to insert :"); scanf("%d", &data); insert_list(pos, data); printf("\nChanged list is :"); for (p=head; p->next;) { p=p->next; printf(" %d", p->data); } break; case '2': printf("\nPlease input the index of the data :"); scanf("%d", &pos); delete_list(pos); printf("\nChanged list is :"); for (p=head, p=p->next; p; p=p->next) printf(" %d", p->data); break;
listType data; struct _NODE *next; } node; //-----global variable define-----node *head = NULL; //--------function define------// 从有数据起,下标为1; int length_list() { int i = 0; node *p; for (p=head; p->next; ) { i++; p=p->next; printf("%d,", p->data); } return i; } void destroy_list( ) { node *p = head; while (p) { p=p->next; free(head); head = p; } } void init_list( ) { node *p; char ch; if (head == NULL) head = (node *)malloc(sizeof(node)); else {
return 1; } int delete_list(int pos) { int i; node *p=head, *q; for (i=0; p->next != NULL && i<pos-1; i++, p=p->next); if (i > pos-1 || p->next == NULL) { printf("illegal position!"); return 0; } q=p->next; p->next = q->next; free(q); printf("Success////"); } int find_list( listType data) { node *p = head; int i = 0; while (p) { if (p->data == data) return i; p=p->next; i++; } return -1; } int main(void) { char choice; int pos; int length; listType data;
3、 详细设计
1. 采用c语言定义相关的数据类型; C语言中单链表的节点结构为: typedef struct _NODE{
listType data; struct _NODE *next; } node; 2. 写出各模块的伪码算法; 插入:int insert_list (int pos, listType data) 删除:int delete_list(int pos) 查找:int find_list( listType data) 求表长:int length_list() 3. 画出函数的调用关系图。 提供选择:1-》插入,2-》删除,3-》查找,4-》求表长 执行1时调用函数init_list(),2时调用delete_list(),3时调用find_list (),4时调用length_list()
2、 概要设计
1. 本程序所用的抽象数据类型的定义 typedef struct _NODE{ listType data; struct _NODE *next; } node; 2. 主程序的流程及各程序模块之间的层次关系。 主程序流程如下: 申请空间创建一个单链表 初始化单链表 为用户提供插入、删除、查找、结束四个选项 用户选择时执行各自模块的功能(各模块呈并列关系) 结束程序
destroy_list( ); head = NULL; init_list( ); } printf("Please input numbers :\n"); head->next = (node *)malloc(sizeof(node)); for (p=head->next; ; ) { scanf("%d", &p->data); if (ch=getchar() == '\n') break; p->next = (node *)malloc(sizeof(node)); p = p->next; p->next = NULL; } printf("\nInput data is :"); for (p=head; p->next; ) { p=p->next; printf("%d,", p->data); } } int insert_list (int pos, listType data) { int i; node *p = head, *q; for (i=0, p=head; i < pos-1 && p!=NULL; p=p->next, i++); if (p == NULL || i>pos-1) { printf("illegal position!"); return 0; } q = (node *)malloc(sizeof(node)); q->data = data; q->next = p->next; p->next = q;
4、 调试分析
1. 调试中遇到的问题及对问题的解决方法; 调用函数时没注意形参与实参的对应关系,导致主函数执行错误。要 仔细注意程序中函数名是否误用。 2. 算法的时间复杂度和空间复杂度。 插入运算的主要操作是比较,以寻找插入位置。比较的次数与插入 位置i有关,在最好的情况下即i=1时比较的次数为0在最坏的情况即 i=n+1时比较的次数为n次。平均次数为n/2。最坏的情况下插入运算 的时间复杂度为O(n)。 删除运算的主要操作是比较,以寻找删除节点。比较的次数与删除 位置i有关,在最好的情况下即i=1时比较的次数为0在最坏的情况即 i=n时比较的次数为n-1次。平均次数为n/2。最坏的情况下删除运算 的时间复杂度为O(n)
相关文档
最新文档