c++课程设计《链表的实现增删改查》.docx
- 文档编号:20118384
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:31
- 大小:251.17KB
c++课程设计《链表的实现增删改查》.docx
《c++课程设计《链表的实现增删改查》.docx》由会员分享,可在线阅读,更多相关《c++课程设计《链表的实现增删改查》.docx(31页珍藏版)》请在冰豆网上搜索。
c++课程设计《链表的实现增删改查》
河南城建学院
课程设计报告书
专业:
课程设计名称:
《数据结构课程设计》
题目:
学 号:
姓 名:
同组人员:
指导老师:
完成时间:
2012年2月17日
摘要
现在是信息爆炸的时代,整个生活空间都充斥着无尽的数据信息,随时随地都可
能要存储一些信息,或者删除一些信息。
然而有时候又不确定信息的数量和对信息操
作的不同需求,这时,有一个动态的存储的系统是很必须的。
这个系统要基本满足客
户对信息的处理,诸如一些简单的操作:
插入,删除,查找,输出,计数等,并且,这个系统要能够像电脑上的操作系统一样,能够执行很多操作之后,仍然能够回到主菜单界面,不能执行一个操作就需要重新启动,那样的话,先前存储的信息会丢失不说,对使用的客户来说,也很不方便。
所以,这时给用户更多的选择就很必要了。
本文采用C作为前台的开发工具,VisualC++6.0作为后台数据库平台,建立基于C/C++两层模式的链表操作系统,旨在实现对生活中一些信息进行基本简单高效的操作。
关键词:
C,VisualC++6.0,链表,建表,查找,删除,插入,计数,输出
目录
目录1
第一章开发环境和开发工具1
1.1C语言简介1
1.2开发背景1
1.3开发环境1
第二章算法思想3
2.1系统需求分析3
2.2系统总体设计3
2.2.1系统设计目标3
2.2.2开发设计思想3
2.2.3系统功能模块设计4
2.3算法思想描述6
第三章算法实现9
3.1数据结构9
3.2程序模块9
3.3各模块之间的调用关系10
3.4源程序代码12
第四章测试与分析21
4.1测试数据选择21
4.2测试结果分析23
总结24
心得体会25
参考文献26
第一章开发环境和开发工具
1.1.1C/C++语言简介
C语言是一种计算机程序设计语言。
它既具有高级语言的特点,又具有汇编语言的特点。
C语言已先后被移植到大、中、小及微型机上。
它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。
C语言具有简洁紧凑、灵活方便运算符丰富数据类型丰富语法限制不太严格,程序设计自由度大允许直接访问物理地址,对硬件进行操作生成目标代码质量高,程序执行效率高 适用范围大,可移植性好等优点。
但它也有一定的缺点。
1.2开发背景
随着科学技术的不断发展,计算机科学日渐成熟,其强大的功能已为人们所深刻认识,它己进入人类社会的各个领域并发挥着越来越重要的作用。
采用计算机进行信息管理已成为社会生活中的普遍现象。
而数据信息管理的全面自动化、信息化则是其中重要的组成部分。
数据信息管理的好坏对于每个人来说都至关重要,在很大程度上影响着我们的生活质量。
因此,本文所研究的链表操作系统具有一定的使用价值和现实意义。
1.3开发环境
本文所采用的开发环境主要是基于C为开发工具,并以VisualC++6.0作为后台数据库平台的基于C/C++的双层管理模式。
在进入VisualC++6.0工作界面,选择建立Win32ConsoleApplication工程文件,并为该工程文件命名,确定后进入下一步,建立以C/C++为头文件的目标程序,并以.c为文件格式命名。
完成后,即可键盘录入源程序。
录入完成后,点击右上方“!
”可以进行编译,并对该程序进行上机调试,直至程序能够完整并正确的运行出来。
第二章算法思想
2.1系统需求分析
本程序为链表操作系统,是用自定义数据类型(结构体)及指针的应用来实现链表的建立,插入,查找,删除,计数,输出。
程序用结构体来记录数据信息。
数据由用户通过键盘输入,然后通过内存的动态应用来建立一个链表。
再通过指针的灵活应用来实现各项其他操作。
在建立系统的过程中,细节性的提示一定要全面到位,应为这是内存的动态应用,所以存在很大的变数,一定要让用户能够清楚的知道应该怎么做,并且能对用户的错误输入给出正确的提示,争取做到无论用户如何输入都会又回应,不能出现死机的状况。
2.2系统总体设计
2.2.1系统设计目标
本文研究开发数据信息的链式动态存储来满足人们日常生活的需要,有以下三个方面的目标:
●数据信息的多少没有上限。
●支持高效率完成人们日常生活中对信息的操作需求,包括新信息的插入,旧信息的查找和删除。
●支持动态管理要存储的信息,令人们能及时的对数据信息进行处理,提高生活效率等目标。
2.2.2开发设计思想
基于以上系统设计目标,本文在开发链表操作系统时遵循了以下开发设计思想:
●采用现有的软硬件环境及先进的链表操作系统开发方案,从而达到充分利用现有资源,提高系统开发水平和应用效果的目的。
●尽量达到操作过程中的直观、方便、实用、安全等要求。
●系统采用模块化程序设计方法,既便于系统功能的各种组合和修改,又便于未参与开发的技术维护人员补充、维护。
2.2.3系统功能模块设计
本系统分为六个模块:
建表模块、插入模块、删除模块、查找模块、计数模块、输出模块。
●1.程序主要功能函数
structline*made(int*count)实现链表的建立时间复杂度为O(n)
structline*Insert(structline*head,int*count)实现对链表进行插入操作
时间复杂度为O(n)
structline*Delate(structline*head,int*count)实现对链表的已有信息的删除操作时间复杂度为O(n)
voidcounter(int*count)实现对链表数据信息个数统计操作
时间复杂度为O
(1)
voidSearch1(structline*head,int*count)实现按序号找结点的操作
时间复杂度为O(n)
voidSearch2(structline*head,int*count)实现按结点找序号的操作
时间复杂度为O(n)
voidoutput(structline*head,intCount)实现对信息的输出操作
时间复杂度为O(n)
voidmain()主函数
●2.主流程图
2.3算法思想描述
在各个操作流程中,一定要考虑到用户的错误信息的输入,尽可能对用户的输入作出应该有的回应。
这就要求在各个模块中使用到很多的循环,对于循环变量的要求,也是一个很大的挑战,正如一下流程图所展示的:
在用户输入要插入的位置时,一定要判断用户的输入是否合法:
一个只有6个结点的链表,用户却要把新的结点插入到第9个结点的前面,显然这是不可能的,这时,就要要求用户重新输入,并且同时给用户正确的提示。
同时插入的过程中,利用循环找到要插入的位置,然后插入。
插入的时候,指针的变换必须是插入的元素的指针先指向下下一个,然后前面的指针指向这个。
如果不是这个顺序,就会丢失后面的部分链表。
所以这个也是一定要注意的。
同理,在删除的过程中,一定要判断用户的输入的是否合法。
因为删除的元素序号必须是链表范围的内的,超出这个范围是无法执行的。
在指针指向改动的时候,一定要注意是哪个指针的变换,不要删错元素。
查找时,会有两种查找,一种是输入结点值查找其序号;一种是输入序号,找结点值。
所以设置的变量order2用来让用户选择要查找的方式。
同时一定要给用户清晰的提示,实现用户所要达到的目标等。
第三章算法实现
3.1数据结构
链表操作系统是一个内存动态应用系统,用户所有的要处理的数据信息都存储在链表中。
本系统采用结构体的形式来存储用户的信息,并且,大量的使用循环,来实现系统的多次使用。
3.2程序模块
在程序中又分为6个模块:
建表模块、插入模块、删除模块、计数模块、输出模块、函数。
其中,查找模块又分为了两个模块:
模块一:
通过序号找结点
voidSearch1(structline*head,int*count)
//按照给定序号查找函数
//head为链表的头指针
//整型指针count指向结点个数计数器
voidSearch1(structline*head,int*count)
{
structline*p;//接受链表头指针
inti,j,e;//i用来存储用户要查找的结点的序号,j用来控制循环次数,e用来存储该结点的值
printf("请输入你要查找的结点的序号\n");
scanf("%d",&i);
while(i<1||i>*count)
{
printf("请输入正确的序号:
\n");
printf("%d~~%d\n",1,*count);
printf("请输入你要查找的元素的序号\n");
scanf("%d",&i);
}
p=head;
j=1;
while(j!
=i)//顺指针向后查找,直到p指向第i个元素或p为空
{
p=p->next;
j++;
}
e=p->num;//取第i个元素
printf("你要查找的元素值为%d\n",e);
}
模块二:
通过结点找序号
//给定数值查找其在链表中的位置即序号
//head为链表的头指针
//整型指针count指向结点个数计数器
voidSearch2(structline*head,int*count)
{
inte,j,tell=0;//e用来存储用户要查找的结点的值,j用来控制循环,tell判断是否找到了存储该值的结点
structline*p;//接受链表头指针
printf("请输入你要查找的元素值:
\n");
scanf("%d",&e);
p=head;
j=1;
for(j=1;j<=*count;j++)
{
if(e==p->num)
{
printf("你要查找的值的序号为%d.\n",j);//找到所查找值的位置即第j个元素
tell++;
p=p->next;
}
else
p=p->next;
}
if(tell==0)
printf("您要查找的值不存在.\n");
}
3.3各模块之间的调用关系
主函数在用户不停止系统的情况下调用各个模块,从而实现用户的需求:
3.4源程序代码
#include
#include
//结构体的定义
structline{
intnum;//用来存储已知的数据
structline*next;//用来指向下一个结点
};
//输出函数
//head为链表头指针,Count为链表结点计数器
voidOutput(structline*head,intCount)
{
structline*p;//接受链表头指针
inti=0;//控制下面的循环
p=head;
printf("链表中的元素值为:
\n");
for(i=0;i { printf("%d",p->num); p=p->next; } printf("\n"); } //链表构造函数,返回值为指向structline结构体的指针 //参数为指向整型的指针count //作用: 构建线性链表并计数 //当输入的值为零时,默认结束输入 structline*made(int*count) { structline*p1=NULL,*p2=NULL;//建立链表的辅助指针 structline*head=NULL; p2=p1=(structline*)malloc(sizeof(structline)); printf("输入0表示建表结束,请输入至少一个元素。 \n"); printf("请输入第%d个元素的值: \n",*count+1); scanf("%d",&p1->num); while(p1->num! =0) { if(*count==0) { head=p1; (*count)++; } else { p2->next=p1; p2=p2->next; (*count)++; } p1=(structline*)malloc(sizeof(structline)); printf("请输入第%d个元素的值: \n",*count+1); scanf("%d",&p1->num); } free(p1); returnhead; } //插入函数,返回值为指向structline结构体的指针 //参数为一个指向结构体的指针和两个整型指针与一个整型数 //结构体指针head式链表的头指针,整型指针count指向计数器 structline*Insert(structline*head,int*count) { inta,num;//a存储插入的位置,b存储插入的数据 structline*p1=head,*p2=NULL; printf("请输入要插入的位置: \n"); scanf("%d",&a); while(a<1||a>(*count+1))//判断用户的输入是否正确,如果不合法,提醒用户正确输入 { printf("请输入正确位置: \n"); printf("%d~%d\n",1,*count+1); scanf("%d",&a); } printf("请输入要插入的元素值: \n"); scanf("%d",&num); if(a==1) { p2=(structline*)malloc(sizeof(structline)); p2->num=num; p2->next=p1; head=p2; } elseif(a==2) { p2=(structline*)malloc(sizeof(structline)); p2->num=num; p2->next=p1->next; p1->next=p2; head=p1; } else { while(a-2! =0) { p1=p1->next; a--; } p2=(structline*)malloc(sizeof(structline)); p2->num=num; p2->next=p1->next; p1->next=p2; } printf("插入成功。 \n"); returnhead; } //删除函数 //参数一个指向结构体的指针和一个整型指针 //结构体指针head为链表头指针 //整型指针count为结点个数计数器 structline*Delate(structline*head,int*count) { intn;//用来存储用户要删除的结点序号 structline*p1=head,*p2=head;//删除过程中的辅助指针 printf("请输入要删除的元素序号: \n"); scanf("%d",&n); while(n>*count||n<0)//判断用户的输入是否合法,如果不合法,提醒用户正确输入 { printf("请输入正确的数: \n"); printf("%d~%d\n",1,*count); scanf("%d",&n); } if(n==1) { head=p1->next; free(p1); } elseif(n==2) { p1=p1->next; p2->next=p1->next; } else { p1=p1->next; while(n-2! =0) { p2=p2->next; p1=p1->next; n--; } p2->next=p1->next; } printf("删除成功\n"); returnhead; } //计数函数 //参数为一个整型指针,指向结点个数计数器 voidcounter(int*count) { printf("链表的元素个数为: \n"); printf("%d\n",*count); } //按照给定序号查找函数 //head为链表的头指针 //整型指针count指向结点个数计数器 voidSearch1(structline*head,int*count) { structline*p;//接受链表头指针 inti,j,e;//i用来存储用户要查找的结点的序号,j用来控制循环次数,e用来存储该结点的值 printf("请输入你要查找的结点的序号\n"); scanf("%d",&i); while(i<1||i>*count) { printf("请输入正确的序号: \n"); printf("%d~~%d\n",1,*count); printf("请输入你要查找的元素的序号\n"); scanf("%d",&i); } p=head; j=1; while(j! =i)//顺指针向后查找,直到p指向第i个元素或p为空 { p=p->next; j++; } e=p->num;//取第i个元素 printf("你要查找的元素值为%d\n",e); } //给定数值查找其在链表中的位置即序号 //head为链表的头指针 //整型指针count指向结点个数计数器 voidSearch2(structline*head,int*count) { inte,j,tell=0;//e用来存储用户要查找的结点的值,j用来控制循环,tell判断是否找到了存储该值的结点 structline*p;//接受链表头指针 printf("请输入你要查找的元素值: \n"); scanf("%d",&e); p=head; j=1; for(j=1;j<=*count;j++) { if(e==p->num) { printf("你要查找的值的序号为%d.\n",j);//找到所查找值的位置即第j个元素 tell++; p=p->next; } else p=p->next; } if(tell==0) printf("您要查找的值不存在.\n"); } //主函数 voidmain() { structline*made(int*count); voidcounter(int*count); structline*Delate(structline*head,int*count); structline*Insert(structline*head,int*count); voidoutput(structline*head); voidSearch1(structline*head,int*count); voidSearch2(structline*head,int*count); intorder,order1,order2;//存储用户输入的指令 structline*head;//链表的头指针 intCount=0,*count=NULL;//结点计数器和指向结点计数器的指针 count=&Count; printf("首先,建立一个链表。 \n"); head=made(count); while(! head) { printf("请建立至少一个结点的链表\n"); *count=0; head=made(count); } printf("**************1插入*****************\n"); printf("**************2删除*****************\n"); printf("**************3查找*****************\n"); printf("**************4计数*****************\n"); printf("**************5输出*****************\n"); printf("**************0退出*****************\n"); printf("\n\n"); printf("请输入您要选择的操作: \n"); printf("如果输入账单中不存在的数,程序退出.\n"); scanf("%d",&order); while(order>0&&order<6) { switch(order)//判断用户输入的指令 { case1: printf("您选择了插入? \n"); printf("确认请输入1,重新选择输入0或者任意非1的数\n"); scanf("%d",&order1); if(order1==1) { head=Insert(head,count); Count++; break; } else break; case2: printf("您选择了删除? \n"); printf("确认请输入2,重新选择输入0或者任意非2的数\n"); scanf("%d",&order1); if(order1==2) { head=Delate(head,count); Count--; break; } else break; case3: printf("您选择了查找? \n"); printf("确认请输入3,重新选择输入0或者任意非3的数\n"); scanf("%d",&order1); if(order1==3) { printf("*****************1按序号查找,返回元素值。 ******************\n"); printf("*****************2按元素值查找,返回序号。 ******************\n"); printf("\n\n"); scanf("%d",&order2); if(order2==1) { Search1(head,count); break; } else { Search2(head,count); break; } } e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 链表的实现增删改查 c+ 课程设计 实现 增删
![提示](https://static.bdocx.com/images/bang_tan.gif)