自数据结构课程设计双向链表.docx
《自数据结构课程设计双向链表.docx》由会员分享,可在线阅读,更多相关《自数据结构课程设计双向链表.docx(14页珍藏版)》请在冰豆网上搜索。
![自数据结构课程设计双向链表.docx](https://file1.bdocx.com/fileroot1/2023-2/8/16f2e6f9-7ffc-4bfc-bf7b-99f03e2161e1/16f2e6f9-7ffc-4bfc-bf7b-99f03e2161e11.gif)
自数据结构课程设计双向链表
《数据结构》课程设计
实验报告
题目 双向链表
学 院
专 业 计算机科学与技术
班级
学号
学生姓名
指导教师
编写日期2010-7-16
1.问题分析……………………………………………….3
1.1基本要求…………………………………………………..3
1.2分析过程…………………………………………………..3
2.数据结构描述………………………………………….3
3.算法设计……………………………………………….4
3.1算法1:
双向链表的建立………………………………..4
3.2算法2:
双向链表的查找…………………………………4
3.3算法3:
双向链表的插入………………………………..5
3.4算法4:
双向链表的删除………………………………..5
4.程序清单………………………………………………6
5.程序运行结果…………………………………………10
6.总结……………………………………………………11
●1.问题分析
1.1【基本要求】:
建立双向链表,并进行插入,查找,删除等操作。
1.2【分析过程】:
先通过创建函数建立双向链表,由文本文件提供数据。
可以调用查找函数,查找与e值相同的结点是否存在;也可以通过插入函数,在第i个结点前插入值为e的结点,并且调节指针的变化;也可以调用删除函数,删除第i个结点,调节好指针,最后通过保存函数保留数据到文本文件中。
●2.数据结构描述
#include
#include
usingnamespace std;
typedefstructdulnode{
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->next; /*p指向第一个结点*/
intj=1; /*j表示结点位置*/
while(p&&(j<i)){
p=p->next;
++j;
} /*寻找第i个结点 */
if(!
p||j>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#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",&n);
for(i=0;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); /*关闭文本文件 */
}
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->next;
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
p=p->next;
++j;
} /*寻找第i个结点 */
if(!
p||j>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->data!
=e)&&p){
p=p->next;
++j;
}/*寻找第一个值为e的结点位置*/
if(!
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->data);
l =l->next;
ﻩ}
}
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("%d",&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("%d",&i); /*输入要插入的位置*/
printf("pleaseinputthedatayouwant toinsert:
\n");
scanf("%d",&e);/* 输入新结点的数据 */
listinsert_dul(l,i,e); ﻩ/*调用双向链表的插入函数*/
print_dul(l);break; /* 调用双向链表的打印函数*/
case 3:
printf("\n pleaseinputthepositionyouwantto delete:
\n");
scanf("%d",&i); /*输入要删除结点的位置 */
listdelete_dul(l,i,e);/* 调用双向链表的删除函数 */
print_dul(l);break; /* 调用双向链表的打印函数*/
ﻩ
case4:
ﻩﻩ save_dul(l);
ﻩ exit(0);
ﻩ}ﻩﻩ
}
}
●5.程序运行结果
●6.总结:
通过此次数据结构的课程设计,我对程序的编程,编译,执行等有了更深的认识。
理解到思路对于一个程序的重要性,在整个设计过程中,遇到了很多不同的问题,但通过尝试,努力和老师的帮助最终都解决了,感到很有成就感。
从中,我意识到程序的成功不仅仅是消除语法上的错误,而且还要执行成功。
缺乏完整的思路,尽管语法正确,程序还是无法执行。
数据结构的设计考验的不仅仅是我们对书本知识的理解,还考验了我们分析事物时思维的逻辑紧密性,加深并巩固了我对数据结构的认识。
总的来说,这次的数据结构课程设计加深了我对数据结构的认识,也学到了相关的知识,并且巩固了课堂上所学的知识,还锻炼了实践的应用操作能力,感受颇深,也收获了成功的喜悦。