数据结构课程设计-- 循环单链表
单链表课程设计
单链表课程设计一、课程目标知识目标:1. 学生能理解单链表的基本概念,掌握其结构特点及在数据结构中的重要性。
2. 学生能够运用所学知识,实现单链表的创建、插入、删除和查找等基本操作。
3. 学生能够掌握单链表与数组、栈、队列等其他数据结构的关系与区别。
技能目标:1. 学生能够运用编程语言(如C、C++等)实现单链表的相关操作,提高编程能力。
2. 学生能够通过实际操作,培养解决实际问题的能力,提高逻辑思维能力。
情感态度价值观目标:1. 学生通过学习单链表,培养对数据结构的兴趣,提高学习积极性。
2. 学生在学习过程中,学会与他人合作,培养团队精神和沟通能力。
3. 学生能够认识到数据结构在计算机科学中的重要性,增强对专业知识的认同感。
课程性质分析:本课程为计算机科学与技术专业的基础课程,旨在让学生掌握单链表这一基础数据结构,为后续学习更复杂的数据结构打下基础。
学生特点分析:学生已具备基本的编程能力,具有一定的逻辑思维能力,但可能对数据结构的应用场景认识不足,需要通过实际案例激发兴趣。
教学要求:1. 结合实际案例,讲解单链表的理论知识,让学生了解其在实际问题中的应用。
2. 通过课堂讲解、上机实践等教学手段,让学生掌握单链表的相关操作。
3. 注重培养学生的编程能力和逻辑思维能力,提高解决实际问题的能力。
二、教学内容1. 单链表基本概念:介绍单链表的定义、结构特点及其在数据结构中的应用场景。
- 教材章节:第二章第二节- 内容安排:讲解单链表的组成元素(节点、指针)、分类(单向、双向)及优缺点。
2. 单链表基本操作:- 教材章节:第二章第三节- 内容安排:讲解单链表的创建、插入、删除、查找等基本操作,并通过实例演示。
3. 单链表与其它数据结构的对比:- 教材章节:第二章第四节- 内容安排:分析单链表与数组、栈、队列等其他数据结构的区别和联系,突出单链表的特点。
4. 单链表编程实践:- 教材章节:第二章第五节- 内容安排:结合上机实践,让学生动手实现单链表的基本操作,培养编程能力和解决实际问题的能力。
数据结构实验报告--单链表
数据结构实验报告--单链表数据结构实验报告--单链表1.引言1.1 研究目的本实验旨在通过实践的方式,深入了解单链表的数据结构以及相关操作,提升对数据结构的理解和应用能力。
1.2 实验内容本实验主要包括以下几个方面的内容:●单链表的基本定义和实现●单链表的插入、删除、遍历操作●单链表的逆置操作●单链表的查找和修改操作2.理论基础2.1 单链表的定义单链表是一种常见的线性数据结构,它由一系列的节点组成,每个节点包含数据和指向下一个节点的指针。
2.2 单链表的基本操作①单链表的插入操作在单链表中,可以通过插入操作在指定位置插入一个新节点,该操作主要包括以下步骤:●创建一个新的节点,并为其赋值●将新节点的next指针指向插入位置的后一个节点●将插入位置的前一个节点的next指针指向新节点②单链表的删除操作在单链表中,可以通过删除操作删除指定位置的节点,该操作主要包括以下步骤:●将删除位置的前一个节点的next指针指向删除位置的后一个节点●释放删除节点的内存③单链表的遍历操作单链表的遍历操作主要是依次访问链表中的每一个节点,并执行相应的操作。
④单链表的逆置操作单链表的逆置操作可以将一个单链表中的节点顺序进行颠倒。
⑤单链表的查找操作在单链表中,可以通过查找操作找到指定值的节点。
⑥单链表的修改操作在单链表中,可以通过修改操作修改指定位置的节点的值。
3.实验过程3.1 实验环境本次实验使用C语言进行编程,需要先安装相应的编程环境,如gcc编译器。
3.2 实验步骤①单链表的创建和初始化首先创建一个空链表,并初始化链表的头指针。
②单链表的插入操作按照需求,在链表的指定位置插入一个新节点。
③单链表的删除操作按照需求,删除链表中的指定位置的节点。
④单链表的遍历操作依次访问链表中的每一个节点,并输出其值。
⑤单链表的逆置操作将单链表中的节点顺序进行逆置。
⑥单链表的查找操作按照需求,在链表中查找指定值的节点。
3.2.7 单链表的修改操作按照需求,修改链表中指定位置的节点的值。
数据结构课程设计——约瑟夫环报告(含代码)
#include<stdio.h>#include<stdlib.h>typedef struct LNode{//数据域int cipher; //密码int number; //编号struct LNode *next; //指针域}LNode,*LinkList;void InitList(LinkList &L) //创建一个只有头结点链表{L = (LinkList)malloc(sizeof(LNode));if(!L){exit(1);printf("/n/nError!/n/n");}L->next = L;}void CreateList(int n,LinkList &L) //初始化循环单链表{LinkList p,q;q = L;printf("分别输入每个人的密码:");for(int i = 1;i <= n;i++){int k;scanf("%d",&k);if(k <= 0){printf("\n\n密码有误!\n\n");exit(1);}p = (LinkList)malloc(sizeof(LNode));if(!p){exit(1);printf("/n/nError!/n/n");}p->cipher = k;p->number = i;L->next = p;L = p;}L->next = q->next;free(q);}void PrintList(int x,int n,LinkList L) //输出出列顺序{LinkList p,q;p = L;for(int i = 1;i <= n;i++){for(int j = 1;j < x;j++)p = p->next;q = p->next;x = q->cipher;printf("%d ",q->number);p->next = q->next;free(q);}}int main(){printf("=============约瑟夫环==============\n\n\n");int n,x;LinkList L;L = NULL;InitList(L); //构造空链表printf("输入初始密码:");scanf("%d",&x); //初始密码为xprintf("\n");printf("输入参与总人数:");scanf("%d",&n); //总共的人数nprintf("\n");CreateList(n,L); //建立好一个约瑟夫环printf("\n\n\n===================================\n\n");printf("出列编号为:");PrintList(x,n,L); //输出出列顺序printf("\n\n");return 0;}。
10年《数据结构》课程设计参考题
10年《数据结构》课程设计参考题数据结构课程设计要求2.学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况。
3.课程设计完成要求运行界面友好(有菜单)、操作方便、输出结果正确、可读性强,每种操作有验证性输出。
4.按规定时间提交课程设计报告,过期计为0分。
课程设计实习报告封面的书写格式课程设计课程:数据结构题目:专业班级:姓名:学号:设计时间:指导教师:课程设计报告的内容一、设计题目二、运行环境(软、硬件环境)三、算法设计的思想四、算法的流程图五、算法设计分析六、源代码七、运行结果分析八、收获及体会课程设计题一:排序算法比较一、设计目的1.掌握各种排序的基本思想。
2.掌握各种排序方法的算法实现。
3.掌握各种排序方法的优劣分析及花费的时间的计算。
4.掌握各种排序方法所适应的不同场合。
二、设计内容和要求利用随机函数产生3000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、堆排序、归并排序等排序方法进行排序,并统计每一种排序上机所花费的时间。
--------------------------------------课程设计题二:图的深度周游一、设计目的1.掌握图的邻接表存贮结构。
2.掌握堆栈的基本运算实现。
3.掌握图的邻接表的算法实现。
4.掌握图的深度优先搜索周游算法实现。
二、设计内容和要求对任意给定的图(顶点数和边数自定),建立它的邻接表并输出,然后利用堆栈的五种基本运算(清空堆栈、压栈、弹出、取栈顶元素、判栈空)实现图的深度优先搜索周游。
--------------------------------------课程设计题三:图的广度周游一、设计目的1.掌握图的邻接表存贮结构。
2.掌握队列的基本运算实现。
3.掌握图的邻接表的算法实现。
4.掌握图的广度优先搜索周游算法实现。
二、设计内容和要求对任意给定的图(顶点数和边数自定),建立它的邻接表并输出,然后利用队列的五种基本运算(置空队列、进队、出队、取队头元素、判队空)实现图的广度优先搜索周游。
数据结构-单链表实验报告
单链表实验报告一、实验目的1、帮助读者复习C++语言程序设计中的知识。
2、熟悉线性表的逻辑结构。
3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。
二、实验内容[问题描述]实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。
[基本要求](1)依次从键盘读入数据,建立带头结点的单链表;(2)输出单链表中的数据元素(3)求单链表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能。
三、算法设计(1)建立带表头结点的单链表;首先输入结束标志,然后建立循环逐个输入数据,直到输入结束标志。
(2)输出单链表中所有结点的数据域值;首先获得表头结点地址,然后建立循环逐个输出数据,直到地址为空。
(3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y;建立两个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,建立循环扫描链表。
当当前结点指针域不为空且数据域等于x的时候,申请结点并给此结点数据域赋值为y,然后插入当前结点后面,退出函数;当当前结点指针域为空的时候,申请结点并给此结点数据域赋值为y,插入当前结点后面,退出函数。
(4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。
建立三个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,最后一个备用;建立整形变量l=0;建立循环扫描链表。
当当前结点指针域为空的时候,如果当前结点数据域等于k,删除此结点,l++,跳出循环,结束操作;如果当前结点数据域不等于k,跳出循环,结束操作。
当当前结点指针域不为空的时候,如果当前结点数据域等于k,删除此结点,l++,继续循环操作;如果当前结点数据域不等于k,指针向后继续扫描。
循环结束后函数返回变量l的值,l便是删除的结点的个数。
四、实验结果1、新建一个链表:2、输出链表的数据:(4)插入数据:在数据为3后面插入一个数据100:(5)删除数据:删除刚刚插入的数据100:五、总结实验之前由于准备不够充分,所以堂上实验时只完成了建立单链表和数据的输出,而后面两个实验要求也是用来很多时间长完成的。
数据结构课件单链表
删除链表中的节点需要遍历至指定位置,时间复杂度为 O(n)。
查找节点
在链表中查找一个节点需要遍历整个链表,时间复杂度为 O(n)。
空间复杂度
空间占用
单链表的空间占用主要取决于链表中的 节点数,因此空间复杂度为O(n)。
VS
内存分配
每个节点需要分配内存空间存储数据和指 针,因此内存分配的空间复杂度也为O(n) 。
需要根据数据元素顺 序进行遍历的场景, 如排序算法等。
需要频繁插入、删除 操作的场景,如动态 规划、图算法等。
02
单链表的实现
创建单链表
定义节点结构体
首先需要定义一个节点结构体,包含 数据域和指针域两个部分,数据域用 于存储数据,指针域用于指向下一个 节点。
初始化头节点
创建一个头节点,并将其指针域指向 NULL,表示单链表的起始位置。
05
单链表常见问题与解决方 案
循环链表
总结词
循环链表是一种特殊类型的单链表,其中尾节点的指针指向头节点,形成一个闭环。
详细描述
在循环链表中,由于尾节点的指针指向头节点,因此遍历链表时需要特别注意,以避免无限循环。常见的解决方 法是在遍历时记录已经访问过的节点,避免重复访问。
链表中的重复元素
总结词
链表中可能存在重复元素的问题,这会影响数据处理的正确性。
详细描述
为了解决这个问题,可以在插入节点时检查新元素是否已存在于链表中。如果存在,则不进行插入操 作。另外,也可以使用哈希表等数据结构来快速查找重复元素。
链表的排序
总结词
对链表进行排序是常见的需求,但链表的排 序算法通常比数组的排序算法复杂。
合并单链表
总结词
将两个已排序的单链表合并为一个新的已排序的单链表。
第3周线性表(下)第2讲-循环链表
循环链表是另一种形式的链式存储结构形式。
循环单链表:将表中尾节点的指针域改为指向表头节点,整个链表形成一个环。
由此从表中任一节点出发均可找到链表中其他节点。
循环双链表:形成两个环。
节点类型与非循环单链表的相同节点类型与非循环双链表的相同线性表(a 1, a 2, …, a i , … a n )映射逻辑结构存储结构a 1a 2a n…L带头节点循环单链表示意图1、循环单链表与非循环单链表相比,循环单链表:链表中没有空指针域p所指节点为尾节点的条件:p->next==LL pa1a2a n…【例2-8】某线性表最常用的操作是在尾元素之后插入一个元素和删除第一个元素,故采用存储方式最节省运算时间。
A.单链表B.仅有头结点指针的循环单链表C.双链表D.仅有尾结点指针的循环单链表D.仅有尾结点指针的循环单链表a 1a2a n…L在尾元素之后插入一个元素删除第一个元素时间复杂度均为O(1)选择D线性表(a 1, a 2, … , a i , … a n )映射逻辑结构存储结构a 1a 2a n…L带头节点循环双链表示意图2、循环双链表与非循环双链表相比,循环双链表:链表中没有空指针域p所指节点为尾节点的条件:p->next==L一步操作即L->prior可以找到尾节点p La1a2a n…【例2-9】如果对含有n(n>1)个元素的线性表的运算只有4种,即删除第一个元素、删除尾元素、在第一个元素前面插入新元素、在尾元素的后面插入新元素,则最好使用。
A.只有尾结点指针没有头结点的循环单链表B.只有尾结点指针没有头结点的非循环双链表C.只有首结点指针没有尾结点指针的循环双链表D.既有头指针也有尾指针的循环单链表a 1a 2a n…LC.只有首结点指针没有尾结点指针的循环双链表删除第一个元素删除尾元素在第一个元素前面插入新元素在尾元素的后面插入新元素时间复杂度均为O(1)选择C【例2-10】设计判断带头节点的循环双链表L(含两个以上的节点)是否对称相等的算法。
数据结构课程设计约瑟夫环
《数据结构》课程设计报告书题目:约瑟夫环系别:计算机科学与应用学号:学生姓名:指导教师:完成日期:2012年6月7日目录1.需求分析 (3)1.1 功能分析 (3)1.2开发平台 (3)2.概要设计 (3)3. 程序设计主要流程 (5)4.调试与操作说明 (5)4.1调试情况 (5)4.2操作说明 (6)总结 (8)致谢 (9)附录 (9)参考文献 (13)指导教师评语: (14)1.需求分析1.1 功能分析本次选做的课程设计是改进约瑟夫(Joseph)环问题。
约瑟夫环问题是一个古老的数学问题,本次课题要求用程序语言的方式解决数学问题。
此问题仅使用单循环链表就可以解决此问题。
在建立单向循环链表时,因为约瑟夫环的大小由输入决定。
为方便操作,我们将每个结点的数据域的值定为生成结点时的顺序号和每个人持有的密码。
进行操作时,用一个指针r指向当前的结点,指针H指向头结点。
然后建立单向循环链表,因为每个人的密码是通过scanf()函数输入随机生成的,所以指定第一个人的顺序号,找到结点,不断地从链表中删除链结点,直到链表剩下最后一个结点,通过一系列的循环就可以解决改进约瑟夫环问题。
1.2开发平台WindowsXP操作系统;Microsoft Visual C++ 6.0;2.概要设计编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。
这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。
r->next=H。
解决问题的核心步骤:首先建立一个具有n个链结点,无头结点的循环链表。
然后确定第1个报数人的位置。
最后不断地从链表中删除链结点,直到链表为空。
《数据结构》循环链表教学探讨
在 建 立 一 个 循 环链 表 时 . 须 使 其 最 后 一 个 结 点 的 指针 指 向表 头 必 结 点 , 而 构 成 一 个 圈 , 不 是 象 单 链 表 那 样 置 为 N L 。 以下 程 序 是 从 而 UL
NUL 。 L。
算 法 3尾 插 法 建 立 带 头 指 针 的循 环 链 表
—
v i r C i L t(L k i ) 尾 插 法 建 立 带 头 指 针 的循 环 链 o d c t Ln i C i Ls L ks n t 的 循 环 单 链 表 中 , 表 头 结 点 的 方 法 是 L > et时 间 复 杂 度 是 0() 找 一 n x, 1, 找 表 尾 结 点 需 要 从 头 指 针 开 始 遍 历 整 个 链 表 , 间 复 杂 度 是 Of) 如 表 , 时 n。 (n H I ; it I, n Tn 果 用 尾 指 针 R表 示 循 环 单 链 表 , 表 头 结 点 的 方 法 是 R > et> et 找 一 nx- nx , it; nj 找 表 尾 结 点 R > et时 间复 杂 度 都 是 o 1。 因此 , 用 中也 常 常采 用 一 nx, () 实
科技信息
。高校讲坛o
S IN E&T C N L G I F R A I N CE C E H O O Y N O M TO
20 0 9年
第 3 期 5
《 数据结构》 循环链表教学探讨
刘 汉英
( 林理 工 大学 信 息科 学与 工程 学 院 桂
【 摘
广西
桂林
5 10 ) 4 0 4
) rtr ; e np) u 用 尾 插 法 建 立 头 指 针 表 示 的循 环 链 表 , 将 最 后 一 个 结 点 的 指 应
链表(单链表 双向循环)实验报告讲解
数据结构实验报告T1223-3-21余帅实验一实验题目:仅仅做链表部分难度从上到下1.双向链表,带表头,线性表常规操作。
2.循环表,带表头,线性表常规操作。
3.单链表,带表头,线性表常规操作。
实验目的:了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。
实验要求:常规操作至少有:1.数据输入或建立2.遍历3.插入4.删除必须能多次反复运行实验主要步骤:1、分析、理解给出的示例程序。
2、调试程序,并设计输入数据,测试程序的如下功能:1.数据输入或建立2.遍历3.插入4.删除单链表示意图:headhead head 创建删除双向循环链表示意图:创建程序代码://单链表#include<iostream.h>#include<windows.h>const MAX=5;enum returninfo{success,fail,overflow,underflow,range_error}; int defaultdata[MAX]={11,22,33,44,55};class node{public:int data;node *next;};class linklist{private:node *headp;protected:int count;public:linklist();~linklist();bool empty();void clearlist();returninfo create(void);returninfo insert(int position,const int &item);returninfo remove(int position) ;returninfo traverse(void);};linklist::linklist(){headp = new node;headp->next = NULL;count=0;}linklist::~linklist(){clearlist();delete headp;}bool linklist::empty(){if(headp->next==NULL)return true;elsereturn false;}void linklist::clearlist(){node *searchp=headp->next,*followp=headp;while(searchp->next!=NULL){followp=searchp;searchp=searchp->next;delete followp;}headp->next = NULL;count = 0;}returninfo linklist::create(){node *searchp=headp,*newnodep;for(int i=0;i<MAX;i++){newnodep = new node;newnodep->data = defaultdata[i];newnodep->next = NULL;searchp->next = newnodep;searchp = searchp->next;count++;}searchp->next = NULL;traverse();return success;}returninfo linklist::insert(int position,const int &item) //插入一个结点{if(position<=0 || position>=count)return range_error;node *newnodep=new node,*searchp=headp->next,*followp=headp;for(int i=1; i<position && searchp!=NULL;i++){followp=searchp;searchp=searchp->next;}newnodep->data=item; //给数据赋值newnodep->next=followp->next; //注意此处的次序相关性followp->next=newnodep;count++; //计数器加一return success;}returninfo linklist::remove(int position) //删除一个结点{if(empty())return underflow;if(position<=0||position>=count+1)return range_error;node *searchp=headp->next,*followp=headp; //这里两个指针的初始值设计一前一后for(int i=1; i<position && searchp!=NULL;i++){followp=searchp;searchp=searchp->next;}followp->next=searchp->next; //删除结点的实际语句delete searchp; //释放该结点count--; //计数器减一return success;}returninfo linklist::traverse(void){node *searchp;if(empty())return underflow;searchp = headp->next;cout<<"连表中的数据为:"<<endl;while(searchp!=NULL){cout<<searchp->data<<" ";searchp = searchp->next;}cout<<endl;return success;}class interfacebase{public:linklist listface; //定义一个对象Cskillstudyonfacevoid clearscreen(void);void showmenu(void);void processmenu(void);};void interfacebase::clearscreen(void){system("cls");}void interfacebase::showmenu(void){cout<<"================================"<<endl;cout<<" 功能菜单 "<<endl;cout<<" 1.创建链表 "<<endl;cout<<" 2.增加结点 "<<endl;cout<<" 3.删除结点 "<<endl;cout<<" 4.遍历链表 "<<endl;cout<<" 0.结束程序 "<<endl;cout<<"======================================"<<endl;cout<<"请输入您的选择:";}void interfacebase::processmenu(void){int returnvalue,item,position;char menuchoice;cin >>menuchoice;switch(menuchoice) //根据用户的选择进行相应的操作{case '1':returnvalue=listface.create();if(returnvalue==success)cout<<"链表创建已完成"<<endl;break;case '2':cout<<"请输入插入位置:"<<endl;cin>>position;cout<<"请输入插入数据:"<<endl;cin>>item;returnvalue = listface.insert(position,item);if(returnvalue==range_error)cout<<"数据个数超出范围"<<endl;elsecout<<"操作成功!!!"<<endl;break;case '3':cout<<"输入你要删除的位置:"<<endl;cin>>position;returnvalue = listface.remove(position);if(returnvalue==underflow)cout<<"链表已空"<<endl;else if(returnvalue==range_error)cout<<"删除的数据位置超区范围"<<endl;elsecout<<"操作成功!!!"<<endl;break;case '4':listface.traverse();break;case '0':cout<<endl<<endl<<"您已经成功退出本系统,欢迎再次使用!!!"<<endl;system("pause");exit(1);default:cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;break;}}void main(){interfacebase interfacenow;linklist listnow;system("color f0");interfacenow.clearscreen();while(1){interfacenow.showmenu();interfacenow.processmenu();system("pause");interfacenow.clearscreen();}}/* 功能:用双向循环链表存储数据1.创建链表2.增加结点3.删除结点4.遍历链表制作人:余帅内容:239行*/#include<iostream.h>#include<windows.h>const MAX=5;enum returninfo{success,fail,overflow,underflow,range_error}; int defaultdata[MAX]={11,22,33,44,55};class node{public:int data;node * next; //指向后续节点node * pre; //指向前面的节点};class linklist{private:node *headp;protected:int count;public:linklist();~linklist();bool empty();void clearlist();returninfo create(void);returninfo insert(int position,const int &item);returninfo remove(int position) ;returninfo traverse(void);};linklist::linklist(){headp = new node;headp->next = NULL;headp->pre = NULL;count=0;}linklist::~linklist(){clearlist();delete headp;}bool linklist::empty(){if(headp->next==NULL)return true;elsereturn false;}void linklist::clearlist(){node *searchp=headp->next,*followp=headp;while(searchp->next!=NULL){followp=searchp;searchp=searchp->next;delete followp;}headp->next = NULL;headp->pre = NULL;count = 0;}returninfo linklist::create(){node *searchp=headp,*newnodep;for(int i=0;i<MAX;i++){newnodep = new node;newnodep->data = defaultdata[i];newnodep->next = NULL;searchp->next = newnodep;newnodep->pre = searchp;searchp = searchp->next;count++;}searchp->next = headp;headp->pre = searchp;traverse();return success;}returninfo linklist::insert(int position,const int &item) //插入一个结点{if(position<=0 || position>count+1)return range_error;node *newnodep=new node;node *searchp=headp->next,*followp=headp;for(int i=1; i<position && searchp!=NULL;i++){followp=searchp;searchp=searchp->next;}newnodep->data=item; //给数据赋值newnodep->next = searchp;searchp->pre = newnodep;followp->next = newnodep;newnodep->pre = followp;count++; //计数器加一return success;}returninfo linklist::remove(int position) //删除一个结点{if(empty())return underflow;if(position<=0||position>=count+1)return range_error;node *searchp=headp->next,*followp=headp; //这里两个指针的初始值设计一前一后for(int i=1; i<position && searchp!=NULL;i++){followp=searchp;searchp=searchp->next;}followp->next=searchp->next; //删除结点的实际语句searchp->next->pre = followp;delete searchp; //释放该结点count--; //计数器减一return success;}returninfo linklist::traverse(void){node *searchp1,*searchp2;if(empty())return underflow;searchp1 = headp;searchp2 = headp;cout<<"连表中的数据为:"<<endl;cout<<"从左至右读取:";while (searchp1->next!=headp ) {searchp1 = searchp1 ->next;cout << searchp1->data<<" ";}cout<<endl;cout<<"从右至左读取:";while (searchp2->pre!=headp ) {searchp2 = searchp2 ->pre;cout << searchp2->data<<" ";}cout<<endl;return success;}class interfacebase{public:linklist listface; //定义一个对象Cskillstudyonface void clearscreen(void);void showmenu(void);void processmenu(void);};void interfacebase::clearscreen(void){system("cls");}void interfacebase::showmenu(void){cout<<"================================"<<endl;cout<<" 功能菜单 "<<endl;cout<<" 1.创建链表 "<<endl;cout<<" 2.增加结点 "<<endl;cout<<" 3.删除结点 "<<endl;cout<<" 4.遍历链表 "<<endl;cout<<" 0.结束程序 "<<endl;cout<<"======================================"<<endl;cout<<"请输入您的选择:";}void interfacebase::processmenu(void){int returnvalue,item,position;char menuchoice;cin >>menuchoice;switch(menuchoice) //根据用户的选择进行相应的操作{case '1':returnvalue=listface.create();if(returnvalue==success)cout<<"链表创建已完成"<<endl;break;case '2':cout<<"请输入插入位置:"<<endl;cin>>position;cout<<"请输入插入数据:"<<endl;cin>>item;returnvalue = listface.insert(position,item);if(returnvalue==range_error)cout<<"数据个数超出范围"<<endl;elsecout<<"操作成功!!!"<<endl;break;case '3':cout<<"输入你要删除的位置:"<<endl;cin>>position;returnvalue = listface.remove(position);if(returnvalue==underflow)cout<<"链表已空"<<endl;else if(returnvalue==range_error)cout<<"删除的数据位置超区范围"<<endl;elsecout<<"操作成功!!!"<<endl;break;case '4':listface.traverse();break;case '0':cout<<endl<<endl<<"您已经成功退出本系统,欢迎再次使用!!!"<<endl;system("pause");exit(1);default:cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;break;}}void main(){interfacebase interfacenow;linklist listnow;system("color f0");interfacenow.clearscreen();while(1){interfacenow.showmenu();interfacenow.processmenu();system("pause");interfacenow.clearscreen();}}运行结果:1.创建链表:2.增加结点3.删除结点心得体会:本次实验使我们对链表的实质了解更加明确了,对链表的一些基本操作也更加熟练了。
数据结构实验报告单链表
数据结构实验报告_单链表数据结构实验报告——单链表一、实验目的1.掌握单链表的基本概念和原理。
2.了解单链表在计算机科学中的应用。
3.掌握单链表的基本操作,如插入、删除、遍历等。
4.通过实验,加深对理论知识的理解,提高编程能力。
二、实验内容1.实验原理:单链表是一种线性数据结构,由一系列节点组成,每个节点包含数据域和指针域。
其中,指针域指向下一个节点,最后一个节点的指针域指向空。
单链表的主要操作包括插入、删除、遍历等。
2.实验步骤:(1)创建一个单链表。
(2)实现插入操作,即在链表的末尾插入一个新节点。
(3)实现删除操作,即删除链表中的一个指定节点。
(4)实现遍历操作,即输出链表中所有节点的数据。
3.实验代码:下面是使用Python语言实现的单链表及其基本操作的示例代码。
class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = Nonedef insert(self, data):new_node = Node(data)if self.head is None:self.head = new_nodeelse:current = self.headwhile current.next is not None:current = current.nextcurrent.next = new_nodedef delete(self, data):if self.head is None:returnif self.head.data == data:self.head = self.head.nextreturncurrent = self.headwhile current.next is not None and current.next.data != data:current = current.nextif current.next is None:returncurrent.next = current.next.nextdef traverse(self):current = self.headwhile current is not None:print(current.data)current = current.next4.实验结果:通过运行上述代码,我们可以看到单链表的基本操作得到了实现。
数据结构-单链表实验报告
数据结构-单链表实验报告数据结构单链表实验报告一、实验目的本次实验的主要目的是深入理解和掌握单链表这一数据结构的基本概念、操作原理以及在实际编程中的应用。
通过编写和调试相关程序,提高对数据结构的理解和编程能力,培养解决实际问题的思维和方法。
二、实验环境本次实验使用的编程语言为C++,编程环境为Visual Studio 2019。
三、实验原理单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据域和指针域。
数据域用于存储节点的数据信息,指针域用于指向下一个节点。
通过这种方式,节点依次连接形成链表。
单链表的基本操作包括创建链表、插入节点、删除节点、查找节点、遍历链表等。
在实现这些操作时,需要特别注意指针的操作,避免出现空指针异常和内存泄漏等问题。
四、实验内容(一)创建单链表创建单链表的过程就是依次为每个节点分配内存空间,并将节点连接起来。
以下是创建单链表的代码实现:```cppinclude <iostream>using namespace std;//定义链表节点结构体struct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};//创建单链表ListNode createList(){ListNode head = NULL;ListNode tail = NULL;int num;cout <<"请输入链表节点的值(输入-1 结束):";cin >> num;while (num!=-1) {ListNode newNode = new ListNode(num);if (head == NULL) {head = newNode;tail = newNode;} else {tail>next = newNode;tail = newNode;}cin >> num;}return head;}```(二)插入节点插入节点可以分为在表头插入、在表尾插入和在指定位置插入三种情况。
课程设计单链表
课程设计单链表一、教学目标本节课的学习目标包括以下三个方面:1.知识目标:学生需要掌握单链表的基本概念、性质和操作方法,包括单链表的定义、节点结构、基本操作(创建、插入、删除、查找等)。
2.技能目标:学生能够熟练使用编程语言实现单链表的各种操作,培养学生的编程能力和问题解决能力。
3.情感态度价值观目标:通过学习单链表,培养学生对计算机科学和编程的兴趣,提高学生自主学习和探索的精神。
二、教学内容本节课的教学内容主要包括以下几个部分:1.单链表的基本概念和性质:介绍单链表的定义、节点结构以及单链表的特点。
2.单链表的基本操作:讲解创建、插入、删除、查找等单链表的基本操作,并通过示例代码进行演示。
3.单链表的应用:介绍单链表在实际编程中的应用场景,例如链表排序、链表查找等。
三、教学方法为了提高教学效果,本节课将采用以下几种教学方法:1.讲授法:教师通过讲解单链表的基本概念、性质和操作方法,引导学生掌握相关知识。
2.案例分析法:通过分析实际案例,让学生了解单链表在编程中的应用,提高学生的实践能力。
3.实验法:安排课堂实验环节,让学生动手编写代码实现单链表的各种操作,培养学生的动手能力和问题解决能力。
四、教学资源为了支持本节课的教学,我们将准备以下教学资源:1.教材:选择合适的计算机科学教材,为学生提供系统的学习资料。
2.参考书:提供相关的参考书籍,丰富学生的知识体系。
3.多媒体资料:制作PPT、动画等多媒体资料,直观展示单链表的操作过程。
4.实验设备:准备计算机、编程环境等实验设备,确保学生能够顺利进行实验操作。
五、教学评估为了全面、客观地评估学生的学习成果,本节课将采用以下几种评估方式:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解程度。
2.作业:布置与单链表相关的编程练习,评估学生对知识点的掌握情况和实际操作能力。
3.考试:安排一次期中考试,测试学生对单链表知识的全面理解和运用能力。
数据结构课程设计-单链表
目录1 选题背景 (2)2 方案与论证 (3)2.1 链表的概念和作用 (3)2.3 算法的设计思想 (4)2.4 相关图例 (5)2.4.1 单链表的结点结构 (5)2.4.2 算法流程图 (5)3 实验结果 (6)3.1 链表的建立 (6)3.2 单链表的插入 (6)3.3 单链表的输出 (7)3.4 查找元素 (7)3.5 单链表的删除 (8)3.6 显示链表中的元素个数(计数) (9)4 结果分析 (10)4.1 单链表的结构 (10)4.2 单链表的操作特点 (10)4.2.1 顺链操作技术 (10)4.2.2 指针保留技术 (10)4.3 链表处理中的相关技术 (10)5 设计体会及今后的改进意见 (11)参考文献 (12)附录代码: (13)1 选题背景陈火旺院士把计算机60多年的发展成就概括为五个“一”:开辟一个新时代----信息时代,形成一个新产业----信息产业,产生一个新科学----计算机科学与技术,开创一种新的科研方法----计算方法,开辟一种新文化----计算机文化,这一概括深刻影响了计算机对社会发展所产生的广泛而深远的影响。
数据结构和算法是计算机求解问题过程的两大基石。
著名的计算机科学家P.Wegner指出,“在工业革命中其核心作用的是能量,而在计算机革命中其核心作用的是信息”。
计算机科学就是“一种关于信息结构转换的科学”。
信息结构(数据结构)是计算机科学研究的基本课题,数据结构又是算法研究的基础。
2 方案与论证2.1 链表的概念和作用链表是一种链式存储结构,链表属于线性表,采用链式存储结构,也是常用的动态存储方法。
链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
以“结点的序列”表示线性表称作线性链表(单链表)单链表是链式存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素。
数据结构课程设计分类题目
线性表顺序表:1、设有一元素为整数的线性表L=(a1,a2,a3,…,a n),存放在一维数组A[N]中,设计一个算法,以表中a n作为参考元素,将该表分为左、右两部分,其中左半部分每个元素小于等于a n,右半部分每个元素都大于a n, a n位于分界位置上(要求结果仍存放在A[N]中)。
2、设线性表存于A[1..size]的前num各分量中,且递增有序。
请设计一个算法,将x插入到线性表的适当位置上,以保持线性表的有序性。
3、线性表(a1,a2,a3,…,a n)中元素递增有序且按顺序存储于计算机内。
要求设计一算法完成:(1)用最少时间在表中查找数值为x的元素。
(2)若找到将其与后继元素位置相交换。
(3)若找不到将其插入表中并使表中元素仍递增有序。
4、已知数组A[0:n-1]的元素类型为int,试设计算法将其调整为左右两个部分,左边所有元素为奇数,右边所有元素为偶数。
5、设计一个算法从顺序表L中删除所有值为x的元素6、设计一个算法从顺序表L中删除所有值为x到y之间(x<=y)的元素链表:1、假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。
请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。
2、已知L1、L2分别为两循环单链表的头结点指针,m,n分别为L1、L2表中数据结点个数。
要求设计一算法,用最快速度将两表合并成一个带头结点的循环单链表。
3、设L为单链表的头结点地址,其数据结点的数据都是正整数且无相同的,设计一个将该链表整理成数据递增的有序单链表的算法。
5、设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A的元素类型为整型,要求B、C表利用A表的结点)。
6、试编写在带头结点的单链表中删除(一个)最小值结点的(高效)算法。
循环单链表为空的判定条件
循环单链表为空的判定条件
循环单链表是一种数据结构,它由一系列节点组成,每个节点包含一个数据域和一个指向下一个节点的指针。
循环单链表与单链表的区别在于它的尾节点指向头节点,形成一个环。
在操作循环单链表时,我们需要确定循环单链表是否为空。
一个循环单链表为空的判定条件是很关键的,因为它决定了我们是否可以对循环单链表进行其他操作。
循环单链表为空的判定条件可以分为两种情况:头节点为空和头节点不为空。
当头节点为空时,循环单链表为空。
这种情况很容易判断,只需要判断头节点是否为NULL即可。
当头节点不为空时,我们可以通过判断头节点是否指向自身来确定循环单链表是否为空。
具体地,如果头节点指向自身,那么循环单链表为空;否则,循环单链表不为空。
这是因为循环单链表中的每个节点都有一个指针指向下一个节点,如果循环单链表中只有一个节点,那么它的指针必须指向自身,形成一
个环。
如果循环单链表中有多个节点,那么头节点指针不会指向自身,因为它需要指向第一个数据节点。
在操作循环单链表时,我们应该首先判定循环单链表是否为空,避免
对空循环单链表进行其他操作,从而导致程序异常。
如果循环单链表
不为空,我们就可以对循环单链表进行其他操作,例如插入节点、删
除节点等。
总之,循环单链表为空的判定条件是判定头节点是否指向自身,当头
节点指向自身时,循环单链表为空;否则,循环单链表不为空。
通过
这个判定条件,我们可以有效地避免对空循环单链表进行其他操作,
从而保证程序的稳定性和健壮性。
循环单链表定义初始化及创建(C语言)
循环单链表定义初始化及创建(C语⾔)#include <stdio.h>#include <stdlib.h>/*** 含头节点循环单链表定义,初始化及创建*/#define OK 1;#define ERROR 0;//函数返回类型,表⽰函数运⾏结果的状态typedef int Status;//定义数据元素类型typedef char ElemType;//循环单链表定义typedef struct LoopLnode {ElemType data; //数据域,这⾥是char类型变量struct LoopLnode *next; //指针域,结构体类型指针} LoopLnode, *LoopLinkList;//循环单链表初始化Status InitList(LoopLinkList *list) {(*list)=(LoopLinkList)malloc(sizeof(LoopLnode));(*list)->next=(*list);(*list)->data='T'; //测试⽤,可不写return OK;}//1."头插法"创建仅含"头指针"的单向循环链表Status CreateList_H(LoopLinkList *list,ElemType arrData[],int length){int j;for(j=length-1;j>=0;j--){//新建结点LoopLnode *node;node=(LoopLnode*)malloc(sizeof(LoopLnode));node->data=arrData[j];node->next=NULL;//插⼊循环链表node->next=(*list)->next;(*list)->next=node; //list始终指向头结点}return OK;}//2."尾插法"创建仅含"头指针"的单向循环链表Status CreateList_R(LoopLinkList *list,ElemType arrData[],int length){LoopLnode *r;r=*list;int j;for(j=0;j<length;j++) {//新建结点LoopLnode *node;node=(LoopLnode*)malloc(sizeof(LoopLnode));node->data=arrData[j];node->next=NULL;//插⼊循环链表node->next=r->next;r=node;}return OK;}//3."头插法"创建仅含"尾指针"的单向循环链表Status BuildList_H(LoopLinkList *list,ElemType arrData[],int length){int j;for(j=length-1;j>=0;j--){//新建结点LoopLnode *node;node=(LoopLnode*)malloc(sizeof(LoopLnode));node->data=arrData[j];node->next=NULL;//node插⼊1号结点,list为尾指针node->next=(*list)->next->next; //node->next=头结点->nextif((*list)->next==(*list)) (*list)=node; //当只有头结点时(插⼊第⼀个结点时,⼿动设置node为尾指针)(*list)->next->next=node; //头结点->next=node;}return OK;}//4."尾插法"创建仅含"尾指针"的单向循环链表Status BuildList_R(LoopLinkList *list,ElemType arrData[],int length) {int j;for(j=0;j<length;j++) {//新建结点LoopLnode *node;node=(LoopLnode*)malloc(sizeof(LoopLnode));node->data=arrData[j];node->next=NULL;node->next=(*list)->next; //node->next=头结点(*list) = node; //尾指针 —> node}return OK;}int main(void){//产⽣待插⼊到链表的数据ElemType data1='A',data2='B',data3='C';ElemType waitInserted[]={data1,data2,data3,};//获得数组长度int arrLength=sizeof(waitInserted)/sizeof(waitInserted[0]);/**1.头插法建⽴只含头指针循环单链表**///定义链表并初始化LoopLinkList list1;InitList(&list1);//按既定数据建⽴链表CreateList_H(&list1,waitInserted,arrLength);//测试printf("%c\n",list1->next->next->next->next->next->next->data); //B/**2.尾插法建⽴只含头指针循环单链表**///定义链表并初始化LoopLinkList list2;InitList(&list2);//按既定数据建⽴链表CreateList_R(&list2,waitInserted,arrLength);//测试printf("%c\n",list1->next->next->next->next->next->next->data); //B/**3.头插法建⽴只含尾指针循环单链表**///定义链表并初始化LoopLinkList list3;InitList(&list3);//按既定数据建⽴链表BuildList_H(&list3,waitInserted,arrLength); //list3指向表尾//测试printf("%c\n",list3->next->next->next->next->next->next->next->next->next->data); //T/**4.尾插法建⽴只含尾指针循环单链表**///定义链表并初始化LoopLinkList list4;InitList(&list4);//按既定数据建⽴链表BuildList_H(&list4,waitInserted,arrLength); //list4指向表尾//测试printf("%c\n",list4->next->next->next->next->next->next->next->next->next->next->data); //A printf("\nEND!");return0;}。
数据结构课程设计报告---单链表表示集合---实现交并差
西安建筑科技大学华清学院课程设计(论文)题目:院(系):专业班级:计算机姓学名:号:指导教师:2016 年9 月8 日西安建筑科技大学华清学院课程设计(论文)任务书专业班级:学生姓名:指导教师(签名):一、课程设计(论文)题目集合运算:使用链表来表示集合,完成集合的合并,求交集等操作。
二、本次课程设计(论文)应达到的目的数据结构是实践很强的课程,课程设计是加强学生实践能力的一个强有力的手段。
课程设计要求我们完成程序设计的同时能够写出比较规范的设计报告。
严格实施课程设计这一环节,对于我们基本程序素养的培养和软件工作者工作作风的训练。
将起到显著的促进作用。
本题目要达到目的:熟练掌握链表的各种操作三、本次课程设计(论文)任务的主要内容和要求(包括原始数据、技术参数、设计要求等)输入数据:输入10个以内的字符进行程序测试。
1、自己输入两了任意集合。
2、用对话框的形式显示集合运算的结果。
3、优化对话框。
四、应收集的资料及主要参考文献:由于本课程没有安排“课内上机”学时,因此,在课程设计之前必须自己已经上机练习了“线性表”的基本操作。
参考文献:1. 数据结构-C语言描述,西安电子科技大学出版社,2011.5,耿国华编著2.数决结构与算法分析(C++版),电子工业出版社,2005.7,Clifford A.Shaffer 编著3.数据结构与算法,科学出版社,2005.08,赵文静祁飞等编著4.数据结构-C++语言描述,西安交通大学出版社,1999.01,赵文静编著5.VC++深入详解,电子工业出版社,2007.7,孙鑫,于安萍编著五、审核批准意见教研室主任(签字)设计总说明该设计主要应实现以下功能:1.利用尾差法建立单链表2.对于输入的链表进行有序排列3.删除有序链表中不符合要求的元素4.调用函数对单链表进行交,并,差运算,并输出系统主要由8 个模块组成,分别是:1. 单链表的建立2.单链表的有序排列3.删除单链表中不符合条件的元素4.集合交集5.集合并集6.集合差集7.单链表输出8.主函数1.设技种算学其的别的都过理象提的计作用3.需3.13.2可3.3用硬可误5. 概4.1数(1)(2)Check(char ch,LinkList Head):检查p1或p2所指向数据结点该不该加入到Head为起始的集合中(2)Merge(LinkList Head1,LinkList Head2):合并两个集合(4)IsExist(char data,LinkList Head);IsExist2(char data,LinkList Head):集合A中的元素,B中是否存在(5)Deprive(LinkList Head1,LinkList Head2):两个集合的差集(6)Insection(LinkList Head1,LinkList Head2):两个集合交集(7)PrintLinkList(LinkList Head):打印集合元素4.2 系统包含的函数InitLinkList(LinkList Head)Check(char ch,LinkList Head)Merge(LinkList Head1,LinkList Head2)IsExist2(char data,LinkList Head)Deprive(LinkList Head1,LinkList Head2)Insection(LinkList Head1,LinkList Head2)PrintLinkList(LinkList Head)4.3 函数间的关系1.求两个集合的并集时,Merge(LinkListHead1,LinkList Head2)函数首先调用了InitLinkList(LinkList Head)函数,多次调用了Check(char ch,LinkList Head)函数。
使用循环单链表表示队列
使用循环单链表表示队列队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则,即先进入队列的元素将先被取出。
队列通常用于需要按照顺序处理数据的场景,比如任务调度、消息传递等。
在实际应用中,我们可以使用循环单链表来表示队列。
循环单链表是一种链表结构,它与普通的单链表相比,最后一个节点的指针域不为空,而是指向链表的头结点。
这样一来,在遍历链表时可以很方便地回到链表的起始位置。
对于队列来说,使用循环单链表可以更高效地实现入队和出队的操作。
下面我们来具体讨论如何使用循环单链表来表示队列。
我们需要定义一个循环单链表节点的结构。
该结构包含一个数据域和一个指针域,分别指向下一个节点。
代码如下:```cppstruct Node {int data;Node* next;};```接下来,我们定义一个队列类,该类包含队列的基本操作,如入队、出队、判断队列是否为空等。
代码如下:```cppclass Queue {private:Node* front; // 队头指针Node* rear; // 队尾指针public:Queue() {front = rear = nullptr; // 初始化队头和队尾指针为空 }~Queue() {// 释放队列中的所有节点while (!isEmpty()) {dequeue();}}// 入队操作void enqueue(int value) {Node* newNode = new Node;newNode->data = value;newNode->next = nullptr;if (isEmpty()) {front = rear = newNode; // 队列为空,队头和队尾指针指向新节点} else {rear->next = newNode; // 将新节点链接到队尾rear = newNode; // 更新队尾指针}}// 出队操作void dequeue() {if (isEmpty()) {throw "Queue is empty!";}Node* temp = front;front = front->next; // 更新队头指针if (front == nullptr) {rear = nullptr; // 队列只有一个节点,出队后队尾指针为空}delete temp; // 释放出队节点的内存 }// 判断队列是否为空bool isEmpty() {return front == nullptr;}// 获取队头元素int getFront() {if (isEmpty()) {throw "Queue is empty!";}return front->data;}// 获取队列长度int getSize() {int size = 0;Node* current = front;while (current != nullptr) {size++;current = current->next;}return size;}};```使用循环单链表表示队列的好处是,入队和出队的时间复杂度都是O(1),即常数时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计-- 循环单链表信息科学与技术学院《数据结构》课程设计报告题目名称:循环单链表(附加头结点,引用)专业班级:计算机科学与技术2011级1班学生姓名:**学生学号:**********指导教师:**目录1 课程设计的目的 (1)1.1 课程设计的目的 (1)1.2 课程设计的题目 (1)1.3 题目要求 (1)2 概要设计 (1)2.1 存储结构 (1)2.2 基本操作 (1)3 详细设计 (2)3.1 流程图 (2)3.2 源程序 (7)4 测试 (12)5 课程设计总结 (19)6参考书目: (20)1 课程设计的目的1.1 课程设计的目的更好的掌握数据结构这门课程,会用数据结构的基本思想及算法解决实际问题。
更好的掌握循环链表,能进行各种基本的操作,提高编程能力。
1.2 课程设计的题目循环单链表(附加头结点,引用)1.3 题目要求实现附加头结点循环单链表的基本操作:创建空表、输出、求表长、取元素、查找、替换、插入、删除、清空。
2 概要设计2.1 存储结构存储结构L data next data next data next datnexttypedef struct node{datatype data;/*数据域*/struct node *next;/*指针域*/}LNode,*LinkList;/*结点及结点的地址*/2.2 基本操作创建空表、输出、求表长、取元素、查找、替换、插入、删除、清空。
3 详细设计3.1 流程图各个算法的设计如下:1.主函数:2.主菜单用于进行指示进行各种操作,是与每个函数都相联系的一个函数3.显示链表先让指针指向首元结点,在判断该指针是否为头指针,不是则输入数据,实则退出4.求表长先求表的初始长,在判断链表是否为空,不是则len自加,否则结束先求表长,在判断Index < 1 || Index > len,为否则循环,一直活得该数据6.查找求表长,在判断链表是否为空,是则结束,否则判断要查找的数据是否在链表中,是则成功判断要替换的位置是否在链表范围中,是则循环找到要替换的数据替换,否则结束判断将要插入的位置是否在链表范围内,是则循环将要插入的数据插入,否则结束9.删除判断链表是否为空,否则删除该结点,是则结束10.清空判断聊表是够为空,否则依次释放空间,否则结束3.2 源程序#include <iostream>using namespace std;typedef int ElemType;typedef struct node{ElemType data;struct node *next;}LNode,*LinkList,*pNODE;// 创建一个有头结点的空循环表。
LinkList InitList(void){pNODE head = new LNode;head->next = head;return head;}// 头插法。
将给定结点插在链表头部。
void InsertHead(LinkList head,pNODE anode) {anode->next = head->next;head->next = anode;}// 返回链表长度。
int ListLen(LinkList head){int len = 0;pNODE p = head;while(p->next != head){++len;p = p->next;}return len;}// 查找。
成功返回1,否则返回0。
int ListSearch(LinkList head, ElemType data){pNODE p = head;while(p->next != head){if(p->next->data == data)return true;p = p->next;}return 0;}// 获取指定索引号的数据。
void GetData(LinkList head,int Index,ElemType data){pNODE p = head;int i,len = ListLen(head);if(Index < 1 || Index > len)cout <<"获取失败" <<endl;for(i = 0; i <Index; ++i,p = p->next);data = p->data;cout <<"获取成功,其值为:"<<data <<endl; }// 用给定结点替换指定索引的结点。
void NodeReplace(LinkList head, int Index, int data){pNODE p = head;int i,len = ListLen(head);if(Index < 1 || Index > len)cout <<"错误" <<endl;for(i = 0; i <Index; ++i,p = p->next);p->data=data;cout <<"替换成功" <<endl;}//插入结点void ListInsert(LinkList head,int Index,int data){pNODE s,p=head;int i,len = ListLen(head);if(Index < 1 || Index > len)cout <<"错误" <<endl;for(i=1;i<Index;++i,p=p->next);s=new LNode;s->data=data;s->next=p->next;p->next=s;cout <<"插入成功" <<endl;}// 删除数据域为data的结点。
成功返回1,否则返回0。
int NodeErase(LinkList head,ElemType data){pNODE q,p = head;while(p->next != head){if(p->next->data == data){q = p->next;p->next = q->next;delete q;return 1;}p = p->next;}return 0;}// 释放链表void ListDestroy(LinkList head){pNODE q,p = head;while(p->next != head){q = p->next;p->next = q->next;delete q;}delete head;cout <<"释放成功" <<endl;}// 显示链表void ListShow(LinkList head){pNODE p = head->next;while(p != head){cout <<" "<<p->data;p = p->next;}cout <<endl;}void Menu(LinkList head){cout <<"***********************************循环链表*************************************" <<endl;cout<<"***************************************************************** ***************" <<endl;cout <<"*****************1显示链表2求表长3取元素4查找5替换6插入7删除8清空9退出**********" <<endl;cout<<"***************************************************************** ***************" <<endl;cout<<"请选择您需要的操作:"<<endl;int xz,Index,data;cin >>xz;switch(xz){case 1:ListShow(head);system("pause");system("cls");Menu(head);break;case 2:cout <<"链表长度为:" <<ListLen(head) <<endl;system("pause");system("cls");Menu(head);break;case 3:cout <<"请输入要获取的数据的位置:" <<endl;cin >>Index;GetData(head,Index,data);system("pause");system("cls");Menu(head);break;case 4:cout <<"请输入要查找的数据: " <<endl;cin >>data;if(ListSearch(head, data))cout <<"找到了" <<endl;elsecout <<"对不起,没找到" <<data <<endl;system("pause");system("cls");Menu(head);break;case 5:cout <<"请输入要替换的位置,其值为:" <<endl;cin >>Index >>data;NodeReplace(head,Index,data);system("pause");system("cls");Menu(head);break;case 6:cout <<"请输入插入的位置及数值:" <<endl;cin >>Index >>data;ListInsert(head,Index,data);system("pause");system("cls");Menu(head);break;case 7:cout <<"请输入要删除结点的数据: " <<endl;cin >>data;if(NodeErase(head,data))cout <<"成功删除" <<data <<endl;elsecout <<"没有找到" <<data <<endl;system("pause");system("cls");Menu(head);break;case 8:ListDestroy(head);system("pause");system("cls");Menu(head);break;case 0:exit(1);}}int main(){LinkList head = InitList();pNODE anode;int i,n = 10,a[] = {0,1,2,3,4,5,6,7,8,9};for(i = 0; i < n; ++i){ // 头插法anode =new LNode;anode->data = a[i];InsertHead(head,anode);}Menu(head);return 0;}4 测试菜单界面显示各种功能需进行的各种操作,界面如下:选择1时,显示链表中的数据,如图:选择2时,可以得到链表长度,如图:选择3时,输入要获取的数据的位置,成功则如图:选择4时,可以查找元素是否在该链表中,但该功能不能显示出查找到的数据的位置,有所不足,如图:选择5时,可以替换你指定位置的数据,如图:选择1,显示替换指定位置数据后链表中的所有数据,如图:选择6时,可以选择要插入的位置及数值,插入成功,如图:选择1,插入后,链表中所有的数据,如图:选择7时,可以删除你要删除的数据,成功删除则如图:选择7,删除失败,如图:选择8时,可以清空链表,如图:5 课程设计总结通过这次课程设计,我又收获到很多,平时的在做作业时,因为题形与结构都是很简单的,并且每一章的内容都是有相应的例题可以参考,所以在做题时没有遇到过很麻烦的问题,而这次不同了,一个课题拿到手时,给我的感觉是无从下手,而且要求很多,使得题目要求更大了.通过本次课程设计,我最大的收获就是自己的动手能力得到了很大的提升,我发现只有自己动手才能更好的了解到自己的知识漏洞,很多小问题可能对代码的编写都有很大影响,像在编写过程中我有时漏掉半撇括号,而在查找时就相当费力,所以多敲代码很重要啊。