自数据结构课程设计双向链表Word文件下载.docx
《自数据结构课程设计双向链表Word文件下载.docx》由会员分享,可在线阅读,更多相关《自数据结构课程设计双向链表Word文件下载.docx(14页珍藏版)》请在冰点文库上搜索。
![自数据结构课程设计双向链表Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/b1d1c851-5dda-4a7b-a439-8605dba73d5d/b1d1c851-5dda-4a7b-a439-8605dba73d5d1.gif)
intdata;
struct dulnode*prior;
structdulnode *next;
}dulnode,*dulinklist;
●3.算法设计
3.1算法1:
创建双向链表
statuscreate_dul(dulinklist&l) /*利用尾插法建立头带头结点的双向链表 */
{
l=(dulinklist)malloc(sizeof(dulnode));
/*生成头结点 */
l->
prior=NULL;
l->
next=NULL;
/* 头结点的指针域初始值为空*/
l->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,"
%d",&
p->
data);
/*在文件读取结点的数据*/
p->
next=NULL;
/*新结点指针域为空*/
p->
prior=q;
q->
next=p;
/*尾结点指针域指向新结点 */
q=p;
/*q指针后移,始终指向尾指针 */
fclose(fp);
/*关闭文本文件*/
}
3.2算法2:
双向链表的查找
staduslocateelem_dul(dulinklistl,elemtype e) /* 查找双线链表中第一个值为e的结点位置*/
{
p=l->
next;
/* p指向第一个结点 */
j=1;
/*j表示结点位置*/
while((p->
data!
=e)&&
p){
p=p->
next;
++j;
} /*寻找第一个值为e的结点位置 */
if(!
p) return-1;
else return1;
3.3算法3:
双向链表的插入
status listinsert_dul(dulinklist&
l,int i,elemtypee) /*在双向链表l中的第i个位置之前插入新结点s*/
p=l;
/*p指向头结点 */
j=0;
/* j表示结点位置*/
while(p&
&
(j<
i-1)){
p=p->
next;
++j;
} /*寻找第i-1个结点位置*/
if(!
p||j>
i-1) return ERROR;
/*在l中确定插入位置,p=NULL或j>
i-1时,即插入位置不合法 */
if(!
(s=(dulinklist)malloc(sizeof(dulnode)))) returnERROR;
/*动态生成新结点失败,则返回错误 */
s->data=e;
/*给新结点的数据域赋值*/
s->next=p->
next;
p->
next->
prior=s;
s->
prior=p;
p->
next=s;
/*在双向链表中插入新结点时指针的变化*/
return0;
3.4算法4:
双向链表的删除
statuslistdelete_dul(dulinklist &
l,inti,elemtype &
e) /* 在双向链表l中,删除第i个结点*/
p=l->
/*p指向第一个结点*/
intj=1;
/*j表示结点位置*/
while(p&
i)){
p=p->
next;
++j;
} /*寻找第i个结点 */
if(!
i)returnERROR;
/*在l中确定第i个元素的位置指针p,p=NULL,即第i个元素不存在*/
e=p->
data;
/*把指针p的数据域的值赋给e*/
p->
prior->
next=p->next;
p->
next->prior=p->
prior;
/*在双向链表中删除结点时指针的变化*/
free(p);
/*把结点p删掉 */
return 0;
●4.程序清单
#include<
iostream>
#include<
stdio.h>
usingnamespacestd;
typedefstructdulnode{
intdata;
/*数据域*/
structdulnode*prior;
/*指向前驱的指针域 */
structdulnode*next;
/* 指向后继的指针域*/
}dulnode,*dulinklist;
voidcreate_dul(dulinklist&
l)/*利用尾插法建立头带头结点的双向链表*/
dulinklistp,q;
inti;
l=(dulinklist)malloc(sizeof(dulnode));
/* 生成头结点 */
l->
prior=NULL;
l->
next=NULL;
/*头结点的指针域初始值为空*/
l->
data=-1;
q=l;
/*尾指针初始指向头结点 */
FILE* fp;
/*定义文件指针的形式*/
if((fp=fopen("
H:
\\test1.txt"
,"
r+"))==NULL)/*打开文本文件*/
{
printf("
cannotopen file!
\n"
);
exit(0);
}
int n;
ﻩfscanf(fp,"%d"
for(i=0;
n;
ﻩ p=(dulinklist)malloc(sizeof(dulnode));
ﻩ fscanf(fp,"
%d",&p->
data);
/*在文件读取结点的数据*/
ﻩp->
next=NULL;
/*新结点指针域为空*/
p->
prior=q;
q->
next=p;
/*尾结点指针域指向新结点*/
q=p;
/*q指针后移,始终指向尾指针 */
fclose(fp);
/*关闭文本文件 */
dulinklistlistinsert_dul(dulinklist&l,int i,inte) /*在双向链表l中的第i个位置之前插入新结点s */
dulinklistp,s;
p=l;
/*p指向头结点*/
intj=0;
/*j表示结点位置*/
while(p&
&(j<
i-1)){
p=p->next;
++j;
} /*寻找第i-1个结点位置*/
if(!
p||j>
i-1)return NULL;
/*在l中确定插入位置,p=NULL或j>
i-1时,即插入位置不合法*/
if(!
(s=(dulinklist)malloc(sizeof(dulnode))))returnNULL;
/*动态生成新结点失败,则返回错误 */
s->
data=e;
/*给新结点的数据域赋值*/
s->
next=p->
p->next->prior=s;
s->prior=p;
p->next=s;
/*在双向链表中插入新结点时指针的变化 */
return0;
dulinklistlistdelete_dul(dulinklist &
l,inti,int&e) /*在双向链表l中,删除第i个结点*/
dulinklist p;
p=l->
next;
/* p指向第一个结点 */
intj=1;
/*j表示结点位置 */
while(p&&(j<
i)){
p=p->next;
++j;
} /*寻找第i个结点 */
if(!
i)return NULL;
/*在l中确定第i个元素的位置指针p,p=NULL,即第i个元素不存在*/
e=p->
data;
/*把指针p的数据域的值赋给e*/
p->
prior->next=p->next;
p->
next->
prior=p->
prior;
/*在双向链表中删除结点时指针的变化 */
free(p);
/*把结点p删掉*/
return 0;
intlocateelem_dul(dulinklistl,inte) /*查找双线链表中第一个值为e的结点位置*/
{
dulinklistp;
intj;
ﻩ
p=l->
next;
/*p指向第一个结点*/
j=1;
/* j表示结点位置*/
while((p->
=e)&&
p){
p=p->
}/*寻找第一个值为e的结点位置*/
p)
return -1;
/*返回第一个值为e的结点位置*/
else
return1;
void print_dul(dulinklistl) /*打印双向链表l */
dulinklistp;
p=l;
/*p指向头结点*/
while(p){
printf("
%d"
p->
data);
p=p->
next;
} /*把双向链表中的数据都打印出来*/
}
voidsave_dul(dulinklistl)
FILE*fp;
if((fp=fopen("
H:
\\test2.txt","
w+"))==NULL)
printf("cannot openfile!
\n"
exit(0);
while(l)
ﻩ{
ﻩfprintf(fp,"
%d",l->
l =l->
ﻩ}
voidmain(){
dulinklistl;
inti,e,x;
intpos;
create_dul(l);
/*调用双向链表建立函数*/
print_dul(l);
/*调用双向链表的打印函数*/
while
(1){
ﻩprintf("inputxtochoose (1.查找,2.插入,3.删除,4.0ver):
\n"
scanf("%d"
&x);
ﻩ switch(x){
case1:
ﻩprintf("\npleaseinputthedatayouwanttolocate:
\n"
scanf("
e);
/*输入要查找的值*/
ﻩ pos=locateelem_dul(l,e);
/*调用双向链表的查找函数*/
ﻩ if(pos==-1)printf("The dataisnotfound!
\n"
ﻩﻩelse printf("
Thedataisfound!
\n"
break;
ﻩﻩ
case2:
printf("pleaseinputthe position youwanttoinsert:
\n");
scanf("
i);
/*输入要插入的位置*/
printf("
pleaseinputthedatayouwant toinsert:
scanf("
%d"
,&
e);
/* 输入新结点的数据 */
listinsert_dul(l,i,e);
ﻩ/*调用双向链表的插入函数*/
print_dul(l);
break;
/* 调用双向链表的打印函数*/
case 3:
printf("
\n pleaseinputthepositionyouwantto delete:
scanf("
i);
/*输入要删除结点的位置 */
listdelete_dul(l,i,e);
/* 调用双向链表的删除函数 */
print_dul(l);
break;
/* 调用双向链表的打印函数*/
case4:
ﻩﻩ save_dul(l);
ﻩ exit(0);
ﻩ}ﻩﻩ
}
●5.程序运行结果
●6.总结:
通过此次数据结构的课程设计,我对程序的编程,编译,执行等有了更深的认识。
理解到思路对于一个程序的重要性,在整个设计过程中,遇到了很多不同的问题,但通过尝试,努力和老师的帮助最终都解决了,感到很有成就感。
从中,我意识到程序的成功不仅仅是消除语法上的错误,而且还要执行成功。
缺乏完整的思路,尽管语法正确,程序还是无法执行。
数据结构的设计考验的不仅仅是我们对书本知识的理解,还考验了我们分析事物时思维的逻辑紧密性,加深并巩固了我对数据结构的认识。
总的来说,这次的数据结构课程设计加深了我对数据结构的认识,也学到了相关的知识,并且巩固了课堂上所学的知识,还锻炼了实践的应用操作能力,感受颇深,也收获了成功的喜悦。