数据结构课程设计之双向链表操作Word文件下载.docx
- 文档编号:18427718
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:13
- 大小:97.97KB
数据结构课程设计之双向链表操作Word文件下载.docx
《数据结构课程设计之双向链表操作Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之双向链表操作Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
也可以通过插入函数,在第i个结点前插入值为e的结点,并且调节指针的变化;
也可以调用删除函数,删除第i个结点,调节好指针,最后通过保存函数保留数据到文本文件中。
●2.数据结构描述
#include<
iostream>
stdio.h>
usingnamespacestd;
typedefstructdulnode{
intdata;
structdulnode*prior;
structdulnode*next;
}dulnode,*dulinklist;
●3.算法设计
创建双向链表
statuscreate_dul(dulinklist&
l)/*利用尾插法建立头带头结点的双向链表*/
{
l=(dulinklist)malloc(sizeof(dulnode));
/*生成头结点*/
l->
prior=NULL;
next=NULL;
/*头结点的指针域初始值为空*/
data=-1;
q=l;
/*尾指针初始指向头结点*/
FILE*fp;
/*定义文件指针的形式*/
if((fp=fopen("
F:
\\test1.txt"
"
r+"
))==NULL);
/*打开文本文件*/
{
printf("
cannotopenfile!
\n"
);
exit(0);
}
intn;
fscanf(fp,"
%d"
&
n);
for(i=0;
i<
n;
i++);
p=(dulinklist)malloc(sizeof(dulnode));
fscanf(fp,"
p->
data);
/*在文件读取结点的数据*/
p->
/*新结点指针域为空*/
prior=q;
q->
next=p;
/*尾结点指针域指向新结点*/
q=p;
/*q指针后移,始终指向尾指针*/
fclose(fp);
/*关闭文本文件*/
双向链表的查找
staduslocateelem_dul(dulinklistl,elemtypee);
/*查找双线链表中第一个值为e的结点位置*/
{
p=l->
next;
/*p指向第一个结点*/
j=1;
/*j表示结点位置*/
while((p->
data!
=e)&
&
p){
p=p->
++j;
}/*寻找第一个值为e的结点位置*/
if(!
p)return-1;
elsereturn1;
}
双向链表的插入
statuslistinsert_dul(dulinklist&
l,inti,elemtypee)/*在双向链表l中的第i个位置之前插入新结点s*/
p=l;
/*p指向头结点*/
j=0;
while(p&
(j<
i-1)){
}/*寻找第i-1个结点位置*/
p||j>
i-1)returnERROR;
/*在l中确定插入位置,p=NULL或j>
i-1时,即插入位置不合法*/
(s=(dulinklist)malloc(sizeof(dulnode))))returnERROR;
/*动态生成新结点失败,则返回错误*/
s->
data=e;
/*给新结点的数据域赋值*/
next=p->
next->
prior=s;
prior=p;
next=s;
/*在双向链表中插入新结点时指针的变化*/
return0;
双向链表的删除
statuslistdelete_dul(dulinklist&
l,inti,elemtype&
e);
/*在双向链表l中,删除第i个结点*/
intj=1;
while(p&
i))
}/*寻找第i个结点*/
i)returnERROR;
/*在l中确定第i个元素的位置指针p,p=NULL,即第i个元素不存在*/
e=p->
data;
/*把指针p的数据域的值赋给e*/
prior->
prior=p->
prior;
/*在双向链表中删除结点时指针的变化*/
free(p);
/*把结点p删掉*/
●4.程序具体步骤
#include"
stdio.h"
stdlib.h"
typedefintelemtype;
typedefstructlnode//定义结点类型
elemtypedata;
structlnode*next;
structlnode*prior;
}lnode,*linklist;
intinitlist(linklist&
L)//初始化单链表
L=(linklist)malloc(sizeof(lnode));
//表头附加结点
L)exit(-2);
L->
next=L;
prior=L;
return1;
}//初始化了一个空表
voidcreatelist(linklist&
L)//尾插法生成双向循环链表
intx;
linklistq=L;
请输入要插入元素的值(输入0结束):
scanf("
x);
while(x){
linklistp=(linklist)malloc(sizeof(lnode));
p->
data=x;
q->
L->
q=p;
scanf("
}
voidshuchulist(linklist&
L)//遍历有头结点的双向循环链表
linklistp=L->
while(p->
next!
=L){
printf("
%4d"
p->
p=p->
intlengthlist(linklistL){//通过链表的遍历来统计长度
intcount=0;
while(p!
count++;
returncount;
intlistdelete_i(linklist&
L,inti){//删除带头结点的双向循环链表中第i个元素
linklistp=L;
intj=0;
if(i>
lengthlist(L)){
return0;
while(j<
i){//寻找第i个结点,并令p指向此结点
//删除结点p
//释放结点p
intlistdelete_x(linklist&
L,elemtypex){//删除值为x的元素
next,q;
inti=0;
if(p->
data==x){
q=p->
p->
free(p);
p=q;
++i;
}
else
p=p->
returni;
voidpaixu(linklistL){//将链表排成非递减链表
intt;
linklistp;
for(inti=1;
lengthlist(L);
i++){
p=L->
for(intj=0;
j<
lengthlist(L)-i;
j++){
if(p->
data>
data){
t=p->
p->
data=p->
data=t;
}
voidlinklistinsert(linklist&
L,elemtypee){//在非递减有序双向循环链表中实现插入元素e仍有序
linklistq=(linklist)malloc(sizeof(lnode));
if(L->
data<
e){//把元素e插到最后
next=q;
prior=L->
}else{
while(p->
e){//找到第一个大于或等于e的元素
//把e插到第一个大于或等于它的元素之前
intpanduan(linklistL){//判断双向循环链表中元素是否对称
next,q=L->
if(lengthlist(L)%2){
data==q->
data&
p!
=q){
q=q->
if(q==p)
return1;
return0;
data)
voidjioushu(linklistL){//把链表中奇数放到偶数之前
next,q,s;
s=L->
=s){
data%2)
else{
next->
//把p从链表中取出
L->
voidmain()
linklistLa;
intmenu,flag,i,x,c;
do{
制作人:
陶鹏鹏\n"
学号:
201140130241\n"
专业:
计算机信息管理\n"
指导老师:
吴志强\n"
1.利用尾插法建立双向循环链表链表\n"
2.遍历双向循环链表\n"
3.双向循环链表中删除一个指定元素\n"
4.在非递减有序双向循环链表中实现插入元素e仍有序\n"
5.判断双向循环链表中元素是否对称若对称返回1否则返回0\n"
6.设元素为正整型,实现算法把所有奇数排列在偶数之前\n"
0.退出\n"
\n请输入所选菜单(0-6):
"
menu);
switch(menu){
case1:
initlist(La);
createlist(La);
break;
case2:
链表中的元素为:
shuchulist(La);
case3:
请选择删除方式:
1删除值为x的结点2删除第i个结点"
scanf("
c);
if(c==1){
printf("
请输入要删除元素的值:
scanf("
flag=listdelete_x(La,x);
if(flag){
printf("
删除成功!
删除后的链表为:
shuchulist(La);
}else
删除失败!
}elseif(c==2){
请输入要删除的位置:
i);
flag=listdelete_i(La,i);
break;
case4:
把原始链表初始化为非递减有序列表为:
paixu(La);
shuchulist(La);
printf("
请输入要插入的元素的值:
linklistinsert(La,x);
插入后的链表为:
case5:
flag=panduan(La);
if(flag)
链表对称!
else
链表不对称!
case6:
排列之前为:
jioushu(La);
排列之后为:
break;
case0:
}while(menu);
●5.程序运行结果
●6.总结:
通过此次数据结构的课程设计,我对程序的编程,编译,执行等有了更深的认识。
理解到思路对于一个程序的重要性,在整个设计过程中,遇到了很多不同的问题,但通过尝试,努力和老师的帮助最终都解决了,感到很有成就感。
从中,我意识到程序的成功不仅仅是消除语法上的错误,而且还要执行成功。
缺乏完整的思路,尽管语法正确,程序还是无法执行。
数据结构的设计考验的不仅仅是我们对书本知识的理解,还考验了我们分析事物时思维的逻辑紧密性,加深并巩固了我对数据结构的认识。
总的来说,这次的数据结构课程设计加深了我对数据结构的认识,也学到了相关的知识,并且巩固了课堂上所学的知识,还锻炼了实践的应用操作能力,感受颇深,也收获了成功的喜悦。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 双向 操作