从今天起开始数据结构系列的分享,今天分享的是单链表。 单链表大概是大概是每个数据结构初学者的必经之路,下面结合一个小小的工程 来深入学习单链表的使用–简易客户管理系统。 ps:如果还不清楚
顺晟科技
2021-06-16 10:48:01
171
从今天开始,我们将共享数据结构系列,今天我们将共享单一链表。
对于每个数据结构的初学者来说,单一链表可能是的方法。这是一个小项目
深入研究使用单链表-简单客户管理系统。
Ps:如果你不知道单链表是什么,你的合作伙伴会自行百度,这里就不赘述了
#项目结构
添加、删除、更改和检查、添加、删除和更改这三个部分还包括将更改的信息写入文件的操作
#代码编写
# #项目基本代码
俗话说“高楼平地起”,先写项目的预定义代码部分,主要是头文件
包括结构定义、全局变量定义等
# # #头文件包含
# includesdio.h//c程序基础库
#includestdlib.h //包含函数exit()
#includestring.h //包含函数strcmp()
# # #结构定义
typedef结构项{
char name[20];//保存客户名称
char性别[20];//保存客户性别
int age//保存客户年龄
char tel[20];//保存客户号
}客人;
关于结构定义就不多说了,这里typedef.guest表示别名结构项,即,
结构项相当于此源文件中的来宾
typedef结构节点{
访客数据;//数据字段
下一个结构节点;//指针字段
}链接;
这里将指针别名为结构节点
# # #全局变量定义
链接T;//头部指针
这个头指针T是整个系统的索引,六个模块共用。虽然有一个尽可能少定义全局变量的原则,但是在这里,
全局变量t可以避免函数间复杂的参数传递问题,牺牲空间换取运行时间的减少;
同时,注意我后面T的初始化代码
//初始化头指针
t=(link)malloc(sizeof(struct node));
T-next=空;
这里没有t的数据字段。T不是存储客户信息的个节点指针,但是T-next是初始化头指针
当时没有添加存储客户信息的节点,所以T-next=NULL;这是一个程序员应该养成的好习惯;为
为什么不给T安排一个数据字段?这里主要考虑删除模块的编写。我们知道要删除一个节点,我们必须首先
求这个节点的前指针p和后指针q,然后p-next=q-next;如果t被分配了一个数据字段,
t的前兆是什么?即使不使用我上面提到的删除逻辑,也要使用if.其他.语句和另一组逻辑
删除t后,代码明显更复杂。
# #项目核心代码
# # #首先,加载文件
代码如下
void init() {
链接p,s;
FILE * fp
int I=0;
s=p=(link)malloc(sizeof(struct node));
p-next=NULL;
if((fp=fopen("1.txt "," r ")==NULL){
printf("加载错误!");
出口(1);
}
while(!feof(fp)) {
fscanf(fp," %s\t%s\t%d\t%s\t\n ",p-data.name,p-data.gender,p-data.age,p-data . tel);
I;
if(i!=1) {
s-next=p;
s=p;
}
else{
t-next=p;
}
p=(link)malloc(sizeof(struct node));
p-next=NULL;
}
Printf("总人数=====% d \ n ",I);
if(fclose(fp)) {
printf("无法关闭文件!\ n ");
出口(1);
}
}
引入代码逻辑,新建内存空间,指向S和P,打开文件。如果文件指针没有到达文件的末尾,请将
从文件中读取的客户信息被分配给P的数据字段。如果读取了个客户信息,则将P指向的节点连接到头部
指针T之后,否则将P连到S,因为此时S是P的前驱指针。连接成功后,P将被分配给S,P将
指向新打开的节点…
插图:
# # #第二,增加客户
代码如下:
//添加
void create() {
链接p,s;
FILE * fp
int yn
s=T;
while(s-next!=NULL) {
s=s-next;
}
do {
p=(link)malloc(sizeof(struct node));
Printf("请输入客户名称:\ n ");
scanf("%s ",p-data . name);
Printf("请输入客户性别:\ n ");
scanf("%s ",p-data . gender);
Printf("请输入客户年龄:\ n ");
scanf("%d ",p-data . age);
Printf("请输入客户联系信息:\ n ");
scanf("%s ",p-data . tel);
p-next=NULL;
s-next=p;
s=p;
if((fp=fopen("1.txt "," at ")==NULL){
printf("写错误!\ n ");
退出(0);
}
printf("写了一次\ n ");
fprintf(fp," %s\t%s\t%d\t%s\n ",p-data.name,p-data.gender,p-data.age,p-data。电话);
if(fclose(fp)) {
printf("无法关闭文件!\ n ");
退出(0);
}
printf("添加成功!\ n ");
printf("是否继续添加请输入0或1:");
scanf("%d ",yn);
} while(yn);
}
代码逻辑很简单,新增结点,并连在尾节点后面,同时写入文件,如果前一片代码看懂了,这不是什么
大问题…
###三、删除客户
代码如下
//删除
int del() {
链接p,q;
文件* fp
char mod[25];
printf("请输入需要删除的客户名称: \ n ");
scanf("%s ",mod);
p=T;
while(p-next!=NULLstrcmp(p-next-data.name,mod)!=0)
p=p-next;
if(p-next==NULL) {
printf("并无此人!\ n ");
返回0;
}
q=p;
p=p-next;
q-next=p-next;
删除(p);
printf("删除成功!\ n ");
if((fp=fopen("1.txt "," wt ")==NULL){
printf("错误!\ n ");
退出(0);
}
p=T-next;
while(p!=NULL) {
printf("%s ",p-data。姓名);
fprintf(fp," %s\t%s\t%d\t%s\t\n ",p-data.name,p-data.gender,p-data.age,p-data。电话);
p=p-next;
}
if(fclose(fp)) {
printf("无法关闭文件!\ n ");
出口(1);
}
}
模块三、四、五、六道理类似,不再赘述