查找链表c语言方案,【查找链表面试题】面试问题:C语言实现——… - 看准网...

这是一个C语言实现的学生信息管理系统,包括录入、查询、删除、修改和输出学生信息功能。程序通过链表数据结构存储学生数据,并支持根据学号或姓名进行操作。用户可以选择继续上次的输入或重新开始输入学生信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include

#include

#include

struct Student

{

char num[20]; //学号

char name[20]; //姓名

char sex[5]; //性别

char address[80]; //家庭住址

struct Student *next; //动态链表连接下一个 int *p 与上面对比 方便思考

};

struct Student *creat(struct Student *head0) //定义了一个返回值为结构体类型的指针变量

{

struct Student *head1, *p1, *p2, *t0, *t1;

int m, n = 1, h;

FILE *fp;

printf("请选择:");

printf("1.继续上次输入: 2.重新输入:");

scanf("%d",&h);

if (h==1)

{

if(head0 == NULL)

{

printf("\n\n上次无学生输入!!!\n");

return NULL;

}

t0 = head0;

while (t0 != NULL)

{

//printf("进入head循环");

//printf("学生学号:%s\t学生姓名:%s\t学生性别:%s\t学生家庭地址:%s\n", t->num, t->name, t->sex, t->address);

t1 = t0;

t0 = t0->next;

}

p1 = p2 = (struct Student*)malloc(1 * sizeof(struct Student));

if (p1 == NULL)

{

printf("内存开辟失败!\n");

return 0;

}

t1->next = p2;

printf("请输入学生学号:");

scanf("%s", p2->num);

printf("请输入学生姓名:");

scanf("%s", p2->name);

printf("请输入学生性别:");

scanf("%s", p2->sex);

printf("请输入学生家庭地址:");

scanf("%s", p2->address);

printf("结束请按 '0' 继续请按 '1' :"); //判断是否继续输入的标准

scanf("%d", &m);

printf(" t->name %s\n", t1->next->name);

while (m != 0)

{

printf("--------------------------已输入了 %d 名学生的信息-----------------------\n", n);

n = n + 1;

p1 = (struct Student*)malloc(1 * sizeof(struct Student));

if (p1 == NULL)

{

printf("内存开辟失败!\n");

return 0;

}

p2->next = p1;

p2 = p1;

printf("请输入学生学号:");

scanf("%s", (*p1).num);

printf("请输入学生姓名:");

scanf("%s", p1->name);

printf("请输入学生性别:");

scanf("%s", p1->sex);

printf("请输入学生家庭地址:");

scanf("%s", p1->address);

printf("结束请按 '0' 继续请按 '1' :");

scanf("%d", &m);

}

p1->next = NULL; //使链表最后一位的next指向为空

printf("--------------------------共输入了 %d 名学生的信息-----------------------\n", n);

return(head0); // 返回头

}

if (h==2)

{

head1 = p1 = p2 = (struct Student*)malloc(1 * sizeof(struct Student));

if (p1 == NULL)

{

printf("内存开辟失败!\n");

return 0;

}

printf("请输入学生学号:");

scanf("%s", p1->num);

printf("请输入学生姓名:");

scanf("%s", p1->name);

printf("请输入学生性别:");

scanf("%s", p1->sex);

printf("请输入学生家庭地址:");

scanf("%s", p1->address);

printf("结束请按 '0' 继续请按 '1' :"); //判断是否继续输入的标准

scanf("%d", &m);

while (m != 0)

{

printf("--------------------------已输入了 %d 名学生的信息-----------------------\n", n);

n = n + 1;

p1 = (struct Student*)malloc(1 * sizeof(struct Student));

if (p1 == NULL)

{

printf("内存开辟失败!\n");

return 0;

}

p2->next = p1;

p2 = p1;

printf("请输入学生学号:");

scanf("%s", (*p1).num);

printf("请输入学生姓名:");

scanf("%s", p1->name);

printf("请输入学生性别:");

scanf("%s", p1->sex);

printf("请输入学生家庭地址:");

scanf("%s", p1->address);

printf("结束请按 '0' 继续请按 '1' :");

scanf("%d", &m);

}

p2->next = NULL; //使链表最后一位的next指向为空

printf("--------------------------共输入了 %d 名学生的信息-----------------------\n", n);

head0 = head1;

return(head0); // 返回头

}

}

void find(struct Student *find1) // 查询信息

