自数据结构课程设计双向链表.docx

上传人:b****7 文档编号:10103346 上传时间:2023-02-08 格式:DOCX 页数:14 大小:48.91KB
下载 相关 举报
自数据结构课程设计双向链表.docx_第1页
第1页 / 共14页
自数据结构课程设计双向链表.docx_第2页
第2页 / 共14页
自数据结构课程设计双向链表.docx_第3页
第3页 / 共14页
自数据结构课程设计双向链表.docx_第4页
第4页 / 共14页
自数据结构课程设计双向链表.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

自数据结构课程设计双向链表.docx

《自数据结构课程设计双向链表.docx》由会员分享,可在线阅读,更多相关《自数据结构课程设计双向链表.docx(14页珍藏版)》请在冰豆网上搜索。

自数据结构课程设计双向链表.docx

自数据结构课程设计双向链表

 

《数据结构》课程设计

实验报告 

 

题目 双向链表     

学 院      

专 业 计算机科学与技术  

班级     

学号        

学生姓名         

指导教师         

编写日期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.总结:

   通过此次数据结构的课程设计,我对程序的编程,编译,执行等有了更深的认识。

理解到思路对于一个程序的重要性,在整个设计过程中,遇到了很多不同的问题,但通过尝试,努力和老师的帮助最终都解决了,感到很有成就感。

从中,我意识到程序的成功不仅仅是消除语法上的错误,而且还要执行成功。

缺乏完整的思路,尽管语法正确,程序还是无法执行。

数据结构的设计考验的不仅仅是我们对书本知识的理解,还考验了我们分析事物时思维的逻辑紧密性,加深并巩固了我对数据结构的认识。

总的来说,这次的数据结构课程设计加深了我对数据结构的认识,也学到了相关的知识,并且巩固了课堂上所学的知识,还锻炼了实践的应用操作能力,感受颇深,也收获了成功的喜悦。

  

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1