实验二单链表的操作.docx

上传人:b****6 文档编号:7000417 上传时间:2023-01-16 格式:DOCX 页数:22 大小:54.25KB
下载 相关 举报
实验二单链表的操作.docx_第1页
第1页 / 共22页
实验二单链表的操作.docx_第2页
第2页 / 共22页
实验二单链表的操作.docx_第3页
第3页 / 共22页
实验二单链表的操作.docx_第4页
第4页 / 共22页
实验二单链表的操作.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

实验二单链表的操作.docx

《实验二单链表的操作.docx》由会员分享,可在线阅读,更多相关《实验二单链表的操作.docx(22页珍藏版)》请在冰豆网上搜索。

实验二单链表的操作.docx

实验二单链表的操作

2014秋学期算法与数据结构

 

项目名称:

单链表的操作

指导老师:

金萍老师

项目时间:

2014-9-15

项目成员:

张峻峰瞿子晶

 

目录

一.引言4

1.1编写目的4

1、熟练掌握单链表的存储结构4

2、熟练掌握单链表基本操作的实现4

1.2参考资料4

二.项目介绍4

2.1项目简介4

2.2软件运行环境4

三.需求分析4

3.1总体需求分析4

3.2主界面需求分析4

四.总体模块设计4

1.操作菜单5

2.选择5

3.单链表的创建5

4.销毁5

5.判断表空5

6.测量表长5

7.插入5

8.删除5

9.查询元素5

10.清空单链表5

11.取单链表中指定位置上的元素5

12.输出单链表5

五.详细设计5

1.主函数5

2.菜单函数6

3.单链表操作菜单6

4.创建单链表函数6

5.销毁线性表函数6

6.判断表空函数6

7.测量表长6

8.插入函数6

9.删除7

10.查询元素函数7

11.清空单链表7

12.取单链表中指定位置上的元素7

13.输出单链表7

六.心得体会7

七.附录(代码)8

单链表的操作

一.引言

1.1编写目的

1、熟练掌握单链表的存储结构。

2、熟练掌握单链表基本操作的实现。

1.2参考资料

《数据结构(C语言版)》;

二.项目介绍

2.1项目简介

线性表(linearlist)是最常用且最简单的一种数据结构。

简言之,一个线性表是n个数据元素的有限序列。

至于每个数据元素的具体含义,在不同情况下各不相同,它可以是一个数或一个符号,也可以是一页书,甚至其他更复杂的信息。

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。

开发工具

MicrosoftVisualC++6.0

2.2软件运行环境

※处理器无要求,32MB以上内存,硬盘1GB以上

※Microsoft(R)Windows(R)系列所有操作系统

三.需求分析

3.1总体需求分析

1.单链表的创建

2.销毁

3.判断表空

4.测量表长

5.插入

6.删除

7.查询元素

8.清空单链表

9.取单链表中指定位置上的元素

10.输出单链表。

3.2主界面需求分析

设计菜单界面显示所有操作。

 

四.总体模块设计

 

 

1.操作菜单:

输出选择界面菜单

2.选择:

输入数字选择对应操作功能

3.单链表的创建:

建立一个新的单链表

4.销毁:

将单链表销毁

5.5.判断表空:

判断单链表是否为空

6.测量表长:

测量单链表元素的个数

7.插入:

在单链表指定位置上插入数据元素

8.删除:

删除指定位置上的数据元素

9.查询元素:

查询单链表中指定位置上的元素

10.清空单链表:

清空单链表中所有的元素

11.取单链表中指定位置上的元素:

取单链表中指定位置上的元素,并存入e中

12.12.输出单链表:

输出所有单链表中的元素

 

五.详细设计

1.主函数

功能说明

主函数

原型

voidmain()

输入

按键输入

输出

返回值

2.菜单函数

功能说明

主函数

原型

voidMenu()

输入

按键输入

输出

返回值

3.单链表操作菜单

功能说明

创建单链表

原型

voidSelect(LNode*L)

输入

输入0-9数字

输出

返回值

4.创建单链表函数

功能说明

创建单链表

原型

StatusCreateList_L(LNode*L,intn)

输入

输出

返回值

单链表首地址

5.销毁线性表函数

功能说明

销毁单链表

原型

StatusDestroyList_L(LNode*L)

输入

输出

返回值

单链表首地址

6.判断表空函数

功能说明

判断表空函数

原型

StatusListEmpty_L(LNode*L)

输入

输出

返回值

若L为空表,则返回TRUE,否则返回FALSE

 

7.测量表长

功能说明

测量表长

原型

StatusListLength_L(LNode*L)

输入

输出

输出L中数据元素个数

返回值

返回L中数据元素个数

8.插入函数

功能说明

插入函数

原型

StatusListInsert_L(LNode*L,inti,ElemTypee)

输入

输入元素位置i

输出

