C语言大作业 有序线性表.docx
《C语言大作业 有序线性表.docx》由会员分享,可在线阅读,更多相关《C语言大作业 有序线性表.docx(14页珍藏版)》请在冰豆网上搜索。
C语言大作业有序线性表
C语言大作业有序线性表
程序设计挑战式课程设计
极限挑战
挑战,不是为着征服自然,而是为着突破自我,超越自我
生命有极限,思想无极限,高度有极限,境界无极限
作业名称:
有序线性表
学院:
教育实验学院
班级:
HC001505
学号:
2015300074
姓名:
祖陆晗
团队组成:
祖陆晗
西北工业大学
2016年12月12日
程序设计挑战式课程设计报告
请填写以下十项内容~将表格按页对齐,插入空行,~勿删除任何部分。
1、问题与背景,描述程序所要解决的问题或应用背景,
数组是程序设计中常用的数据结构~但使用数组时必须先定义好数组长度~这个长度一经定义就是固定不变的~如果事先难以确定元素个数~则必须把数组长度定义的足够大~这将占用许多内存。
另一方面~在数组中若要插入或删除某个元素~需要移动插入点或删除点后面的所有的数组元素~这将占用大量的时间。
数组的这些限制给多数据的处理带来了许多不便。
2、开发工具,列出所使用的开发工具和第3方开发库,
VisualC++6.0
3、主要功能,详细说明程序的功能,
本程序是用链表实现有序线性表的程序,可实现的基本功能包括,置空,插入,查找,输出和退出,程序采用菜单界面,用户只需选择选项即可实现相应的功能。
按照提示进行操作,可以实现诸如置空,删除等操作,从而实现数据的处理。
为了更方便的处理多数据问题~需要引入链表这种数据结构。
而本程序正是通过链表~指针~数组~结构体等数据结构和相关文件函数~对数组不易实现的功能进行了整合~相对于数组~本程序可以处理不知道具体量的数据~且可以方便的实现置空表~插入~查找~输出等功能。
4、设计内容,详细描述解决问题的原理和方法、算法、数据结构等,1.加入必要的头文件:
#include
-2-
程序设计挑战式课程设计报告
#include
#include
#include
2.使用结构体类型定义链表:
structnum
{
floatdata;structnum*next;
}num;
3.定义输出函数:
具体介绍在函数模块中展示,
从main函数传递的head指针的数据开始,依次输出链表数据,直到遇到NULL为止。
4.定义置空表函数:
由main函数传递head指针,从head指针到链表节点末尾依次删除各个数据,同时释放内存空间。
5.定义插入函数:
采用静态查找的方法,从main函数传递的head指针的数据开始,依次比较链表中data成员与searchnum的大小,采用while循环实现顺序查找,保证插入数据后,整个链表data成员依然从大到小排列。
6.定义查找函数:
采用静态查找的方法,从main函数传递的head指针的数据开始,依次比较链表中data成员与searchnum的大小,采用while循环实现顺序查找,如果找到数据就输出数据所在的位置,否则提示没有找到。
7.定义创建函数:
链表结构的优势在于可以动态的控制结构的大小,可以在内存中不连续的存储。
本函数的功能在于不断创建新的节点知道满足用户的要求为止(用户可自定义结束条件)。
这一过程通过while循环和malloc()函数分配内存实现。
定义结构体链表指针p始终指向新开辟的节点,p2始终指向下一节点,通过循环完成链表的创建工作。
本函数为无参函数,调用结束后向main函数返回head头指针。
8.定义退出函数:
通过简单switch语句退出与确认退出。
防止误操作。
9.定义欢迎界面
对程序及制作人简单介绍。
5、程序文件与工程名称,标出程序中所有文件名、工程名称及其说明,
文件夹:
程序运行截图
-3-
程序设计挑战式课程设计报告
文本文档:
个人信息
.C文件:
有序线性表
应用程序:
有序线性表//主程序
Word文件:
有序线性表程序报告
6、函数模块,程序中各个函数的原型声明及其说明,
1.插入函数:
原型声明:
structnum*insert(structnum*head)
说明:
采用静态查找的方法,从main函数传递的head指针的数据开始,依次比较链表中data成
员与searchnum的大小,采用while循环实现顺序查找,保证插入数据后,整个链表data成
员依然从大到小排列。
2.创建函数:
原型声明:
structnum*creat(void)
说明,链表结构的优势在于可以动态的控制结构的大小,可以在内存中不连续的存储。
本
函数的功能在于不断创建新的节点知道满足用户的要求为止(用户可自定义结束条件)。
这一过程通过while。
循环和malloc()函数分配内存实现。
定义结构体链表指针p始终指向
新开辟的节点,p2始终指向下一节点,通过循环完成链表的创建工作。
本函数为无参函
数,调用结束后向main函数返回head头指针。
3.查找函数:
原型声明:
structnum*search(structnum*head)
说明:
采用静态查找的方法,从main函数传递的head指针的数据开始,依次比较链表中data
成员与searchnum的大小,采用while循环实现顺序查找,如果找到数据就输出数据所在
的位置,否则提
示没有找到。
4.输出函数:
原型声明:
structnum*print(structnum*head)
说明:
从main函数传递的head指针的数据开始,依次输出链表数据,直到遇到NULL为止。
5.清屏函数:
-4-
程序设计挑战式课程设计报告
说明:
这是系统自带函数,需要包含”stdlib.h”头文件,使用system(“cls”)实现。
6.置空函数:
原型声明:
structnum*clean(structnum*head)
说明:
由main函数传递head指针,从head指针到链表节点末尾依次删除各个数据,同时释
放内存空间。
7.main函数:
说明:
系统主函数,负责输入输出和各函数的调用,采用while
(1)实现连续循环,通过switch语句选择调用相应的函数实现功能。
7、使用说明,运行程序的小型说明书,
初次运行程序时必须先初始化数据,用户可自定义链表创建结束条件,并从小到大依次输入一组数据,最后一个数据是结束的标志,不计入链表的数据内容。
输入完成后回车,系统自动输出数据,用户可判断输入的数据是否正确。
接下来将显示菜单部分,共分基本功能和附加功能,用户通过输入功能项目前的序号来启动对应功能。
“置空表”是将链表数据删除,同时释放所占的内存,“插入”是用户可在原来的链表上新加入一个或多个数据,系统将自动排序,“删除”是用户将原有数据清空,同时释放内存,“查找”可以帮助用户确认某数据是否在链表中,“输出”是将当年内存中的链表数据依次在屏幕上显示,用户可使用“退出”离开程序。
程序将循环显示功能菜单,直到用户退出为止。
8、程序开发总结,简要叙述编写本作业的收获与思考,
通过这次大作业,我感受到了编程的魅力。
其实链表对于我这种初学者来说真的不容易,从确定选题到自学相关知识,再到自己一点一点的编
-5-
程序设计挑战式课程设计报告
程,期间遇到了很多困难,但还是坚持了下来。
最终编译成功的那一刻,心中真的是充满了成就感。
这次大作业的完成不仅让我的知识结构更加完善,更锻炼了我的毅力,让我感受到了编程的魅力。
希望自己在未来的日子里把编程继续下去,不断学习,不断追求新的成功的喜悦,
9、运行截图,附上程序运行的截图画面~至少有1幅~截图越翔实得分越高,
(1)这是欢迎界面,程序运行后就可以看见:
(2)按照提示进行操作,就可以成功创建一个链表:
-6-
程序设计挑战式课程设计报告
(3)插入并输入的操作界面:
-7-
程序设计挑战式课程设计报告
(4)查找功能的操作界面:
-8-
程序设计挑战式课程设计报告(5)置空和退出界面:
10、源程序,附上程序源代码~若是多个文件~标出文件名,
#include
#include
#include
#include
#defineLENsizeof(structnum)
intn;//全局变量,用于记录链表的数据个数
structnum//使用结构体类型定义链表
{
floatdata;structnum*next;}num;
structnum*print(structnum*head)//定义输出函数
{
structnum*p;
inti;chara;
printf("\n目前线性表中的数据有%d个,如下所示:
\n",n);
-9-
程序设计挑战式课程设计报告
p=head;
i=0;
if(head!
=NULL)
do
{if(i%5==0)printf("\n");i++;
printf("%g\n",p->data);//数据输出
p=p->next;
}while(p!
=NULL);//采用%g输出,可以不输出无意义的0
printf("\n");
printf("按回车键继续\n");
a=getchar();
return(head);//返回头指针
}
structnum*clean(structnum*head)//定义置空表函数,{
structnum*p;
chari;
while(head->next!
=NULL)
{p=head->next;
head->next=head->next->next;
free(p);
}//使用free(*)函数释放内存
printf("链表已经成功置空!
");
head=NULL;
printf("按回车键继续");
i=getchar();
return(head);
}
structnum*insert(structnum*head)//定义插入函数
{
structnum*p0,*p1,*p2,*in;
p1=head;
printf("请输入要插入的数据:
\n");
in=(structnum*)malloc(LEN);//使用malloc(LEN)分配内存空间
p0=in;
scanf("%f",&in->data);
if(head==NULL)
{
head=p0;p0->next=NULL;
}
else{
while((p0->data>p1->data)&&(p1->next!
=NULL))//查找符合排列顺序的插
-10-
程序设计挑战式课程设计报告
入点
{p2=p1;p1=p1->next;}
if(p0->data<=p1->data)
{
if(head==p1)head=p0;
elsep2->next=p0;p0->next=p1;}
else{p1->next=p0;p0->next=NULL;}//如果插入点是最后一个,就用NULL使链表结束
}
n=n+1;
return(head);//返回头指针
}
structnum*search(structnum*head)//定义查找函数
{
typedefintCOUNT;COUNTi=0;
structnum*p;
floatsearchdata;
printf("请输入你想要查找的数据:
\n");
scanf("%f",&searchdata);
if(head==NULL){printf("\n这是一个空表,请先建立,然后再删除~");}
p=head;
while((searchdata!
=p->data)&&(p->next!
=NULL)){p=p->next;i++;}//顺序线性查找
if(searchdata==p->data)
{
printf("%g已经找到。
这是链表中的第%d个数据。
\n",searchdata,i+1);
}
elseprintf("没有在链表中找到%g请再次确认数据~\n",searchdata);
return(head);
}
structnum*creat(void)//定义创建函数
{
structnum*head;
structnum*p1,*p2;
n=0;
floati;
p1=p2=(structnum*)malloc(LEN);
printf("第一次使用本程序,请创建链表.\n");
printf("请输入一个数字作为链表结束创建的条件:
\n请注意:
不能用要输入的链表的数据作为该结束条件~\n");
-11-
程序设计挑战式课程设计报告
scanf("%f",&i);
printf("请从小到大输入数据来初始化链表(注意从小到大,用空格隔开)\n");
scanf("%f",&p1->data);
head=NULL;
while(p1->data!
=i)//当输入为i时不再开辟新区域
{n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(structnum*)malloc(LEN);
scanf("%f",&p1->data);
}
p2->next=NULL;
return(head);
}
voidvanish(structnum*head)//定义退出函数
{
chari;
printf("确定退出?
(输入Y确认退出,输入N返回)\n");//退出时提醒
i=getchar();
switch(i)//不区分大小写
{
case'Y':
case'y':
exit
(1);break;
case'N':
case'n':
;break;
}
}
voidinfo()//定义欢迎信息
{
printf("\n\n\n\n\n\n\n\t");
printf("\t欢迎使用“用链表实现有序线性表”演示\n");
printf("\n\n\t\t\t制作:
西北工业大学教育实验学院祖陆晗\n");
printf("\n\n\t\t\t学号:
2015300074\n");
printf("\n\n\n\t\t\t按回车键继续操作");
getchar();//getchar()起到暂停作用
}
intmain()
-12-
程序设计挑战式课程设计报告
{
structnum*head;
inti,t;
info();
system("cls");
head=creat();print(head);
while
(1)
{
printf("\n基本功能:
\n1.置空表\n2.插入\n3.查找\n4.输出\n0.退出\n");
printf("\n请选择一项操作(输入项目前的数字或字母).\n");
//t=getchar();//接收创建链表时的最后一个回车
scanf("%d",&i);
switch(i)
{
case0:
vanish(head);break;
case1:
head=clean(head);break;
case2:
head=insert(head);break;
case3:
head=search(head);break;
case4:
head=print(head);break;
}
}
}
-13-