双链表的建立插入删除算法的实现.docx
《双链表的建立插入删除算法的实现.docx》由会员分享,可在线阅读,更多相关《双链表的建立插入删除算法的实现.docx(21页珍藏版)》请在冰豆网上搜索。
双链表的建立插入删除算法的实现
摘 要
设计一个个人电话本,该电话本是基于双链表的具体功能实现,双链表的主要功能是查找、删除和插入。
其具体的实现过程:
依次是建立空指针、构成双向链表、增加结点并给每个结点赋值,最后再通过所建链表进行插入,删除,查找等程序,从而实现了链表问题求解.可以用一般的指针来实现,但是数据库中着重强调了结构体,本题用结构体指针更容易理解和实现和初始化。
关键字:
双链表;直接前驱;直接后继;节点;
目 录
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<calssType>classDblList:
publicList<newtype<Type>>,注意连续的两个">"之间要有空格。
或者根本不定义这样的结构,直接拿Node类型来做。
开发工具:
visualC++6.0
2 设计要求
本次设计是基于visualC++作为开发环境,采用双链表的插入删除查找等功能,来实现个人电话本的相应功能。
2.1问题定义和任务分析
通过题目要求本课题是用C/C++来实现双链表的插入删除查找的功能,具体应用于个人电话本,电话本中含有存储姓名和电话(电话号码使用整型,姓名使用字符型)。
双链表的节点中有两个指针域,其一指向直接后继,另一个指向直接前继。
和单链表的循环类似,双链表也可以有循环表。
在双向链表中,若d为指向表中某一结点的指针(即d为DuLinkList型变量),显然有
d->next->prior=d->prior->next=d
这个表示式恰当地反映了这种结构的特性。
2.2逻辑设计
此程序分为三大模块:
数据输入模块、数据删除模块、数据查找模块。
数据输入模块完成数据的输入和存储,数据删除模块主要完成个人对没用的数据进行删除,数据查找模块方便个人查找存储在里边的数据,函数调用流程图如下:
开始
初始化链表,调用inlist函数输入数据
调用input函数
调用deletes函数
调用search函数
输出
进入whlie
(1)
结束
图2—1
抽象数据类型定义如下:
ADTlnode{
数据对象:
{D={a|aElemSet,i=1,2,…,n,n0}
数据关系:
R1={|a,aD,i=2,…,n}
基本操作:
voidinlist(lnode*p)
操作结果:
构造一个链表。
voidinputs(lnode*q)
初始条件:
链表lnode已存在。
操作结果:
向链表中输入数据。
voidsearch(lnode*q)
初始条件:
链表lnode已存在。
操作结果:
查找链表中的数据。
voiddeletes(lnode*q)
初始条件:
链表lnode已存在。
操作结果:
删除链表中的数据。
}ADTlnode
2.3.详细设计
1.定义存储结构
typedefstructlnodeent
{
intdate;
structlnodeent*next,*prior;///表示循环双链表
}lnode;
1.主函数模块
Voidmain()
{
voidinlist(lnode*p) /*初始化链表*/
{
lnode*nw;
nw=(lnode*)malloc(sizeof(lnode));
p->next=nw;
p=nw;
p->next=head;
if(p->next!
=NULL)
p->next->prior=p;
}
p=head->next;
while(p!
=head)
{
p=p->next;
}
}
Do{
}
}
2)插入函数模块----实现数据的插入指针操作的顺序不是唯一的,但也不是任意
voidinputs(lnode*q) /*插入函数*/
{
news=(lnode*)malloc(sizeof(lnode));
news->next=news->prior=NULL;
news->date=b;
strcpy(news->name,k);
for(inti=0;i q=q->next;
news->next=q->next;
news->prior=q;
if(q->next!
=NULL)
news->next->prior=news;
q->next=news;
}
q=head->next;
while(q!
=head)
{
q=q->next;
}
3)删除函数模块----实现数据的删除
voiddeletes(lnode*q) /*删除函数*/
{
q=head;
lnode*d;
{
for(intj=0;j {
q=q->next;
j++;
}
d=q->next;
q->next=d->next;
if(q->next!
=NULL) ///
q->next->prior=q;
free(d);
}
q=head->next;
while(q!
=head)
{
q=q->next;
}
}
4)查找函数模块----实现数据的查找
voidsearchs(lnode*q) //查找函数
{
q=head;
while(q->next!
=head)
{
q=q->next;
i++;
if(q->date==h)
{
break;
}
}
}
2.4程序流程图
开始
初始化链表
向电话本中输入数据
输入(1-4)中的数值,选择相应的判断
调用main()菜单函数
输入是否为4
结束
调用input函数
调用deletes函数
调用
Search函数
While
(1)循环
输出
图2—2
2.5.程序编码
#include
#include
#include
#include
#defineexit0
typedefstructlnode
{
intdate;
charname[20];
structlnodeent*next,*prior; //表示循环双链表
}lnode;
lnode*head;
lnode*creat() //创建头结点
{
lnode*sq;
sq=(lnode*)malloc(sizeof(lnode));
sq->next=sq;
sq->prior=sq;
returnsq;
}
voidinlist(lnode*p) /*初始化链表*/
{
lnode*nw; //初始化链表长度
intw;
cout<<" 输入电话号码本容量:
";
cin>>w;
for(inti=0;i {
nw=(lnode*)malloc(sizeof(lnode));
p->next=nw;
p=nw;
cout<<"输入电话:
";
cin>>p->date;
cout<<"输入姓名:
";
cin>>p->name;
p->next=head;
if(p->next!
=NULL)
p->next->prior=p;
}
p=head->next;
cout<<" 电话号码本为:
"< while(p!
=head)
{
cout<<"电话号码:
"<date< cout<<"姓名:
"<name< p=p->next;
}
cout<}
voidinputs(lnode*q) /*插入函数*/
{
intm,b;
chark[20];
lnode*news;
q=head;
cout<<"输入要插入的位置:
";
cin>>m;
{
cout<<"输入要插入的电话:
";
cin>>b;
cout<<"姓名:
";
cin>>k;
news=(lnode*)malloc(sizeof(lnode));
news->next=news->prior=NULL;
news->date=b;
strcpy(news->name,k);
for(inti=0;i q=q->next;
news->next=q->next;
news->prior=q;
if(q->next!
=NULL)
news->next->prior=news;
q->next=news;
}
q=head->next;
cout<<"插入后为:
"; /*删除后输出*/
while(q!
=head)
{
cout<<"电话号码:
"<date<cout<<"姓名:
"<name< q=q->next;
}
cout<}
voidsearchs(lnode*q) //查找函数
{
q=head;
inth;
cout<<"输入查找的电话:
";
cin>>h; //h为查找的值
inti=0;
while(q->next!
=head)
{
q=q->next;
i++;
if(q->date==h)
{
cout<<"查找成功!
位置为:
"<
cout<<"电话号码:
"<date< cout<<"姓名"<name< break;
}
}
}
voiddeletes(lnode*q) /*删除函数*/
{
q=head;
lnode*d; //要删除的结点
intk; //要删除的位置
cout<<"输入删除的位置:
";
cin>>k;
{
for(intj=0;j {
q=q->next;
j++;
}
d=q->next;
q->next=d->next;
if(q->next!
=NULL) ///
q->next->prior=q;
free(d);
}
q=head->next;
cout<<"删除后为:
"< while(q!
=head)
{
cout<<"电话号码:
"<date< cout<<"姓名:
"<name< q=q->next;
}
cout<}
voidmain()
{
intl;
lnode*p;
head=creat();
p=head;
cout<<" 初始化链表!
"< inlist(p); //初始化链表
do
{
cout<<"*输入1选择插入 *输入2选择删除 *输入3选择查询 *输入4退出"< cout<<"输入:
";
cin>>l;
switch(l)
{
case1:
inputs(p);
break;
case2:
deletes(p);
break;
case3:
searchs(p);
break;
case4:
exit;
}
}while
(1);
}
2.6程序的调试与测试
1.调试分析过程的主要依据
(1)结构体后面的分号不能少;
(2)变量要先定义后使用;
(3)输出函数的位置要写正确,否则得不到预期的结果;
(4)插入元素时,不能使指针往复查找,要给出结束的条件;
2.测试
程序经过改正无误后,按F5执行程序。
出现如下界面:
图2—3
由上面的界面可以看出,当输入电话本容量为3时,你只能输入三组数据,输入少了程序也不向下运行。
图2—4
总结
在这次课程设计中也知道了自己的动手能力不强有待进一部的提高!
在设计过程中不能够把书本上的知识与实践相结合,这也就增加了设计不好该程序的想法!
在设计过程中的一次次设计错误增加了我放弃的想法!
不过经过大家的努力终于完成了课程设计!
完成该程序后想起自己以前的每一次对自己失去信心,就觉得并不是在知识掌握上打败了,而是自己对自己缺乏信心!
只要自己对自己不失去信心相信就可以完成那些以前认为完成不了的事情!
也让我懂得了要想成功首先就必须有很强的自信心!
懂得了自己以后要在做任何事情时都要自信!
当自己都不相信自己能够成功时还可能会获得成功吗?
在C语言程序设计的过程中也知道了自己在以前的学习中有很大的不足导致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!
都是要更好的掌握该门知识,提高自己的自身的修养,提高自己的能力!
为以后的工作打下良好的知识基础和技能基础!
通过本项课程设计也培养了我独立思考、综合运用所学有关相应知识的能力,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!
由于C语言是近年在国内外得到迅速推广应用的一种语言。
C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
通过这次的c语言程序设计更加了解了c语言的好处和其可用
参考文献
[1]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2002
[2]李春葆.数据结构(C语言版)习题与解析[M].北京:
清华大学出版社,2002
[3]钱能.C++程序设计教程[M].北京:
清华大学出版社,2003