双链表的建立查找插入删除算法的实现课程设计
链表c语言课程设计
链表c语言课程设计一、教学目标本章节的教学目标是使学生掌握链表的基本概念、原理和操作方法,能够运用链表解决实际问题。
具体目标如下:1.知识目标:•了解链表的定义、特点和基本操作;•掌握单链表、双向链表和循环链表的概念及其应用;•理解链表的优缺点和适用场景。
2.技能目标:•能够使用C语言实现链表的基本操作,如创建、插入、删除和遍历;•能够根据实际需求设计和实现链表的扩展功能,如排序、查找等;•能够运用链表解决实际问题,如数据存储和传输等。
3.情感态度价值观目标:•培养学生对计算机科学的兴趣和热情,提高他们对编程和数据结构的学习积极性;•培养学生团队合作意识和沟通能力,鼓励他们积极参与讨论和合作解决问题;•培养学生勇于尝试和探索的精神,鼓励他们在遇到困难和挫折时坚持不懈。
二、教学内容本章节的教学内容主要包括链表的基本概念、原理和操作方法。
具体内容包括以下几个方面:1.链表的定义和特点:介绍链表的定义、特点和基本术语,如节点、链表、单链表、双向链表等。
2.链表的基本操作:讲解链表的基本操作,如创建、插入、删除和遍历,并给出相应的C语言实现代码示例。
3.单链表的应用:介绍单链表在实际问题中的应用,如链表排序、链表查找等,并给出相应的代码示例。
4.双向链表和循环链表:讲解双向链表和循环链表的概念及其应用,并给出相应的代码示例。
5.链表的优缺点和适用场景:分析链表的优缺点和适用场景,让学生了解链表在实际编程中的应用和限制。
三、教学方法为了激发学生的学习兴趣和主动性,本章节将采用多种教学方法相结合的方式进行教学。
具体方法如下:1.讲授法:通过讲解和演示链表的基本概念、原理和操作方法,使学生掌握链表的基础知识。
2.案例分析法:通过分析实际问题中的应用案例,使学生了解链表在实际编程中的作用和应用。
3.实验法:让学生通过动手实践,自己编写代码实现链表的基本操作,提高他们的编程能力和实际问题解决能力。
4.讨论法:学生进行小组讨论,鼓励他们积极参与交流和合作解决问题,培养他们的团队合作意识和沟通能力。
课程设计--链表存储方式下的数据的插入,删除和搜索
数据结构课程设计报告一·课程设计题目:链表存储方式下的数据的插入,删除和搜索。
二·课程设计内容描述:需求以动态演示的形式向用户展示在链表存储方式下的数据记性插入,删除和搜索的实现方法和内部过程。
输入以系统自动生成的方式新建链表,可以选择有序或无序生成,在面板显示出链表,链结点以箭头连接,以带色的方框内的数字为数据,需要生成特定链表可选择数据插入在链表首。
输出在面板显示及显示三种操作(插入,查找和删除)的具体方法和流程,显示方式以指示箭头来表示对链表内容或位置的查询。
插入或删除操作则在图中画出节点增加或者减少的过程。
功能该程序可实现单向链表的插入删除和查找过程的演示,以动态的显示展示其操作过程。
测试通过输入框中用户输入的数据和七个按钮的操作选择相应的功能,可实现动态演示。
三·思想和算法:对于演示可分为用户界面和动画演示两个部分在用户界面添加按钮,输入框,单项选择和演示区域,演示区域将使用动画演示进行展示。
在用户界面分别给按钮及输入框等添加监听器,通过调用动画演示方法以实现按钮功能。
动画演示通过创建show类实现链结点和创建showgroup类实现链结点的的动态显示。
其内部引用awt.Graphics类实现画线等功能。
对于三种操作来说,插入和删除的实现都必须依靠查找的功能,因此,在代码中有很大一部分是可以通用的,实现查找功能可分为两种:按用户输入的数据查找和按用户输入的位置查找,判定条件分别是show类中的值和showgroup中的curIn值。
插入操作需要在已建好的链表中增加一个节点,这就需要插入点以后的节点向后移动一个位置,将插入的节点放在该位置上,而删除是将插入点以后的节点向前移动一个位置。
在showgroup类中,定义链表数据的数组以存储数据,将数组内的数据分别赋给各个节点,通过创建链表的方法创建链表。
四·使用说明1·运行打开eclipse,导入工程,运行后,将显示如下界面界面中有七个按钮,一个单选项和两个输入框连续单击“新建”,按提示操作选择无序,出现以下界面或者选择有序则出现以下界面当输入有误时,则会有提示新建功能完成位置查找功能连续单击“数据查找”,按提示操作数据查找功能输入位置或数据不存在时删除操作按位置删除其他操作不再赘述。
教学设计双向链表
教学设计双向链表
本教学设计主要介绍双向链表的概念、结构、操作及其相关应用。
通过教学,学生将能够掌握如下知识点:
1. 双向链表的定义及其优缺点;
2. 双向链表的结构表示及操作方法;
3. 双向链表的插入、删除、查找、排序等操作;
4. 双向链表在实际应用中的应用,如LRU缓存算法等。
教学过程中,将采用理论课和实验课相结合的方式,通过概念讲解、示例演示、实验操作等环节,使学生深入了解双向链表的相关知识点,并能够运用所学知识解决实际问题。
注:本教学设计适用于计算机科学相关专业的本科生。
- 1 -。
双链表的建立查找插入删除算法的实现课程设计
数据结构课程设计设计说明书双链表的建立查找插入删除算法的实现学生姓名田园学号1221024050班级信管1202成绩指导教师申静数学与计算机科学学院2014年3月7日课程设计任务书2013—2014学年第二学期课程设计名称:数据结构课程设计课程设计题目:双链表的建立查找插入删除算法的实现完成期限:自2014年2月24日至2014年3月7 日共2 周设计内容:1.任务说明(1)任意输入一组数据,能得到一个带头结点的双向链表;(2)查找数据域为一特定值的某个结点时,从表头结点往后依次比较各结点数据域的值,若正是该特定值,则返回指向结点的指针,否则继续往后查,直到表尾;(3)可以随意地在某已知结点p前或者p后插入一个新的结点;(4)删除某个结点,即插入某个结点的逆操作2.要求1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?2)逻辑设计:写出抽象数据类型的定义,各个主要模块的算法,并画出模块之间的调用关系图;3)详细设计:定义相应的存储结构并写出各函数的伪码算法。
4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。
5)程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。
6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。
算法的时间、空间复杂性分析;7)编写课程设计报告;3.参考资料指导教师:申静教研室负责人:申静课程设计评阅摘要设计了一个程序,实现了双链表的建立查找插入删除。
双链表的每个数据结点都有两个指针,一个指向直接后继,另一个指向直接前驱。
所以从双向链表的任意一个结点开始,都可以很方便的访问它的前驱结点和后继结点。
并方便的实现查找、插入、删除运算。
关键词:双链表;前驱结点;后继结点目录1 课题描述 (2)2需求分析 (3)3 程序流程图 (4)4 概要设计 (10)创建链表 (10)插入函数 (11)删除函数 (12)查找函数 (12)5 调试分析以及设计体会 (14)6 源程序代码 (15)7运行结果 (22)8 总结 (27)参考文献 (28)1 课题描述双链表中有两条不同的方向链,即结点中有两个指针域,既可以顺指针往后寻查其他结点,也可以寻查结点的直接前驱。
双向链表上的插入和删除算法
编写程序,演示在双向链表上的插入和删除算法。
问题分析:1、在双向链表上操作首先要生成一个双向链表:1>节点定义struct DuLNode{ElemType data;DuLNode *prior;DuLNode *next;};2.> 创建双列表L=(DuLinkList)malloc(sizeof(DuLNode));L->next=L->prior=L;3>输入链表数据;2、3、对向链表进行插入操作算法:在节点p的前面加入一个新的节点q:q=(DuLinkList)malloc(sizeof(DuLNode));q->data=e;q->prior=p->prior;q->next=p;p->prior->next=q;p->prior=q;4、对双向链表进行删除操作算法删除给定节点p得到的代码如下:#include<iostream>#include<malloc.h>#define OK 1#define ERROR 0using namespace std;typedef int ElemType;typedef int status;struct DuLNode{ ElemType data;DuLNode *prior;DuLNode *next;};typedef DuLNode *DuLinkList;status DuListInsert_L(DuLinkList L,int i , ElemType e)//插入函数{DuLinkList p=L; //定义两个指向头节点的指针DuLinkList q=L;int j=0;while(p->next!=L&&j<i) //判断p是否到最后一个数据{p=p->next;j++;}if(p->next==L||j<i) //如果p是最后一个节点或者插入位置大于链表节点数{printf("无效的插入位置!\n");return ERROR;}//创建新节点q,数据为e,指针为nullq=(DuLinkList)malloc(sizeof(DuLNode));q->data=e;q->prior=p->prior;q->next=p;p->prior->next=q;p->prior=q;return OK;}status DuListDelete_L(DuLinkList L,int i , ElemType &e)//删除{DuLinkList p=L;int j=0;while(p->next!=L&&j<i){p=p->next;j++;}if(p->next==L||j<i){return ERROR;}p->prior->next=p->next;p->next->prior=p->prior;e=p->data;free(p);return OK;}int main(){ //初始化双向循环链表LDuLinkList L;L=(DuLinkList)malloc(sizeof(DuLNode)); //创建空双列表头结点L->next=L->prior=L;DuLNode *p,*q;ElemType e;//给L赋初始值p=L;q=L;while(cin>>e){p->next=(DuLNode*)malloc(sizeof(DuLNode));//分配新的节点q=p;p=p->next; //p指向新的节点p->data=e; //新结点的数据域为刚输入的ep->next=L; //新结点的指针域为头结点,表示这是单链表的最后一个结点p->prior=q;L->prior=p;}//p指向头指针,逐一输出链表的每个结点的值p=L;while(p->next!=L) //输出原列表{cout<<p->next->data<<' ';p=p->next;}cin.clear(); //清除上一个cin的错误信息cin.ignore(); //清空输入流int i;cout<<"输入待插入的元素e:";cin>>e;cout<<"输入待插入的位置i:";cin>>i;if(DuListInsert_L(L,i,e)){cout<<"插入后的双链为:";p=L;while(p->next!=L){cout<<p->next->data<<' ';p=p->next;}}printf("\n");p=L;while(p->next!=L) //输出列表{cout<<p->next->data<<' ';p=p->next;}int k;cin.clear(); //清除上一个cin的错误信息cin.ignore(); //清空输入流cout<<"要删除第几个节点k :";cin>>k;if(DuListDelete_L(L,k,e)){cout<<"被删除的元素为:"<<e<<endl;cout<<"删除后的元素为:";p=L;while(p->next!=L) //输出删除后的列表{cout<<p->next->data<<' ';p=p->next;}}elsecout<<"删除出错";return 0;}得到的结果如图罗达明电科一班学号2010301510028 2013、3、17。
双向链表的算法设计与实现实验报告
数学与计算科学学院实验报告
实验项目名称双向链表的算法设计与实现
所属课程名称__数据结构A
实验类型设计型
实验日期__
班级信计1402
学号201453100214
姓名俞凯烨
成绩
【实验小结】(收获体会)
附录1:源程序
附录2:实验报告填写说明
1.实验项目名称:要求与实验教学大纲一致。
2.实验目的:目的要明确,要抓住重点,符合实验教学大纲要求。
3.实验原理:简要说明本实验项目所涉及的理论知识。
4.实验环境:实验用的软、硬件环境。
5.实验方案(思路、步骤和方法等):这是实验报告极其重要的内容。
概括整个实验过程。
对于验证性实验,要写明依据何种原理、操作方法进行实验,要写明需要经过哪几个步骤来实现其操作。
对于设计性和综合性实验,在上述内容基础上还应该画出流程图、设计思路和设计方法,再配以相应的文字说明。
对于创新性实验,还应注明其创新点、特色。
6.实验过程(实验中涉及的记录、数据、分析):写明具体实验方案的具体实施步骤,包括实验过程中的记录、数据和相应的分析。
7.实验结论(结果):根据实验过程中得到的结果,做出结论。
8.实验小结:本次实验心得体会、思考和建议。
9.指导教师评语及成绩:指导教师依据学生的实际报告内容,给出本次实验报告的评价。
数据结构中的双向链表插入删除与查找的优化策略
数据结构中的双向链表插入删除与查找的优化策略在数据结构中,双向链表是一种常见且实用的数据结构,它具有节点中既包含前驱节点指针(prev),也包含后继节点指针(next)的特点。
双向链表的插入、删除和查找操作是常见的基本操作,为了提高这些操作的效率,我们可以采用一些优化策略。
本文将讨论双向链表插入、删除和查找操作的优化方法。
一、双向链表的插入优化策略双向链表的插入操作是将一个新节点插入到链表中的某个位置,一般情况下,我们可以通过以下步骤进行插入操作:1. 找到插入位置的前驱节点;2. 创建新节点,并将新节点的prev指针指向前驱节点,next指针指向前驱节点的后继节点;3. 将前驱节点的next指针指向新节点,后继节点的prev指针指向新节点。
然而,在实际应用中,我们可以通过一些优化策略来减少插入操作的时间复杂度。
1. 将链表按照特定顺序进行排序:通过维护一个有序的双向链表,可以使插入操作更加高效。
当需要插入新节点时,只需要遍历链表找到合适的位置进行插入,而不需要像无序链表那样遍历整个链表。
2. 使用“哨兵”节点:在链表头和尾部分别设置一个“哨兵”节点,可以简化插入操作。
当插入新节点时,不需要再对头节点和尾节点进行特殊处理,直接按照一般插入操作即可。
二、双向链表的删除优化策略双向链表的删除操作是将链表中的某个节点删除,一般情况下,我们可以通过以下步骤进行删除操作:1. 找到待删除的节点;2. 将待删除节点的前驱节点的next指针指向待删除节点的后继节点;3. 将待删除节点的后继节点的prev指针指向待删除节点的前驱节点;4. 删除待删除节点。
同样地,我们可以通过一些优化策略来提高删除操作的效率。
1. 使用“快速删除”策略:在实际应用中,我们可能需要经常删除某个特定值的节点。
为了提高删除效率,可以使用一个哈希表来存储节点的值和对应的指针,可以将删除操作的时间复杂度从O(n)降低到O(1)。
2. 批量删除操作:如果需要删除多个节点,可以先将待删除的节点标记,并在删除操作时一次性删除所有标记的节点。
C课程设计双向链表
C 课程设计双向链表一、课程目标知识目标:1. 学生能够理解双向链表的概念与结构,掌握双向链表的基本原理。
2. 学生能够掌握双向链表的插入、删除、查找等基本操作。
3. 学生能够了解双向链表在实际应用中的优势。
技能目标:1. 学生能够运用所学知识,独立编写双向链表的基本操作代码。
2. 学生能够通过分析问题,选择合适的链表结构进行数据存储与处理。
3. 学生能够运用双向链表解决实际问题,提高编程能力。
情感态度价值观目标:1. 学生培养对数据结构与算法的兴趣,激发主动学习的热情。
2. 学生通过团队合作,培养沟通与协作能力,增强团队意识。
3. 学生在学习过程中,培养勇于尝试、克服困难的精神,提高解决问题的自信心。
课程性质:本课程为计算机科学领域的数据结构与算法课程,旨在帮助学生掌握双向链表这一基本数据结构。
学生特点:学生为高中一年级计算机兴趣小组,具备一定的编程基础,对数据结构有一定了解。
教学要求:结合学生特点,注重理论与实践相结合,通过案例教学,引导学生主动探索、实践,达到学以致用的目的。
在教学过程中,关注学生的个体差异,给予个性化指导,确保每个学生都能掌握双向链表的知识。
同时,注重培养学生的团队合作能力和解决问题的能力。
二、教学内容1. 双向链表基本概念:介绍双向链表的定义、结构与特点,以及与单向链表的对比。
- 教材章节:第二章第二节“双向链表的基本概念”2. 双向链表的操作:讲解双向链表的插入、删除、查找等基本操作,并通过实例演示。
- 教材章节:第二章第三节“双向链表的操作”3. 双向链表的应用:介绍双向链表在实际编程中的应用场景,如双向链表实现的队列、栈等。
- 教材章节:第二章第四节“双向链表的应用”4. 编程实践:布置相关编程任务,让学生动手实践双向链表的创建、操作和应用。
- 教材章节:第二章练习题“双向链表编程实践”教学内容安排与进度:1. 课时1:双向链表基本概念2. 课时2:双向链表的操作(上)3. 课时3:双向链表的操作(下)4. 课时4:双向链表的应用5. 课时5:编程实践与讨论在教学过程中,确保学生充分理解每个知识点,注重理论与实践相结合,逐步引导学生掌握双向链表的相关知识。
双向链表的建立插入删除算法的实现-数据结构课程设计
指导教师(签字): 批准日期: 2011 年 2 月 21 日
教研室主任(签字):
摘要
本课程设计采用 Visual C++作为软件开发环境,其具体的实现过程依次是:建立空指 针、构成双向链表、增加节点并给每个节点赋值,最后再通过所建链表进行插入、删除、 查找等程序,从而实现了链表问题求解,可以用一般的指针来实现,但是数据库中着重强 调了结构体,本程序用结构体指针更容易理解和实现初始化。
在双向链表中,若 d 为指向表中某一节点的指针(即 d 为 Du Link List 型变量),显 然有 d->next->prior=d->prior->next=d 这个表达式恰当的反应了这种结构的特性。
第 2页 共 27页
3 逻辑设计
此程序分为三大模块:数据输入模块、数据删除模块、数据查找模块。 数据输入模块完成数据的输入和存储,数据删除模块主要完成个人对没用的数据进行 删除,数据查找模块方便个人查找存储在里边的数据。 函数调用流程如图 3.
绩
指导教师
陈姣 0921024023
信 管 091
魏佳
计算机科学与技术系 2011 年 3 月 4 日
数据结构课程设计评阅书
题 目 双向链表的建立插入删除算法的实现
学生姓名 陈姣
学号 0921024023
指导教师评语及成绩
成绩:
教师签名:
答辩教师评语及成绩
年月日
成绩: 教研室意见
struct lnode *next,*prior;
// 表示 循环双链表
}lnode;
4.2 子函数设计
4.2.1 显示菜单设计
4.1 头文件设计......................................................................................................... 4 4.2 子函数设计......................................................................................................... 4
双向链表课程设计c语言
双向链表课程设计c语言一、教学目标本课程的教学目标是使学生掌握双向链表的基本概念、原理和实现方法。
具体包括:1.知识目标:–了解双向链表的定义、特点和应用场景;–掌握双向链表的基本操作,如插入、删除、查找和遍历;–理解双向链表的存储结构和相关算法。
2.技能目标:–能够使用C语言实现双向链表的基本操作;–能够运用双向链表解决实际问题,如实现一个简单的文件管理系统;–能够对双向链表进行性能分析和优化。
3.情感态度价值观目标:–培养学生对计算机科学的兴趣和热情;–培养学生严谨、细致的编程习惯;–培养学生的团队协作能力和创新精神。
二、教学内容本课程的教学内容主要包括以下几个方面:1.双向链表的基本概念:介绍双向链表的定义、特点和应用场景,使学生了解双向链表的基本原理。
2.双向链表的实现:讲解双向链表的存储结构和相关算法,引导学生掌握双向链表的基本操作,如插入、删除、查找和遍历。
3.双向链表的应用:通过实例分析,让学生学会运用双向链表解决实际问题,如实现一个简单的文件管理系统。
4.双向链表的性能分析和优化:分析双向链表的优缺点,引导学生了解如何根据实际需求对双向链表进行性能优化。
本课程采用多种教学方法,以激发学生的学习兴趣和主动性:1.讲授法:教师讲解双向链表的基本概念、原理和实现方法,引导学生掌握相关知识。
2.案例分析法:通过分析实际案例,让学生学会运用双向链表解决实际问题。
3.实验法:安排实验课,让学生动手实现双向链表的基本操作,培养学生的编程能力和实践能力。
4.讨论法:课堂讨论,让学生分享学习心得和经验,提高学生的团队协作能力和沟通能力。
四、教学资源本课程所需教学资源包括:1.教材:选用权威、实用的教材,如《数据结构与算法分析:C语言描述》;2.参考书:提供相关领域的经典著作和论文,供学生深入研究;3.多媒体资料:制作课件、教学视频等,辅助学生理解双向链表的原理和操作;4.实验设备:提供计算机实验室,让学生进行编程实践和实验操作。
双向链表排序c语言课程设计
双向链表排序c语言课程设计一、教学目标本课程的教学目标是使学生掌握双向链表排序在C语言中的实现和应用。
具体目标如下:1.理解双向链表的基本概念和结构。
2.掌握双向链表的插入、删除、查找等基本操作。
3.理解排序算法的基本原理及双向链表排序的实现方式。
4.能够使用C语言编写双向链表的相关操作。
5.能够实现双向链表排序算法。
6.能够分析、解决与双向链表排序相关的问题。
情感态度价值观目标:1.培养学生的逻辑思维能力和问题解决能力。
2.培养学生对计算机科学和编程的兴趣。
3.培养学生团队合作、自主学习的能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.双向链表的基本概念和结构。
2.双向链表的插入、删除、查找等基本操作的实现。
3.排序算法的基本原理及双向链表排序的实现方式。
4.双向链表排序在实际应用中的案例分析。
5.双向链表的基本概念和结构(2课时)。
6.双向链表的插入、删除、查找等基本操作的实现(3课时)。
7.排序算法的基本原理及双向链表排序的实现方式(2课时)。
8.双向链表排序在实际应用中的案例分析(2课时)。
三、教学方法本课程采用多种教学方法相结合的方式,以激发学生的学习兴趣和主动性:1.讲授法:用于讲解基本概念、原理和算法。
2.案例分析法:通过分析实际案例,使学生更好地理解双向链表排序的应用。
3.实验法:让学生动手编写代码,实现双向链表排序,培养实际操作能力。
4.讨论法:引导学生进行思考和讨论,提高学生的逻辑思维和问题解决能力。
四、教学资源本课程的教学资源包括:1.教材:《C程序设计原理与应用》。
2.参考书:《数据结构与算法分析:C语言描述》。
3.多媒体资料:教学PPT、视频教程等。
4.实验设备:计算机、编程环境等。
以上教学资源将用于支持教学内容和教学方法的实施,丰富学生的学习体验。
五、教学评估本课程的教学评估将采用多种方式,以全面、客观地评价学生的学习成果。
评估方式包括:1.平时表现:通过课堂参与、提问、讨论等环节,评估学生的学习态度和理解程度。
数据结构实验建立双向循环链表以及插入删除操作
数据结构实验建立双向循环链表以及插入删除操作实验一要求:①建立双向循环链表②实现链表的插入、删除运行程序点此处实验程序源代码:#include ""#include<>#include<>#define OVERFLOW -2#define ERROR 0#define OK 1typedef int status;//双向循环链表的存储结构typedef struct DuLNode{int data;int Length;struct DuLNode *prior;struct DuLNode *next;} DuLNode,*DuLinkList;//构建一个空的双向循环链表void InitList(DuLNode **p){*p=(DuLNode *)malloc(sizeof(DuLNode));if(*p){(*p)->next=(*p)->prior=*p;(*p)->Length=0;}elseexit(OVERFLOW);}//双向循环链表的创建void Create(DuLinkList &L,int n){//输入n个元素的值,建立带头结点的双线循环链表L DuLinkList p=L,q;int i;for(i=1;i<=n;i++){q=(DuLinkList)malloc(sizeof(DuLNode));printf("您该输入第%d个元素的值了:",i);scanf("%d",&q->data);p->next =q;q->prior=p;q->next=L;L->prior =q;p=q;L->Length ++;}}//查找元素的位置DuLinkList GetElemP(DuLinkList h,int i){int j;DuLinkList p=h;for(j=1;j<=i;j++)p=p->next ;return p;}//结点的插入status Listinsert(DuLNode *m,int i,int e){//在带头结点的双链循环线性表L中第i个位置之前插入元素e,i 的合法值为1≤i≤表长DuLinkList p,q;if(i<1||i>(m->Length)) // i值不合法return ERROR;p=GetElemP(m,i);if(!p)return ERROR;q=(DuLinkList)malloc(sizeof(DuLNode));if(!q)return OVERFLOW;q->data=e;q->prior=p->prior;p->prior->next=q;q->next=p;p->prior=q;m->Length++;printf("您在双向循环链表第%d个位置之前插入了一结点元素:%d\n",i,e);return OK;}//结点的删除status ListDelete(DuLinkList L,int i){//删除带头结点的双链循环线性表L的第i个元素,i的合法值为1≤i≤表长DuLinkList p;if(i<1) /* i值不合法 */return ERROR;p=GetElemP(L,i);if(!p)return ERROR;p->prior->next=p->next;p->next->prior=p->prior;L->Length --;printf("删除了双线循环链表中第%d个结点,元素值为:%d\n",i,p->data); free(p);return OK;}//结点的输出void Display( DuLinkList L){ DuLinkList p;printf("双向循环链表中的结点的数据为:");for(p=L->next ;p->next !=L;){printf("%d",p->data);printf(" & ");p=p->next ;}printf("%d\n",p->data );}//主函数实现链表的创建,插入,删除等操作void main(){DuLinkList L;int n,i;InitList(&L) ;printf("你想创建几个循环节点就输入几就行啦,请输入:"); scanf("%d",&n);Create(L,n);Listinsert(L,3,3);//结点的插入printf("您想删除哪个结点呢");scanf("%d",&i);printf("您确定删除此结点吗1:YES 2:NO(回复数字确认)"); if(i=2){printf("您想删除哪个结点呢");scanf("%d",&i);ListDelete(L,i);}else{ListDelete(L,i);}//结点的删除Display(L);printf("双向循环链表中结点的个数为:%d\n",L->Length); }。
双向链表的建立、查找、插入、删除
/*双链表的操作:查询、删除、显示、插入。
*双向链表克服单向链表向前查找结点需要执行时间O(n)的缺点*2008.1.17*/#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 10typedef struct node *ptNode;struct node{char name[20];ptNode lLink,rLink;};/*双链表的结构定义*//*双链表的创建*/ptNode Creat(int n){ptNode head,ptr,newnode;int i;if((head=(ptNode)malloc(sizeof(node))) == NULL){printf("cannot find space!\n");exit(0);}head->name[0] = '\0';//头结点初始化head->lLink = NULL;head->rLink = NULL;ptr = head;for(i=0; i<n; i++){if((newnode=(ptNode) malloc(sizeof(node))) == NULL){printf("cannot find space!\n");exit(0);}ptr->rLink = newnode;//连接新结点printf("Please input the %d man's name: ",i+1);scanf("%s",newnode->name);newnode->lLink = ptr;//定义newnode的连接关系newnode->rLink = NULL;ptr = newnode;}//end forhead->lLink = newnode;ptr->rLink = head;return(head);}/*查找名字的位置*/ptNode Search(ptNode head,char *pEle){ptNode ptr;char *pTemp;ptr = head->rLink;while(ptr != head)//以是否回到头结点为结束条件{pTemp = ptr->name;//pTemp暂存结点的名字地址if(strcmp(pTemp,pEle) == 0){return(ptr);}else{ptr = ptr->rLink;//指向下一结点}}printf("cannot find data!\n");return NULL;}//在选定名字前插入void Insert(ptNode head,char *prior,char *insertEle){ptNode ptr,newnode;if((ptr=Search(head,prior)) ==NULL){printf("Can't find the data to insert!\n");exit(0);}if((newnode=(ptNode)malloc(sizeof(node))) == NULL){printf("Can't arrange memory space!\n");exit(0);}strcpy(newnode->name,insertEle);//给新结点加载值newnode->lLink = ptr->lLink;//前指针指向前结点,先处理以新结点为中心前后关系newnode->rLink = ptr;//新结点后指针指向定位结点(ptr->lLink)->rLink = newnode;//前结点的由指针指向新结点ptr->lLink = newnode;}/*打印输出*/void Print(ptNode head){ptNode ptr;ptr = head->rLink;printf("\nNow the double list is:\n");while(ptr != head){printf("%s ",ptr->name);ptr = ptr->rLink;}printf("\n");}/*删除*/void Delete(ptNode ptr){(ptr->rLink)->lLink = ptr->lLink;//(ptr->rLink)->lLink下一结点的左指针被赋前指针(ptr->lLink)->rLink = ptr->rLink;free (ptr);}/*主函数*/void main(void){int number;char studName[20];char insertName[20];ptNode head,searchpoint;number = N;puts("Please input the size of the list:");scanf("%d",&number);head = Creat(number);Print(head);printf("\nPlease input the name which you want to find:\n");scanf("%s",studName);searchpoint = Search(head,studName);printf("the name you want to find is:%s\n",searchpoint->name);Delete(searchpoint);Print(head);printf("Before which element do you want to insert:\n");scanf("%s",studName);printf("Enter the student name you want to insert:\n");scanf("%s",insertName);Insert(head,studName,insertName);Print(head);puts("\n");}。
「C语言」单链表双向链表的建立遍历插入删除
「C语⾔」单链表双向链表的建⽴遍历插⼊删除最近临近期末的C语⾔课程设计⽐平时练习作业⼀下难了不⽌⼀个档次,第⼀次接触到了C语⾔的框架开发,了解了View(界⾯层)、Service(业务逻辑层)、Persistence(持久化层)的分离和耦合,⼀种⾯向过程的MVC的感觉。
⽽这⼀切的基础就在于对链表的创建、删除、输出、写⼊⽂件、从⽂件读出......本篇⽂章在于巩固链表的基础知识(整理⾃《C语⾔程序设计教程--⼈民邮电出版社》第⼗章——指针与链表),只对链表的概念及增删改查作出探讨,欢迎指教。
⼀、链表结构和静态/动态链表⼆、单链表的建⽴与遍历三、单链表的插⼊与删除四、双向链表的概念五、双向链表的建⽴与遍历六、双向链表的元素查找七、循环链表的概念⼋、合并两个链表的实例九、链表实战拓展思维、拉到最后去看看 (•ᴗ•)و⼀、链表结构和静态/动态链表链表是⼀种常见的数据结构——与数组不同的是:1.数组⾸先需要在定义时声明数组⼤⼩,如果像这个数组中加⼊的元素个数超过了数组的长度时,便不能正确保存所有内容;链表可以根据⼤⼩需要进⾏拓展。
2.其次数组是同⼀数据类型的元素集合,在内存中是按⼀定顺序连续排列存放的;链表常⽤malloc等函数动态随机分配空间,⽤指针相连。
链表结构⽰意图如下所⽰:在链表中,每⼀个元素包含两个部分;数据部分和指针部分。
数据部分⽤来存放元素所包含的数据,指针部分⽤来指向下⼀个元素。
最后⼀个元素的指针指向NULL,表⽰指向的地址为空。
整体⽤结构体来定义,指针部分定义为指向本结构体类型的指针类型。
静态链表需要数组来实现,即把线性表的元素存放在数组中。
数组单元存放链表结点,结点的链域指向下⼀个元素的位置,即下⼀个元素所在数组单元的下标。
这些元素可能在物理上是连续存放的,也有可能是不连续的,它们之间通过逻辑关系来连接——这就要涉及到数组长度定义的问题,实现⽆法预知定义多⼤的数组,动态链表随即出现。
动态链表指在程序执⾏过程中从⽆到有地建⽴起⼀个链表,即⼀个⼀个地开辟结点和输⼊各结点的数据,并建⽴起前后相连的关系。
双链表的各种基本算法
双链表的各种基本算法双链表是一种常见的数据结构,它由节点组成,每个节点除了包含一个数据元素外,还有两个指针,分别指向前一个节点和后一个节点。
双链表具有插入、删除、遍历等基本操作,下面将介绍双链表的各种基本算法。
一、双链表的插入操作双链表的插入操作可以在指定位置插入一个新节点。
插入操作分为三种情况:在表头插入、在表尾插入和在指定位置插入。
1. 在表头插入:将新节点的next指针指向原表头节点,将原表头节点的prev指针指向新节点,更新表头指针为新节点。
2. 在表尾插入:将新节点的prev指针指向原表尾节点,将原表尾节点的next指针指向新节点,更新表尾指针为新节点。
3. 在指定位置插入:找到要插入位置的节点,将新节点的next指针指向该节点的next节点,将新节点的prev指针指向该节点,将该节点的next节点的prev指针指向新节点,将该节点的next指针指向新节点。
二、双链表的删除操作双链表的删除操作可以删除指定位置的节点。
删除操作分为三种情况:删除表头节点、删除表尾节点和删除指定位置节点。
1. 删除表头节点:将表头指针指向表头节点的next节点,将新的表头节点的prev指针置为空。
2. 删除表尾节点:将表尾指针指向表尾节点的prev节点,将新的表尾节点的next指针置为空。
3. 删除指定位置节点:找到要删除位置的节点,将该节点的prev 节点的next指针指向该节点的next节点,将该节点的next节点的prev指针指向该节点的prev节点。
三、双链表的查找操作双链表的查找操作可以根据给定的条件查找满足条件的节点。
查找操作分为两种:按值查找和按位置查找。
1. 按值查找:从表头开始遍历双链表,逐个比较节点的数据元素与给定值是否相等,直到找到满足条件的节点或遍历结束。
2. 按位置查找:从表头开始遍历双链表,遍历到指定位置的节点。
四、双链表的遍历操作双链表的遍历操作可以按顺序访问双链表中的每个节点。
双链表的建立插入删除算法的实现
双链表的建立插入删除算法的实现摘要设计一个个人电话本,该电话本是基于双链表的具体功能实现,双链表的主要功能是查找、删除和插入。
其具体的实现过程:依次是建立空指针、构成双向链表、增加结点并给每个结点赋值,最后再通过所建链表进行插入,删除,查找等程序,从而实现了链表问题求解.可以用一般的指针来实现,但是数据库中着重强调了结构体,本题用结构体指针更容易理解和实现和初始化。
关键字:双链表;直接前驱;直接后继;节点;目录1 课程设计内容 (6)2 设计要求 (7)2.1 问题定义和任务分析 (7)2.2 逻辑设计 (7)2.3 详细设计 (8)2.4程序流程图 (11)2.5.程序编码 (12)2.6 程序的调试与测试 (15)总结 (18)参考文献 (19)1 课程设计内容用C/C++编写一个程序实现双向链表的建立、插入、删除算法。
要求建立的链表要有一定的应用价值,具体应用内容设计者自己确定。
建立双向链表必须运用结构体建立两个指针,先定义一个双链节点--但是,它的名字必须叫Node,当你派生双向链表时,这样写template <calss Type>class DblList : public List<newtype<Type >>,注意连续的两个">"之间要有空格。
或者根本不定义这样的结构,直接拿Node类型来做。
开发工具:visual C++6.02 设计要求本次设计是基于visual C++作为开发环境,采用双链表的插入删除查找等功能,来实现个人电话本的相应功能。
2.1 问题定义和任务分析通过题目要求本课题是用C/C++来实现双链表的插入删除查找的功能,具体应用于个人电话本,电话本中含有存储姓名和电话(电话号码使用整型,姓名使用字符型)。
双链表的节点中有两个指针域,其一指向直接后继,另一个指向直接前继。
和单链表的循环类似,双链表也可以有循环表。
在双向链表中,若d为指向表中某一结点的指针(即d为DuLinkList型变量),显然有d->next->prior=d->prior->next=d这个表示式恰当地反映了这种结构的特性。
数据结构和算法课程设计题目
北方民族大学课程设计课程名称:数据结构与算法院(部)名称:信息与计算科学学院组长姓名学号同组人员姓名指导教师姓名:纪峰设计时间:2010.6.7----2009.6.27一、《数据结构与算法》课程设计参考题目(一)参考题目一(每位同学选作一个,同组人员不得重复)1、编写函数实现顺序表的建立、查找、插入、删除运算。
2、编写函数分别实现单链表的建立、查找、插入、删除、逆置算法。
3、编写函数实现双向链表的建立、插入、删除算法。
4、编写函数实现顺序栈的进栈、退栈、取栈顶的算法。
5、编写函数实现链栈的进栈、退栈、取栈顶的算法。
6、编写函数实现双向顺序栈的判空、进栈、出栈算法。
7、编写函数实现循环队列的判队空、取队头元素、入队、出队算法。
8、编写函数实现链环队列的判队空、取队头节点、入队、出队算法。
9、编写函数实现串的,求串长、连接、求字串、插入、删除等运算。
10、分别实现顺序串和链串的模式匹配运算。
11、实现二叉树的建立,前序递归遍历和非递归遍历算法。
12、实现二叉树的建立,中序递归遍历和非递归遍历算法。
13、实现二叉树的建立,后序递归遍历和非递归遍历算法。
14、实现二叉树的中序线索化,查找*p结点中序下的前驱和后继结点。
15、分别以临接表和邻接矩阵作为存储就够实现图的深度优先搜索和广度优先搜索算法。
16、利用线性探测处理冲突的方法实现散列表的查找和插入算法。
(二)参考题目二(每三人一组,任选三个题目完成)1.运动会分数统计(限1人完成)任务:参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20)功能要求:1)可以输入各个项目的前三名或前五名的成绩;2)能统计各学校总分,3)可以按学校编号或名称、学校总分、男女团体总分排序输出;4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
C++双向循环链表代码(建立、排序、插入、删除)
C++双向循环链表代码(建立、排序、插入、删除)/*编写一个完整的程序,实现双向循环链表的基本操作(1)利用尾插法建立一个双向循环链表。
(2)遍历双向循环链表。
(3)实现双向循环链表中删除一个指定元素。
(4)在非递减有序双向循环链表中实现插入元素e仍有序算法。
(5)判断双向循环链表中元素是否对称若对称返回1否则返回0。
(6)设元素为正整型,实现算法把所有奇数排列在偶数之前。
(7)在主函数中设计一个简单的菜单调试上述算法。
*/#include#includetypedef int elemtype;typedef struct DuLNode //定义结点类型{elemtype data;struct DuLNode *prior;struct DuLNode *next;}DuLNode,*Dulinklist;int initlist(Dulinklist &L) //初始化双向链表{L=(Dulinklist)malloc(sizeof(DuLNode)); //表头附加结点if(!L) exit(-2);L->data=0;L->next=L;L->prior=L;return 1;}//初始化了一个空表void createlist(Dulinklist &L) //尾插法生成双向链表{Dulinklist p,t;t=L;printf("尾插法:请输入双向链表节点值,以输入0结束。
\n"); scanf("%d",&t->data);while(t->data!=0){p=(Dulinklist)malloc(sizeof(DuLNode));if(!p) exit(-2);t->next=p;p->prior=t;scanf("%d",&p->data);t=p;}L->prior=t->prior;t->prior->next=L;}void shuchulist(Dulinklist L)//通过链表的遍历来输出链表中的信息{int i;Dulinklist p;printf("双向链表为:");for(p=L,i=1;p->next!=L;p=p->next) {printf(" %d",p->data);i++;}printf(" %d\n",p->data);printf("双向链表的长度为 %d\n\n",i); }Dulinklist GetElem(Dulinklist L,int x) //获取双向链表中值为X的结点指针{Dulinklist t,p;t=L;if(t->data==x) return t;t=t->next;for(p=NULL;t!=L;t=t->next)if(t->data==x) {p=t;break;}return p;}int shanchu(Dulinklist &L,int x)//删除链表L中的值为X的结点{Dulinklist p;int flag;flag=0;while(p=GetElem(L,x)){p->prior->next=p->next;p->next->prior=p->prior;free(p);flag=1;}if(flag) return 1;else return 0;}int duichen(Dulinklist L)//判断双向循环链表中元素是否对称若对称返回1否则返回0 {Dulinklist p,q;int flag;flag=1;p=L;q=L->prior;while(q->prior!=p->next&&p->next!=q){if(p->data!=q->data) {flag=0;break;}q=q->prior;p=p->next;}if(p==q) flag=1;if(p->data!=q->data) flag=0;return flag;}int pailie(Dulinklist &L)//设元素为正整型,实现算法把所有奇数排列在偶数之前。
双链表(初始化,建立,插入,查找,删除)
双链表(初始化,建⽴,插⼊,查找,删除)双向链表和单向链表也是有很多相似的地⽅的,听名字可以猜到,每个节点都包含两个指针,⼀个指针指向上⼀个节点,⼀个指针指向下⼀个节点。
这⾥有两个特殊的地⽅,第⼀就是头节点的⼀个指针指向NULL空指针(没有前驱节点),第⼆就是尾节点的⼀个指针指向NULL指针(没有后继节点)。
#ifndef DOUBLY_LINKED_LIST_H#define DOUBLY_LINKED_LIST_Htypedef struct Node{int data;struct Node *pNext;struct Node *pPre;}NODE, *pNODE;//创建双向链表pNODE CreateDbLinkList(void);//打印链表void TraverseDbLinkList(pNODE pHead);//判断链表是否为空int IsEmptyDbLinkList(pNODE pHead);//计算链表长度int GetLengthDbLinkList(pNODE pHead);//向链表插⼊节点int InsertEleDbLinkList(pNODE pHead, int pos, int data);//从链表删除节点int DeleteEleDbLinkList(pNODE pHead, int pos);//删除整个链表,释放内存void FreeMemory(pNODE *ppHead);#endifDbLinkList.cpp 双向链表的源⽂件——包含了各种操作函数的定义。
(1)这部分是创建双向链表,和单向链表很相似,但是呢,有些地⽅还是得注意,就是每创建⼀个节点的时候都要注意初始化它的两个指针。
#include <stdio.h>#include <stdlib.h>#include "DbLinkList.h"//创建双向链表pNODE CreateDbLinkList(void){int i, length = 0, data = 0;pNODE pTail = NULL, p_new = NULL;pNODE pHead = (pNODE)malloc(sizeof(NODE));if (NULL == pHead){printf("内存分配失败!\n");exit(EXIT_FAILURE);}pHead->data = 0;pHead->pPre = NULL;pHead->pNext = NULL;pTail = pHead;printf("请输⼊想要创建链表的长度:");scanf("%d", &length);for (i=1; i<length+1; i++){p_new = (pNODE)malloc(sizeof(NODE));if (NULL == p_new){printf("内存分配失败!\n");exit(EXIT_FAILURE);}printf("请输⼊第%d个元素的值:", i);scanf("%d", &data);p_new->data = data;p_new->pNext = NULL;p_new->pPre = pTail;pTail->pNext = p_new;pTail = p_new;}return pHead;}(2)这部分是获得双向链表的信息,这⾥和单向链表基本⼀致,因为遍历的时候只⽤到了⼀个指针。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计设计说明书双链表的建立查找插入删除算法的实现学生姓名田园学号1221024050班级信管1202成绩指导教师申静数学与计算机科学学院2014年3月7日课程设计任务书2013—2014学年第二学期课程设计名称:数据结构课程设计课程设计题目:双链表的建立查找插入删除算法的实现完成期限:自2014年2月24日至2014年3月7 日共2 周设计内容:1.任务说明(1)任意输入一组数据,能得到一个带头结点的双向链表;(2)查找数据域为一特定值的某个结点时,从表头结点往后依次比较各结点数据域的值,若正是该特定值,则返回指向结点的指针,否则继续往后查,直到表尾;(3)可以随意地在某已知结点p前或者p后插入一个新的结点;(4)删除某个结点,即插入某个结点的逆操作2.要求1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?2)逻辑设计:写出抽象数据类型的定义,各个主要模块的算法,并画出模块之间的调用关系图;3)详细设计:定义相应的存储结构并写出各函数的伪码算法。
4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。
5)程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。
6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。
算法的时间、空间复杂性分析;7)编写课程设计报告;3.参考资料指导教师:申静教研室负责人:申静课程设计评阅摘要设计了一个程序,实现了双链表的建立查找插入删除。
双链表的每个数据结点都有两个指针,一个指向直接后继,另一个指向直接前驱。
所以从双向链表的任意一个结点开始,都可以很方便的访问它的前驱结点和后继结点。
并方便的实现查找、插入、删除运算。
关键词:双链表;前驱结点;后继结点目录1 课题描述 (2)2需求分析 (3)3 程序流程图 (4)4 概要设计 (10)创建链表 (10)插入函数 (11)删除函数 (12)查找函数 (12)5 调试分析以及设计体会 (14)6 源程序代码 (15)7运行结果 (22)8 总结 (27)参考文献 (28)1 课题描述双链表中有两条不同的方向链,即结点中有两个指针域,既可以顺指针往后寻查其他结点,也可以寻查结点的直接前驱。
克服了单链表的单向性,更加方便快捷。
2需求分析链表是线性表的链式表示,双链表是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前趋。
所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
由于它不要求逻辑上相邻的元素在物理位置上也相邻,所以它没有顺序存储结构在做插入删除操作时需要移动大量元素的弱点。
在单链表存储结构结点中只有一个指示直接后继的指针域,由此,从某个结点出发只能顺指针往后寻查其他结点。
若要寻查结点的直接前趋,则需从表头指针出发。
而在双链表结点中有两个指针域,其一指向直接后继,另一指向直接前趋。
3 程序流程图图3—1主函数流程图图3—2创建一个双链表流程图图3—3插入元素流程图图3—4删除结点流程图图3—5查找元素图3—6显示链表示意图4 概要设计创建链表int data;struct DoubleList *prior,*next;}DoubleList;struct DoubleList * InitList(){struct DoubleList *head,*p,*q;int d,k;printf("\n创建一个链表:\n\n");head=(struct DoubleList *)malloc(sizeof(struct DoubleList)); head->next=null;head->prior=null;p=head;do{scanf("%d",&d);if(d<=0){printf("\n您所输入的数据有误,请重新输入\n\n");scanf("%d",&d);}else{q=(struct DoubleList *)malloc(sizeof(struct DoubleList));q->next=null;q->data=d;q->prior=p;p->next=q;p=p->next;length++;}printf("是否继续输入(是(1)否(2)):");scanf("%d",&k);}while(k!=2);return head;}插入函数void ListInsert(struct DoubleList *head,int i,int e){struct DoubleList *p,*q;int j=1;if(i>0&&i<=length+1){p=head;while(j<i){p=p->next;j++;}q=(struct DoubleList *)malloc(sizeof(struct DoubleList));q->data=e;q->next=p->next;if(p->next)p->next->prior=q;q->prior=p;p->next=q;}elseprintf("对不起您所输入的节点位置出错,数据插入失败!\n"); }删除函数int ListDelete(struct DoubleList *head,int i) {struct DoubleList *p;int e,j=0;p=head;while(j<i){p=p->next;j++;}e=p->data;p->prior->next=p->next;if(p->next)p->next->prior=p->prior;free(p);return e;}查找函数void search(struct DoubleList *head,int n) {struct DoubleList *p;int i=1;p=head;do{p=p->next;if(p->data==n){printf("查找的元素在链表中第%d位\n",i); break;}i++;}while(p->next!=null);if(i==length+1){ printf("查找的元素不在链表中\n");} }5 调试分析以及设计体会程序调试中遇到的问题以及解决问题的方法。
主要是在结点插入判断方面有难度,一开始不能准确的进行结点的判断和插入,然后就是插入结点的过程中位置不对,后来通过同学的帮助解决了这个问题。
还有就是在显示指针变化方面有问题,经过查询资料,解决结点插入方面的问题,用画箭头的方式来表现指针的变化。
在运行程序时发现程序不能对不合法的位置进行判断,最后通过修改加上一个计数的变量解决了这个问题。
6 源程序代码#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define null 0#define error -1#define z 1000int length=0;struct DoubleList{int data;struct DoubleList *prior,*next;}DoubleList;struct DoubleList * InitList(){struct DoubleList *head,*p,*q;int d,k;printf("\n创建一个链表:\n\n");head=(struct DoubleList *)malloc(sizeof(struct DoubleList)); head->next=null;head->prior=null;p=head;do{scanf("%d",&d);if(d<=0){printf("\n您所输入的数据有误,请重新输入\n\n");scanf("%d",&d);}else{q=(struct DoubleList *)malloc(sizeof(struct DoubleList));q->next=null;q->data=d;q->prior=p;p->next=q;p=p->next;length++;}printf("是否继续输入(是(1)否(2)):");scanf("%d",&k);}while(k!=2);return head;}void ListInsert(struct DoubleList *head,int i,int e){struct DoubleList *p,*q;int j=1;if(i>0&&i<=length+1){p=head;while(j<i){p=p->next;j++;}q=(struct DoubleList *)malloc(sizeof(struct DoubleList));q->data=e;q->next=p->next;if(p->next)p->next->prior=q;q->prior=p;p->next=q;}elseprintf("对不起您所输入的节点位置出错,数据插入失败!\n"); }int ListDelete(struct DoubleList *head,int i){struct DoubleList *p;int e,j=0;p=head;while(j<i){p=p->next;j++;}e=p->data;p->prior->next=p->next;if(p->next)p->next->prior=p->prior;free(p);return e;}void search(struct DoubleList *head,int n){struct DoubleList *p;int i=1;p=head;do{p=p->next;if(p->data==n){printf("查找的元素在链表中第%d位\n",i);break;}i++;}while(p->next!=null);if(i==length+1){ printf("查找的元素不在链表中\n");} }void print(struct DoubleList *head) {struct DoubleList *p,*q;if(head){p=head->next;printf("正向:\n\n");while(p){printf("%5d ",p->data);q=p;p=p->next;}printf("\n\n逆向:\n\n");while(q->prior){printf("%5d ",q->data);q=q->prior;}printf("\n");}}void main(){struct DoubleList *head;int i,e,n;head=null;do{system("cls");printf("\n\n 双向链表的相关操作\n\n\n"); printf(" 1. 创建一个新链表。