输出数据元素的值

返回值

单链表首地址

9.删除

功能说明

删除

原型

StatusListDelete_L(LNode*L,inti,ElemType*e)

输入

删除元素的位置i

输出

输出删除数据元素的值e

返回值

返回删除的元素值e

10.查询元素函数

功能说明

查询元素函数

原型

StatusQueryList_L(LNode*L,inti)

输入

输入查询数据元素值e

输出

元素e值

返回值

单链表首地址

11.清空单链表

功能说明

清空单链表

原型

StatusClearList_L(LNode*L)

输入

输出

返回值

单链表首地址

12.取单链表中指定位置上的元素

功能说明

取单链表中指定位置上的元素

原型

StatusGetElem_L(LNode*L,inti,ElemType*e)

输入

输入指定的位置i

输出

输出第i个数据元素的值e

返回值

用e返回L中第i个数据元素的值

 

13.输出单链表

功能说明

输出单链表

原型

StatusListTraverse_L(LNode*L

输入

输出

输出单链表的所有数据元素

返回值

 

六.心得体会

1.这次单链表操作的操作实验是以项目形式,小组成员共同完成的。

通过这次实验让我们意识到一个项目必须是一个小组成员共同完成,小组成员的分工明确是完成一个项目的前提,只有明确了分工,我们才能做好相应的模块,最后才能整合到一起。

2.这次单链表的操作,让我对单链表的操作更加熟悉,明白了单链表的存储方式,知道单链表与顺序表以及其他线性表的不同之处。

3.在写代码时,我们要完成了一个功能并测试通过后,才能接着添加功能,不要先一次把所有的功能写进去再测试,这样容易导致一次出现大量错误,我们却无法找到错误并修改。

使我们失去信心,认为我们写不出来,从而放弃实验。

 

七.附录(代码)

#include

#include

#include

#include

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASIBLE-1

#defineOVERFLOW-2

#defineStatusint

#defineElemTypeint

typedefstructLNode

{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

voidMenu();//菜单

voidSelect(LNode*L);//选择菜单

StatusCreateList_L(LNode*L,intn);//创建单链表

StatusDestroyList_L(LNode*L);//销毁单链表

StatusListEmpty_L(LNode*L);//判断表空

StatusListLength_L(LNode*L);//测量表长

StatusListInsert_L(LNode*L,inti,ElemTypee);//插入元素

StatusListDelete_L(LNode*L,inti,ElemType*e);//删除指定位置上的数据元素

StatusQueryList_L(LNode*L,inti);//查询元素

StatusClearList_L(LNode*L);//清空单链表

StatusGetElem_L(LNode*L,inti,ElemType*e);//取顺序表中指定位置上的元素

StatusListTraverse_L(LNode*L);//输出单链表

voidmain()

{

LNodeL;

L.next=NULL;

while

(1)

{

Menu();

Select(&L);

}

}

voidMenu()

{

system("color02");

system("cls");

printf("\n");

printf("\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");

printf("\t※※\n");

printf("\t※****************单**链**表**的**操**作**************※\n");

printf("\t※※\n");

printf("\t※1:

创建单链表2:

销毁单链表※\n");

printf("\t※※\n");

printf("\t※3:

判断表空4:

测量表长※\n");

printf("\t※※\n");

printf("\t※5:

插入数据元素6:

删除数据元素※\n");

printf("\t※※\n");

printf("\t※7:

查询元素8:

清空单链表※\n");

printf("\t※※\n");

printf("\t※9:

取指定位置元素10:

输出单链表※\n");

printf("\t※※\n");

printf("\t※0:

退出※\n");

printf("\t※※\n");

printf("\t※※※※※※※※※※※BUG※※※※※※※※※※※※※\n");

printf("\n\n\t\t请选择操作:

");

}

voidSelect(LNode*L)

{

inta,i,flag=0;

charc;

ElemTypee;

while

(1)//输入检测

{

scanf("%d",&a);

getchar();

if(a>=0&&a<=10)

break;

else

printf("\t\t非法数据,请重新输入:

");

}

switch(a)

{

case1:

printf("请输入元素个数!

\n");

scanf("%d",&e);

CreateList_L(L,e);

printf("\n按任意键继续...");

getch();

system("cls");

break;

case2:

DestroyList_L(L);

printf("\n按任意键继续...");

getch();

system("cls");

break;

case3:

ListEmpty_L(L);

printf("\n按任意键继续...");

getch();

system("cls");

break;

case4:

ListLength_L(L);

printf("\n按任意键继续...");

getch();

system("cls");

break;

case5:

printf("请输入指定位置i\n");

while

(1)

{

scanf("%d",&i);

if(i>0&&i<=ListLength_L(L)+1)

break;

else

{

printf("链表中没有此位置!

\n");

flag=1;

break;

}

}

if(flag==0)

{

printf("请输入插入的数据元素\n");

scanf("%d",&e);

ListInsert_L(L,i,e);

}

printf("\n按任意键继续...");

getch();

system("cls");

break;

case6:

printf("请输入删除元素的位置\n");

while

(1)

{

scanf("%d",&i);

if(i>0&&i<=ListLength_L(L))

break;

else

{

printf("链表中没有此位置!

\n");

flag=1;

break;

}

}

if(flag==0)

{

ListDelete_L(L,i,&e);

printf("删除的元素为%d",e);

}

printf("\n按任意键继续...");

getch();

system("cls");

break;

case7:

printf("请输入查询元素的位置\n");

while

(1)

{

scanf("%d",&i);

if(i>0&&i<=ListLength_L(L))

break;

else

{

printf("链表中没有此位置!

\n");

flag=1;

break;

}

}

if(flag==0)

{

QueryList_L(L,i);

}

printf("\n按任意键继续...");

getch();

system("cls");

break;

case8:

ClearList_L(L);

printf("\n按任意键继续...");

getch();

system("cls");

break;

case9:

printf("请输入指定的位置\n");

while

(1)

{

scanf("%d",&i);

if(i>0&&i<=ListLength_L(L))

break;

else

{

printf("链表中没有此位置!

\n");

flag=1;

break;

}

}

if(flag==0)

{

GetElem_L(L,i,&e);

printf("指定位置%d的元素值为:

%d",i,e);

}

printf("\n按任意键继续...");

getch();

system("cls");

break;

case10:

ListTraverse_L(L);

printf("\n按任意键继续...");

getch();

system("cls");

break;

case0:

exit(0);//退出系统

}

}

StatusCreateList_L(LNode*L,intn)//创建单链表

{

LNode*p,*last;

inti;

L->next=NULL;

last=L;

for(i=n;i>0;--i)

{

p=(LNode*)malloc(sizeof(LNode));

printf("请输入数据:

");

scanf("%d",p);

p->next=last->next;

last->next=p;

last=p;

}

returnOK;

}

StatusListTraverse_L(LNode*L)//输出单链表

{

LNode*p;

p=L->next;

if(p!

=NULL)

{

while(p!

=NULL)

{

printf("%d\t",p->data);

p=p->next;

}

}

else

printf("没有任何数据!

");

returnOK;

}

StatusDestroyList_L(LNode*L)//销毁单链表

{

if(L->next!

=NULL)

{

L->next=NULL;

}

else

printf("顺序表不存在!

");

returnOK;

}

StatusListEmpty_L(LNode*L)//判断表空

{

if(L->next!

=NULL)

{

printf("顺序表不为空!

");

returnFALSE;

}

else

{

printf("顺序表为空!

");

returnTRUE;

}

}

StatusListLength_L(LNode*L)//测量表长

{

LNode*p;

inti=0;

p=L->next;

if(p!

=NULL)

{

while(p!

=NULL)

{

i++;

p=p->next;

}

printf("单链表共有%d个数据\n",i);

}

else

printf("没有任何数据!

");

returni;

}

StatusListInsert_L(LNode*L,inti,ElemTypee)//插入元素

{

LNode*p,*last;

intii;

p=L;

last=p;

while(p!

=NULL)

{

if(last!

=NULL)

{

for(ii=0;ii

{

last=last->next;

}

}

p=p=(LNode*)malloc(sizeof(LNode));

p->data=e;

p->next=last->next;

last->next=p;

printf("插入成功!

\n");

break;

}

returnOK;

}

StatusListDelete_L(LNode*L,inti,ElemType*e)//删除指定位置上的数据元素

{

LNode*p,*last;

intii;

p=L;

last=p;

while(p!

=NULL)

{

if(last!

=NULL)

{

for(ii=0;ii

{

last=last->next;

}

}

p=last->next;

*e=p->data;

last->next=p->next;

free(p);

printf("删除成功!

\n");

break;

}

returnOK;

}

StatusQueryList_L(LNode*L,inti)//查询指定位置上的数据元素

{

LNode*p;

intii,e;

p=L;

while(p!

=NULL)

{

for(ii=0;ii

{

p=p->next;

}

e=p->data;

printf("位置%d上的数据元素为:

%d\n",i,e);

break;

}

returnOK;

}

 

StatusClearList_L(LNode*L)//清空单链表

{

LNode*p;

p=L->next;

free(p);

L->next=NULL;

printf("清空完毕!

\n");

returnOK;

}

StatusGetElem_L(LNode*L,inti,ElemType*e)//取顺序表中指定位置上的元素

{

LNode*p;

intii;

p=L;

while(p!

=NULL)

{

for(ii=0;ii

{

p=p->next;

}

*e=p->data;

break;

}

returnOK;

}

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

当前位置:首页 > 总结汇报

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

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