go语言链表如果学号存在 golang链表介绍

c语言录入文件信息时如何确定某一学号的人已存在思路:
1、用变量接收输入 。
2、读取文件内容到内存中(比如用链表保存) 。
3、循环遍历内存数据 , 对比输入的值 , 存在相同则表示已存在 。
下面代码是我写得演示:
#include stdio.h
#include stdlib.h
#include malloc.h
#include windows.h
#define P "C:\\1.txt"
typedef struct stu_info
{
int sNum;// 学号
char name[20];//姓名
struct stu_info *next;
}SINFO;
int insert2File(char path[]);// 向文件末尾插入一条学生信息
SINFO * selectALLFILE(char path[]);//只读模式打开文本,获取信息, 返回信息链表头节点(该函数单独调用的话 , 记得调用freeSINFOS释放内存)
int checkSN(SINFO sinfo,char path[]);//检查路径下文件中,学号是否存在,存在返回1,否则返回0
int freeSINFOS(SINFO *sHead);//释放链表内存
void showSINFOS(SINFO *sHead);//打印链表信息
int main()
{
SINFO *sHead=NULL;
while(1)
{
sHead=selectALLFILE(P);
showSINFOS(sHead);
insert2File(P);
free(sHead);
sHead=NULL;
printf("按任意键继续录入 。。。\n"),getchar();
system("cls");
}
return 0;
}
void showSINFOS(SINFO *sHead)
{
printf("当前从文件加载到内存中的信息为:\n");
if(sHeadsHead-next)
while(sHead-next)
{
printf("学号:%d姓名:%s\n",sHead-next-sNum,sHead-next-name);
sHead=sHead-next;
}
}
int insert2File(char path[])
{
SINFO sinfo;
FILE *fp=NULL;
if(!(fp=fopen(path,"at+")))return 0;
printf("请输入要插入的学生信息:\n");
printf(" 学号:"),scanf("%d",sinfo.sNum);
printf(" 姓名:"),scanf("%s",sinfo.name),getchar();
if(checkSN(sinfo,path))
{
printf("当前学号已存在!新增失败!\n");
return 0;
}
fprintf(fp,"%d %s\n",sinfo.sNum,sinfo.name);
fclose(fp);
printf("新增信息插入成功!\n");
return 1;
}
SINFO *selectALLFILE(char path[])//查询文件
{
SINFO *sHead=NULL,*sTail=NULL,*sNew=NULL,sTemp;
FILE *fp=NULL;
if(!(fp=fopen(path,"rt"))) return NULL;
fseek(fp,0,SEEK_SET);
sHead=(SINFO *)malloc(sizeof(SINFO));
if(!sHead)return NULL;
sHead-next=NULL;
while(fscanf(fp,"%d %s\n",sTemp.sNum,sTemp.name)!=-1)
{
sNew=(SINFO *)malloc(sizeof(SINFO));
if(!sNew)return NULL;
sNew-next=NULL;
sNew-sNum=sTemp.sNum;
sprintf(sNew-name,"%s",sTemp.name);
if(!sHead-next)
sHead-next=sNew;
else
sTail-next=sNew;
sTail=sNew;
}
fclose(fp);
return sHead;
}
int checkSN(SINFO sinfo,char path[])//检查学号是否存在,存在返回1 , 否则返回0
{
SINFO *sHead=NULL;
sHead=selectALLFILE(path);
if(!sHead) return 0;
if(!sHead-next) {freeSINFOS(sHead);return 0;}
while(sHead-next)
{
if(sinfo.sNum==sHead-next-sNum) return 1;
sHead=sHead-next;
}
freeSINFOS(sHead);
return 0;
}
int freeSINFOS(SINFO *sHead)
{
SINFO *sTemp=NULL;
if(!sHead)return 1;
while(sHead-next)
{
sTemp=sHead-next-next;
free(sHead-next);
sHead-next=sTemp;
}
free(sHead);
return 1;
}
查找链表中是否存在学生姓名 , 并显示这个链表的所有信息,若没有这个学生则插入新链表?修改后的代码如下:(主要修改见注释)
另外我将scanf_s改为了scanf,若需要你可再改回来
#includestdio.h
#includestdlib.h
#includestring.h
#define N 12
struct person {