{

if(find1 == NULL)

{

printf("\n\n\n无学生信息!!!\n");

return ;

}

struct Student *p, *p1;

int f, o = 0, e = 0;

char a[20], x[20];

p = p1 = find1;

printf("1.按学号查询 2.按姓名查询\n");

printf("请选择查询方式:");

scanf("%d", &f);

if (f == 1)

{

printf("请输入学生学号:");

scanf("%s", a);

do

{

if (strcmp(a, p1->num) == 0)

{

o = 1;

printf("已找到的学生信息如下:\n");

printf("学号:%s\n姓名:%s\n性别:%s\n家庭地址:%s\n", p1->num, p1->name, p1->sex, p1->address); break;

}

p1 = p1->next;

} while (p1 != NULL);

if (o == 0) printf("未找到该同学\n ");

}

if (f == 2)

{

printf("请输入学生姓名:");

scanf("%s", x);

do

{

if (strcmp(x, p->name) == 0)

{

e = 1;

printf("已找到的学生信息如下:\n");

printf("学号:%s\n姓名:%s\n性别:%s\n家庭地址:%s\n", p->num, p->name, p->sex, p->address); break;

}

p = p->next;

} while (p != NULL);

if (e == 0) printf("未找到该同学\n");

}

}

struct Student *del(struct Student *del1) //删除程序

{

if(del1 == NULL)

{

printf("\n\n\n无学生信息!!!\n");

return 0;

}

struct Student *p, *p1, *p2, *p3;

int a, d = 0, e = 0;

char b[20], c[20];

printf("可根据以下方式进行删除:\n");

printf("1.学号 2.姓名\n请选择:");

scanf("%d", &a);

if (a == 1)

{

p = p1 = del1;

printf("请输入学生学号:");

scanf("%s", b);

do

{

if (strcmp(b, p->num) == 0 || p == del1)

{

d = 1;

del1 = del1->next;

printf("已删除!!!\n"); break;

}

if (strcmp(b, p->num) == 0)

{

d = 1;

p1->next = p->next;

printf("已删除!!!\n"); break;

}

p1 = p;

p = p->next;

} while (p != NULL);

if (d == 0) printf("未找到该同学\n");

}

if (a == 2)

{

p = p1 = del1;

printf("请输入学生姓名:");

scanf("%s", c);

do

{

if (strcmp(c, p->name) == 0 || p == del1)

{

e = 1;

del1 = del1->next;

printf("已删除!!!\n"); break;

}

if (strcmp(c, p->name) == 0)

{

e = 1;

p1->next = p->next;

printf("已删除!!!\n"); break;

}

p1 = p;

p = p->next;

} while (p != NULL);

if (e == 0) printf("未找到该同学\n");

}

if(del1 == NULL) printf("\n\n\n学生信息已删光!!!\n");

return (del1);

}

struct Student *change(struct Student *change1) //修改程序

{

if(change1 == NULL)

{

printf("\n\n\n无学生信息!!!\n");

return NULL;

}

struct Student *p, *p1;

int f, i, j, o = 0, q = 0;

char a[20], x[20];

p = p1 = change1;

printf("可查找的方式如下:");

printf("1.按学号 2.按姓名\n");

printf("请选择查找方式:");

scanf("%d", &f);

if (f == 1)

{

printf("请输入学生学号:");

scanf("%s", a);

while (p1 != NULL)

{

if (strcmp(a, p1->num) == 0)

{

o = 1;

printf("已找到的学生信息如下:\n");

printf("学号:%s\n姓名:%s\n性别:%s\n家庭地址:%s\n", p1->num, p1->name, p1->sex, p1->address);

printf("可修改的选项如下:");

printf("1.学号 2.姓名 3.性别 4.家庭地址 \n");

printf("请输入选择的选项:");

scanf("%d", &i);

switch (i)

{

case 1:printf("请输入修改后的学号:"); scanf("%s", (*p1).num); printf("已修改!!!\n"); break;

case 2:printf("请输入修改后的姓名:"); scanf("%s", (*p1).name); printf("已修改!!!\n"); break;

case 3:printf("请输入修改后的性别:"); scanf("%s", (*p1).sex); printf("已修改!!!\n"); break;

case 4:printf("请输入修改后的家庭地址:"); scanf("%s", (*p1).address); printf("已修改!!!\n"); break;

default:printf("输入有误,请重新输入:\n"); break;

}

}

p1 = p1->next;

}

if (o == 0) printf("未找到该同学\n ");

}

if (f == 2)

{

printf("请输入学生姓名:");

scanf("%s", x);

do

{

if (strcmp(x, p->name) == 0)

{

q = 1;

printf("已找到的学生信息如下:\n");

printf("学号:%s\n姓名:%s\n性别:%s\n家庭地址:%s\n", p->num, p->name, p->sex, p->address);

printf("可修改的选项如下:");

printf("1.学号 2.姓名 3.性别 4.家庭地址 \n");

scanf("%d", &i);

switch (i)

{

case 1:printf("请输入修改后的学号:"); scanf("%s", (*p1).num); printf("已修改!!!\n"); break;

case 2:printf("请输入修改后的姓名:"); scanf("%s", (*p1).name); printf("已修改!!!\n"); break;

case 3:printf("请输入修改后的性别:"); scanf("%s", (*p1).sex); printf("已修改!!!\n"); break;

case 4:printf("请输入修改后的家庭地址:"); scanf("%s", (*p1).address); printf("已修改!!!\n"); break;

default:printf("输入有误,请重新输入:\n"); break;

}

}

p = p->next;

} while (p != NULL);

if (q == 0) printf("未找到该同学\n");

}

return (change1);

}

