数据结构课程设计链表操作.docx
- 文档编号:22783846
- 上传时间:2023-04-27
- 格式:DOCX
- 页数:15
- 大小:163.29KB
数据结构课程设计链表操作.docx
《数据结构课程设计链表操作.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计链表操作.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构课程设计链表操作
1选题背景
陈火旺院士把计算机60多年的发展成就概括为五个“一”:
开辟一个新时代----信息时代,形成一个新产业----信息产业,产生一个新科学----计算机科学与技术,开创一种新的科研方法----计算方法,开辟一种新文化----计算机文化,这一概括深刻影响了计算机对社会发展所产生的广泛而深远的影响。
数据结构和算法是计算机求解问题过程的两大基石。
著名的计算机科学家P.Wegner指出,“在工业革命中其核心作用的是能量,而在计算机革命中其核心作用的是信息”。
计算机科学就是“一种关于信息结构转换的科学”。
信息结构(数据结构)是计算机科学研究的基本课题,数据结构又是算法研究的基础。
2方案与论证
2.1链表的概念和作用
链表是一种链式存储结构,链表属于线性表,采用链式存储结构,也是常用的动态存储方法。
为了克服顺序表的缺陷,可以采用链式方式存储线性表。
通常将采用链式存储结构的线性表称为线性链表。
单链表的结构包括数据域和指针域,这两部分总称为结点(Node)。
单链表中每个结点的存储地址放在其前驱结点的指针域中,由于线性表中的第一个结点无前驱,所以应设一个头指针H指向第一个结点。
由于线性表的最后一个节点没有直接后继,则制定单链表的最后一个结点的指针域为空(NULL)。
它可以和随意的在其任意一个位置进行插入和删除操作,这对于动态的数据处理十分的有利。
利用头插建立一个带头结点的单链表,并用算法实现该单链表的插入、删除查找、输出、求前驱和后继、再把此单链表逆置,然后在屏幕上显示每次操作的结果当所有操作完成后能撤销该单链表。
2.2实验的基本要求(软硬件)
用VC++6.0软件平台,操作系统:
WindowsXP硬件:
内存要求:
内存大小在256MB,其他配置一般就行。
2.3算法的设计思想
(1)定义一个创建链表的函数,通过该函数可以创建一个链表,并为下面的函数应用做好准备。
(2)定义输出链表的算法,通过对第一步已经定义好的创建链表函数的调用,在这一步通过调用输出链表的函数算法来实现对链表的输出操作。
(3)定义一个遍历查找的算法,通过此算法可以查找到链表中的每一个节点是否存在。
(4)定义查找链表的每一个前驱和后继,通过定义这个算法,可以很容易的实现对链表的前驱和后继的查找工作。
(5)定义插入节点的算法,通过定义这个算法,并结合这查找前驱和后继的算法便可以在连链表的任意位置进行插入一个新节点。
(6)定义删除节点的操作,这个算法用于对链表中某个多余节点的删除工作。
2.4相关图例
2.4.1单链表的结点结构
如图2-1所示,为单链表的结点结构示意图:
图2-1单链表的结点结构
2.4.2算法流程图
如图2-2所示,为此算法流程图:
图2-2算法流程图
3过程论述
3.1链表的建立
图3-1链表的建立
图3-2建立链表并打印链表中的元素
3.2取出链表中的元素
图3-3取出链表中的元素
3.3插入元素
图3-4插入元素
3.4删除元素
图3-5删除元素
图3-6删除元素后打印链表
3.5查找元素
图3-7查找位置为6的元素
4结果分析
4.1单链表的结构
一般情况下,使用链表,只关心链表中结点间的逻辑顺序,并不关心每个结点的实际存储位置,因此通常情况下用箭头来表示链域中的指针,于是链表就可以更直观的画成用箭头链接起来的结点序列,如下图所示:
H
图4-1单链表的示例图
4.2单链表
4.2.1顺链操作技术
从“头”开始,访问单链表L中的结点i(p指向该节点)时,由于第i个结点的地址在第i-1个结点(pre指向该结点,为p的前驱)的指针域中存放,查找必须从单链表的“首结点”开始(p=L);通过p=p->next并辅助计数器来实现。
4.2.2指针保留技术
通过对第i个结点进行插入、删除等操作时,需要对第i-1个结点的指针域进行链址操作(pre->next),因此在处理过程中始终需要维持当前指针p与其前驱指针pre的关系,将这种技术称为“指针保留技术”。
5结论与总结
通过这十几天的时间,最后终于完成了这次数据结构课程设计任务,内心激动的同时,也是十分的辛苦的,从选题、审题、查资料到开始构思,这个过程是最慢的,也是最难的。
通过这次的课程设计,我们对数据结构中单链表的应用有了更深的理解,并且使我们深刻的认识到实践的重要性,只有理论与实践相结合才能达到很好的学习效果,学到很多东西,同时也发现仅仅书本的知识是远远不够的,需要把知识运用到实践中去,能力才能得到提高。
由于刚开始对单链表的应用总体结构不熟悉,对书本知识的学习不够扎实,刚拿到题目的时候,还不好下手,就请教了一些学习成绩好一点的同学,并认真查找了一些资料,才对这次课程设计有了初步的了解。
根据对数据结构的了解,我们觉得我们对单链表的认识要深一点。
因此我们选择了单链表的实验,作为线性表的一种存储结构,它的特点是可以从分利用存储单元来存储数据,并且可以方便的实现对数据进行插入、删除、输出等操作。
在我们进行课程设计时,虽然在大体上算法是正确的,但时常会出现一些小问题,使我们不得不花一些时间来查找、修改错误。
通过这次课程设计,让我们充分认识到数据结构在编写程序方面的重要地位。
由于我们在课程设计中编写的是对单链表的基本操作,因此我们在这次课程设计中收获了很多关于单链表的应用方面的知识。
由于课程设计的题目还有很多,因此没有对其他的题目进行深入的了解而感到遗憾,因此我们希望在以后的学习过程中,能够多多的学习这方面没知识来弥补不足。
最后,通过本次数据结构课设,我学会了如何与别人共同探讨、解决问题;当发现问题时,能学会利用身边一切资料,包括图书、网上资料等等来解决问题,并最终完成任务。
参考文献
[1]耿国华.数据结构--用C语言描述[M].北京:
高等教育出版社,2011.6.
[2]谭浩强.C程序设计[M].北京:
清华大学出版社,2004.6.
附录代码:
#include
#include
typedefstructnode//定义node结点
{
intdata;
structnode*next;
}linklist;
voidsetnull(linklist*H)//清空单链表
{
H->next=NULL;
}
voidcreatlist(linklist*H)//创建单链表
{
linklist*p,*s;intx;
p=H;
printf("pleaseinputx:
");
scanf("%d",&x);
while(x!
=-1){
s=(linklist*)malloc(sizeof(linklist));
s->data=x;
s->next=p->next;
p->next=s;
p=p->next;
printf("pleaseinputx:
");
scanf("%d",&x);
}
p->next=NULL;
}
voidLeng(linklist*H)//求单链表长度
{
linklist*p;
intk;
p=H;k=0;
while(p->next!
=NULL){
p=p->next;
k++;
}
printf("Thelinklistis:
%d\n",k);
}
intGetElem(linklist*H,inti)//取单链表中的某个元素
{
linklist*p;
intk;
p=H;k=0;
while(p->next!
=NULL&&k
p=p->next;
k++;
}
if(k==i&&p!
=NULL)
printf("ipositiondatais%d\n",p->data);
else
printf("Nofind!
\n");
}
voidInsert(linklist*H,inti,intx)//向单链表中插入某个元素
{
linklist*p;intk;linklist*s;
p=H;k=0;
while(p->next!
=NULL&&k p=p->next;k++; } if(k==i-1&&p->next! =NULL){ s=(linklist*)malloc(sizeof(linklist)); s->data=x; s->next=p->next; p->next=s; } else printf("插入错误r\n"); } voidDelete(linklist*H,intx)//删除元素 { linklist*p,*q;intk; p=H;k=0; while(p->next! =NULL&&p->next->data! =x){ p=p->next; k++; } if(p->next->data==x){ q=p->next; p->next=q->next; free(q); } elseprintf("nofind! \n"); } voidprint(linklist*H)//输出单链表 { linklist*p;intk; p=H;k=0; if(p->next==NULL) printf("链表为空! "); while(p->next! =NULL){ k++; p=p->next; printf("%3d",p->data); } } intLocate(linklist*H,intx)//查找元素 { linklist*p;intk; p=H;k=0; while(p->next! =NULL&&p->data! =x){ p=p->next; k++; } if(p->data==x) printf("要查询元素的位置是%d\n",k); else printf("没有找到! \n"); } /* voiddestroylist(linklist*H)//销毁单链表 { H->next=NULL; H->data=NULL; } */ voidmain() { linklist*H;intk,x,i;intf; H=(linklist*)malloc(sizeof(linklist)); setnull(H); printf("\n请选择以下操作数,选择-1为结束"); printf("\n1: creatlinklist(H)"); printf("\n2: leng(H)"); printf("\n3: GetElem(H,i)"); printf("\n4: Insert(H,i,x)"); printf("\n5: Delete(H,x)"); printf("\n6: print(H)"); printf("\n7: Locate(H,x)\n"); scanf("%d",&f); while(f! =-1){ switch(f) { case1: creatlist(H);break; case2: Leng(H);break; case3: printf("\n请输入要得到元素的位置: "); scanf("%d",&i); GetElem(H,i);break; case4: printf("\n请输入的插入位置、长度以及元素: "); scanf("%d,%d",&i,&x); Insert(H,i,x);break; case5: printf("\n请输入要删除的位置及元素: "); scanf("%d",&x); Delete(H,x);break; case6: print(H);break; case7: printf("请输入要查找的元素: "); scanf("%d",&x); Locate(H,x);break; } printf("\n请选择以下操作数,选择-1为结束"); printf("\n1: creatlinklist(H)"); printf("\n2: leng(H)"); printf("\n3: GetElem(H,i)"); printf("\n4: Insert(H,i,x)"); printf("\n5: Delete(H,x)"); printf("\n6: print(H)"); printf("\n7: Locate(H,x)\n"); scanf("%d",&f); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 操作