18910140161

数据结构之单链表

顺晟科技

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);

}

}

模块三、四、五、六道理类似,不再赘述

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航