void put(struct Student *put1) //输出信息

{

if(put1 == NULL)

{

printf("\n\n\n无学生信息!!!\n");

return ;

}

struct Student *t;

t = put1;

do

{

printf("学生学号:%s\t学生姓名:%s\t学生性别:%s\t学生家庭地址:%s\n", t->num, t->name, t->sex, t->address);

t = t->next;

} while (t != NULL);

//printf("输出无问题");

printf("\n\n\n");

}

void write(struct Student *p0) //写入文件

{

int m = 0, n = 0;

//printf("\n本次无新学生信息存储!!!\n");

FILE *fp;

if(p0 == NULL)

{

printf("\n\n\n存储信息为空!!!\n");

if ((fp = fopen("stu.dat", "wb+")) == NULL)

{

printf("\n\n\n删除存储文件失败!!!\n");

exit(0);

}

return;

}

if ((fp = fopen("stu.dat", "wb+")) == NULL)

{

printf("\n\n\n文件打开失败!!!\n");

return;

}

do

{

if ((fwrite(p0, sizeof(struct Student), 1, fp) != 1)) printf("\n\n\n文件写入失败!!!\n");

else n++;

p0 = p0->next;

m++;

} while (p0 != NULL );

printf("\n\n\n应写入%d名学生信息,已写入%d名学生的信息!!!\n", m, n);

fclose(fp);

}

struct Student *read() // 读取链表

{

//printf("\n本次读取学生信息!!!\n");

struct Student *p0, *p1, *head;

FILE *fp;

if ((fp = fopen("stu.dat", "rb+")) == NULL)

{

printf("\n\n\n文件打开失败!!!\n");

return NULL;

}

rewind(fp);

head = p0 = p1 = (struct Student*)malloc(1 * sizeof(struct Student));

if (p1 == NULL)

{

printf("内存开辟失败!\n");

return 0;

}

do

{

//p0=p2->next;

p1->next = p0;

p1 = p0;

if ((fread(p1, sizeof(struct Student), 1, fp) != 1))

{

printf("\n\n\n文件为空,请先存入信息再读取!!!\n\n\n");

return NULL;

}

//else

//{

//printf("学生学号:%s\t学生姓名:%s\t学生性别:%s\t学生家庭地址:%s\n", p2->num, p2->name, p2->sex, p2->address);

//}

p0 = (struct Student*)malloc(1 * sizeof(struct Student));

if (p0 == NULL)

{

printf("内存开辟失败!\n");

return 0;

}

} while (p1->next != NULL );

p1->next = NULL;

free(p0);

fclose(fp);

//put(head);

return head;

}

int choose(struct Student *p1) //功能菜单选择

{

struct Student *head;

int i;

p1 = NULL;

head = NULL;

printf("\n\n\t ****************欢迎使用学生信息管理系统**************\n\n");

printf("\n\t\t*----------------|可选择的操作类型如下|--------------*\n\t\t*\t\t\t\t\t\t *\n");

printf("\t\t*\t1.录入学生信息 \t2.查询学生信息\t *\n\t\t*\t\t\t\t\t\t *\n\t\t*\t3.删除学生信息 \t4.修改学生信息\t *\n\t\t*\t\t\t\t\t\t *\n\t\t*\t5.输出学生信息 \t6.结束管理系统\t *\n\t\t*\t\t\t\t\t\t *\n");

printf("\t\t*----------------------------------------------------*");

printf("\n\t\t\t 请输入所选择的操作:");

scanf("%d", &i);

printf("\t\t\t ----------------------\n");

switch (i)

{

case 1:printf("现在开始输入:\n"); head = read(); head = creat(head);write(head); break;

case 2:printf("现在开始查询:\n"); head = read(); find(head); break;

case 3:printf("现在开始删除:\n"); head = read(); head = del(head); write(head); break;

case 4:printf("现在开始修改:\n"); head = read(); head = change(head); write(head); break;

case 5:printf("现在开始输出:\n"); head = read(); put(head); break;

case 6:printf("结束系统!!! \n"); return 0;

default:printf("输入有误,请重新输入:\n"); break;

}

return 1;

}

int main()

{

struct Student *p1 = NULL;

while(choose(p1))

{

//choose(); // 进行功能的选择

//read(); //读取链表

//put(head); // 将链表输出

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值