# 基于C语言链表实现的订餐系统
# 1、课程设计简介
## 1.1 要求
参加本课程设计的学生,应当认真完成本课程设计的全部过程。并以最终课程设计成果来证明其独立完成各种实际任务的能力。从而,反映出理解和运用本课程知识的水平和能力。
## 1.2 意义和目的
**意义**
C语言是电子科学与技术专业的重要专业基础课。在很多后续课程中,都要使用到C语言。
学生通过对C语言的学习,已经具备了使用C语言编写简单的应用程序的能力。为了加强程序设计基础,开设课程设计课,使学生对C语言有更全面的理解,进一步提高运用C语言编程解决实际问题的能力,同时,为后续课程的学习夯实基础。
**目的**
- 提高用程序设计解决实际问题的能力
- 通过提出算法、指定输入输出来设计一个解决方案
- 用C语言合理地开发两个简洁有效的程序代码来实现该设计
- 测试程序是否工作且满足设计指标并评价其效率
## 1.3 内容
链表操作题(包括建立、插入、删除、打印等)(参考教材);
# 2、具体实现
## 2.1 程序总体方案
### 2.1.1 程序设计思想
通过在主函数循环调用各个函数,从而实现对链表的连续操作,最终实现链表的新建、打印、查找、保存、读取、更新、删除等等操作,进而管理订单与用户信息,并保存用户的各种信息,方便下一次操作。链表是以订单号排序,当出现订单号相同时会有提示,并结束本次操作,成功实现一个订单号对应一个客户。
### 2.1.2 程序结构或流程图
![](http://www.writebug.com/myres/static/uploads/2021/10/19/a8a63ecad5fc2367faa8aa40768cb8ad.writebug)
## 2.2 改进方案
### 2.2.1 改进一
#### 2.2.1.1 改进方案
刚开始链表是按插入顺序进行排列的,搜索时的时候也没有按序号检索,总体看起来很乱。所以,在增加、修改等需要增加新的客户信息的时候,调用按订单号排序的函数,这样打印的时候就显得很工整,有条理。
#### 2.2.1.2 具体实现
```c
void Insert(Pointer *Head)
{
int in_number;
Pointer p,q,r;
p=q=*Head;
printf("请输入号码:");
scanf("%d",&in_number);
while(p!=NULL)
{
if(in_number==p->number)
{
printf("已存在号码!");
}
else
{
q=p;
p=p->next;
}
}
r=(Pointer)malloc(sizeof GuestLink);
r->next=NULL;
if(q==NULL)
*Head=r;
else
q->next=r;
printf("请输入姓名:");
scanf("%s",r->name);
printf("请输入人数");
scanf("%f",&r->sum);
printf("请输入时间");
scanf("%s",r->time);
}
```
### 2.2.2 改进二
#### 2.2.2.1 改进方案
一开始没有建立数据的时候,是无法提取数据的,而要是在开头的时候先提取数据的话,就会出现读不到数据,然后指针Head不为NULL,而接下来的操作就会出现问题。所以,在无法找到数据的时候,我们就返回一个指针Head=NULL,这样,头指针还是指向空函数,说明我们没有成功读取数据,或者未保存任何数据信息。这样在接下来的操作就不会出错了。
#### 2.2.2.2 具体实现
```c
void Insert(Pointer *Head)
{
int in_number;
Pointer p,q,r;
printf("请输入编号:\n");
scanf("%d",&in_number);
p=q=*Head;
while(p!=NULL)
{
if(p->number==in_number)
{
printf("已经有相同编号:");
return;
}
else
{
q=p;p=p->next;
}
}
r=(Pointer)malloc(sizeof(GuestLink));//没有*号
r->next=NULL;
if(r==NULL)
{
printf("分配空间失败");
return;
}
if(q==NULL)//如果是空表,判断空表用q!!!!
*Head=r;
else
{
q->next=r;
}
r->number=in_number;
printf("请输入姓名:\n");
scanf("%s",r->name);
printf("请输入人数:\n");
scanf("%d",&r->sum);
printf("请输入时间:\n");
scanf("%s",r->time);
}
```
### 2.2.3 改进三
Nothing ORZ…
#### 2.2.3.1 改进方案
当我们建立链表的时候是把链表数据保存在内存里面,而删除之类操作内存还没有被释放,这样会增加电脑的内存占用,同时会增加能量的电脑能量消耗,这样不利于电脑的稳定工作,且浪费资源,这时我们就需要把那些没用的链表内存释放了。通过free(\*p)函数实现对内存的释放。
#### 2.2.3.2 具体实现
**删除一个订单只需要**
```c
void Delete(Pointer *Head)
{
int flag=1;
int number;
Pointer p,q;
printf("请输入要删除的数据编号:");
scanf("%d",&number);
p=q=*Head;
while(p!=NULL&&flag)
{
if(p->number==number)
{
if(p==*Head)
{
*Head=p->next;free(p);//删除结点后要及时释放内存!!!
}
else
{
q->next=p->next;
free(p);
}
flag=0;
}
else
{
q=p;
p=p->next;
}
}
if(flag)
printf("没有找到可以删除的数据!!");
}
```
#### 2.2.3.3 实现效果
**添加订餐客户信息**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/031c2442c480798e1c3aa088da0f19e1.writebug)
**按照客户时间升序排序**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/93dc8bacf3af7d34ec6b8ea111ae25e2.writebug)
**保存到文件**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/dd3c958e057f2ee158cdf1f887d8549a.writebug)
**查看文件信息**
![](http://www.writebug.com/myres/static/uploads/2021/10/19/733e2d3ef357867f0e8421bda0edb296.writebug)
# 3、总体小结
链表题考察了我们对于链表知识的理解,要求熟练掌握链表的建立,结点的插入,查找,删除,输出等方法。所以,着重复习了书本中关于链表的知识,以便能够更加好的完成程序。通过上一次课程设计的锻炼,对于本次课程设计的要求和内容偶遇了更加深的理解。通过本次课程设计,对链表的知识也有了进一步的掌握和理解。刚开始不够细心,在调试过程中遇到的问题,通过及时的查找书籍寻找答案,并根据所学知识,理清思路去解决,不断完善程序。在设计过程中,不断的通过与同学交流、上网找资料、查阅书籍等等方法,克服每一个难题,并与同学在讨论中增加了相互感情,扩大了自己的知识面,让一些以前不知道的,或者更加实用的方法得以用在自己的程序代码上。
通过这次课程设计,我了解到编程并不是那么的容易,也并不是那么多难,关键是需要有:
- 编程习惯
- 对算法的认知能力
- 语言掌握能力
除了对编程能力的认识外,我还知道了,C语言并不是那么的难,关键是看你怎样去了解代码,使用代码,让自己的程序更加的完善,对资源的利用更加的充分。
# 4、参考文献
[1] 陈显刚.c语言程序设计[M].北京:北京理工大学出版社,2007.
[2] 谭浩强.c语言程序设计[M].北京:清华大学出版社,1998.
[3] 徐新华.c语言程序设计教程[M].北京:中国水利水电出版社,2001.
[4] 伍一,等.c语言程序设计与实训教程[M].北京:清华大学出版社,2007.
[5] 徐翠霞. c语言程序设计案例教程[M].北京:北京大学出版社,2008.
[6] 徐卓群等.数据结构,高等教育出版社,1987.
[7] 陈小平.数据结构导论,经济科学出版社.2000.