
正文
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(sHead sHead-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;
}
相关问答
Q1: 查找链表中是否存在学生姓名,并显示这个链表的所有信息, 若没有这个学生则插入新链表?
修改后的代码如下:(主要修改见注释)
另外我将scanf_s改为了scanf,若需要你可再改回来
#includestdio.h
#includestdlib.h
#includestring.h
#define N 12
struct person {
int id;
char* name;
int age;
int eng;
//int avg; 平均值不用记录在每个人的信息中
struct person *p;
};
struct person* head = NULL;
int length; //链表的长度
int getAverage(struct person* root);
void nameSearch(struct person* root);
void engSearch(struct person* root);
void stuSearch(struct person* root);
void stuInsert();
int main() {
struct person
p1 = { 01,"xiaozhan",23,75 },
p2 = { 02,"wangyibo",22,79 },
p3 = { 03, "suoer",24,90 },
dummyHead; // 虚拟头节点
p1.p = p2;
p2.p = p3;
p3.p = NULL;
head = dummyHead; // head指针指向虚拟头节点
head-p = p1; // 方便插入新节点
struct person* pp;
pp = p1;
//int a = 0;
while (pp) {
printf("%02d,%s,%d,%d\n", pp-id, pp-name, pp-age, pp-eng);
pp = pp-p;
length++; // 记录链表长度
}
printf("%d\n", getAverage(p1));
nameSearch(p1);
engSearch(p1);
stuSearch(p1);
stuInsert();
return 0;
}
int getAverage(struct person* root) {
int sum = 0;
int number = 0;
while (root) {
sum += root-eng;
number++;
root = root-p;
}
return sum / number; // 也可用现成的length, sum/length
}
void nameSearch(struct person* root) {
char name[20];
printf("输入姓名:");
gets(name);
while (root != NULL) {
if (strcmp(root-name, name) == 0) {
printf("学号为%02d的学生: 姓名为%s, 年龄为%d, 英语成绩为%d\n", root-id, root-name, root-age, root-eng);
return;
}
root = root-p;
}
printf("未找到姓名为%s的学生\n", name);
}
void engSearch(struct person* root) {
int min;
int max;
printf("输入最小值:");
scanf("%d", min);
printf("输入最大值:");
scanf("%d", max);
int i;
for (i = 0; i length; i++) { // 把3改为length可适配其他节点数的情况
if (root-eng = min root-eng = max ) {
printf("姓名为%s的学生英语成绩在这个区间\n",root-name);
}
root = root-p;
}
}
void stuSearch(struct person* root) {
int num;
//root = root-p; // 若输入为虚拟头节点则需要移动到头节点,否则不需要
printf("需要查找的学生学号为:");
scanf("%d", num);
while (root != NULL) {
if (root-id == num) {
printf("学号为%02d的学生的信息如下:\n", num);
printf("%02d %s %d %d\n", root-id, root-name, root-age, root-eng);
return;
}
root = root-p;
}
if (root == NULL)
printf("无此记录!\n");
return;
}
void stuInsert() {
int num, i;
struct person* root, * q;
root = head;
printf("请输入你要插入位置:");
scanf("%d", num);
if (num length) {
printf("找不到要插入的位置!\n");
return;
}
else {
printf("请输入你要插入的学生的学号、姓名、年龄、成绩信息:\n");
q = (struct person*)malloc(sizeof(struct person));
q-name = (char *)malloc(50 * sizeof(char)); // name为指针,还要开辟足够的空间来储存输入的字符串
scanf("%d %s %d %d", q-id, q-name, q-age, q-eng);
while (root != NULL) {
if (root-id == q-id) {
printf("该学号已经存在,无法插入!\n");
return;
}
root = root-p;
}
root = head;
for (i = 0; i num; i++)
root = root-p;
q-p = root-p; // q插入到root之后,root-p之前
root-p = q;
length++;
printf("插入成功!插入后的链表为:\n");
q = head-p;
while (q != NULL) {
printf("%02d,%s,%d,%d\n", q-id, q-name, q-age, q-eng);
q = q-p;
}
return;
}
}
运行结果如下:
可见成功完成了所需的功能,望采纳~
Q2: 建立一个动态链表,链表中每一结点包括:学号、姓名、性别、年龄、成绩。( 很急的谁帮帮我??)
2、#includestdio.h
#includestdlib.h
#includeconio.h
/*定义结构体*/
struct student
{
int num;
float score;
struct student *next;
};
/*创建一个只有头结点的空链表*/
struct student *create_head()
{
struct student *head;
head=(struct student*)malloc(sizeof (struct student) );
if(head==NULL) //小心别漏这个
{
printf("申请头结点失败!\n");
return NULL;
}
head-next=NULL;
return head;
}
/*将s指向的结点插入链表,使链表保持升序,并返回头结点*/
struct student *insert(struct student *head,struct student *s)
{
struct student *p=head;
while(p-next!=NULLs-scorep-next-score)//特别注意左右不能写反,若s最大,最后p-next=NULL,p-next-score运行出错
p=p-next;
if(p-next==NULL) //s-score最大的情况 //其实两种情况可以并在一块写
{
p-next=s; //连接结点
s-next=NULL; //p-next就等于NULL
}
else
{
p-next=s; //连接结点
s-next=p-next;
}
return head ;
}
/*查找符合条件的结点,并返回指向该结点的指针*/
struct student *search(struct student *head)
{
struct student *p=head-next;
int num;
printf("请输入要查找学生的学号:\n");
scanf("%d",num);
while(p!=NULLp-num!=num) //特别注意两条件不能写反,若写反最后p指向NULL时p-num找不到 运行出错
p=p-next;
if(p==NULL) //特别注意两个if不能调换,若调换最后p指向NULL时p-num运行出错
{
printf("找不到符合条件的结点!!!");
return NULL; //查找不到返回空指针
}
if(p-num==num)
{
printf("找到符合条件的结点\n该结点为%d\t%f",p-num,p-score);
return p; //返回查找到的指针
}
}
/*输出链表各结点的值,也称对链表的遍历*/
void print(struct student *head)
{
struct student *p;
printf(" 链表如下: \n");
p=head-next;
while(p!=NULL)
{
printf("%d\t%.1f\n",p-num,p-score);
p=p-next;
}
}
/*释放链表*/
void free_list(struct student *head)
{
struct student *p=head ;
printf("释放链表:\n");
while(p!=NULL)
{
head=head-next;
free(p);
p=head;
}
printf("释放链表成功!\n");
}
/*删除链表中值为num的结点,并返回链表的首指针*/
struct student *delete_note(struct student *head,int num_x)
{
struct student *p1=head-next , *p2=head ;
while(p1!=NULLp1-num!=num_x) //特别注意左右条件不能调换,若调换如果p1指向NULL时p1-num运行出错
{
p2=p1;
p1=p1-next;
}
if(p1==NULL) //特别注意两个if不能调换,若调换如果p1指向NULL时,p1-num运行出错
printf("找不到符合删除要求的结点!!!\n");
if(p1-num==num_x)
{
p2-next=p1-next;
free(p1);
printf("结点删除成功!\n");
}
return head;
}
/*完整的有头结点链表操作程序*/
void main()
{
struct student *p , *head ;
char c;
int num ;
float score ;
printf("有头结点链表操作程序:\n");
head=create_head();
while(1)
{
printf("I:插入结点(自动升序) P:输出链表 S:查找结点 D:删除结点 E:释放链表并退出程序! ");
c=getch();
switch(c)
{
case'I':
printf("请分别输入要插入学生的学号和分数:\n");
scanf("%d%f",num,score);
p=(struct student*)malloc( sizeof(struct student) );
if(p==NULL)
{
printf("申请该结点失败!!!\n");
exit (0) ;
}
p-num=num; p-score=score; //给p赋值
insert(head,p);
printf("插入成功!\n");
break;
case'P':
print(head);
break;
case'S':
search(head);
break;
case'D':
printf("请输入要删除的学生的学号:\n");
scanf("%d",num);
delete_note(head,num);
break;
case'E':
free_list(head);
exit (0);
}
}
}
Q3: 建立一个学生信息链表,每个结点包括:学号、姓名、成绩。实现链表的建立、显示和查询。查询是指输入一个
⑴提示 采用动态分配内存,。由于结点结构中包含两三个域,可以采用C语言中的结构体类型实现。 struct Node //定义一个结点结构类型 { long num; char name[10]; float score; struct Node *next; };⑵要求l 在程序中定义go语言链表如果学号存在了三个函数go语言链表如果学号存在:void init(); //初始化链表void create(); //创建学生成绩信息链表void disp(); //输出链表信息l 定义一个查询函数void search(int number),其中,参数是学生的学号。如果链表中存在该学号的的结点,则显示此结点的数据,否则输出没有该学号的结点。l 定义一个删除函数void del(int number),用于删除指定学号的结点。
Q4: c语言系统里学号重复录入信息时怎么解决链表
1、首先需要一个遍历指针t指向当前遍历到的节点go语言链表如果学号存在,然后定义两个指针分别为p1和p2go语言链表如果学号存在,p1指向t所指向的节点go语言链表如果学号存在,而p2指向此时p1的下一个节点。
2、其次p2指向节点的值与p1的相同,那么直接让p1的next跳过p2指向p2的next即可。
3、最后会存在相邻很多个元素都相等,可以加一个循环,一次性删除多个和p1指向的节点的值相等的节点。
go语言链表如果学号存在的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于golang链表介绍、go语言链表如果学号存在的信息别忘了在本站进行查找喔。







