供参考!谢谢!希望对你有帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stu_info
{
char stu_num[10]; //学号
char stu_name[8]; //姓名
char stu_sex[2]; //性别
int stu_score; //成绩
struct stu_info *next;
} stu;
void menu(void)
{
puts("");
printf("====================================\n");
printf(" 1->插入新的学生信息\n");
printf(" 2->删除指定学生信息\n");
printf(" 3->根据学号查询学生信息\n");
printf(" 0->退出\n");
printf("====================================\n");
puts("请选择对应序号实现相关功能:");
}
//插入学生信息 head为头结点
void insert(stu *head)
{
/*
注意:
要插入的位置从1算起
若链表为空直接作为第一个结点
若链表长度小于要插入的位置则直接插到末尾
其它情况正常插入对应的位置
*/
size_t index;
stu *p = head->next, *pre = head;
stu *node = malloc(sizeof(stu));
if (!node)
return;
puts("输入插入位置:");
scanf("%zd", &index);
puts("\n依次输入学号、姓名、性别、成绩\n彼此用空格隔开:");
scanf("%9s%7s%1s%d", node->stu_num, node->stu_name, node->stu_sex, &node->stu_score);
while (p && index--)
{
p = p->next;
pre = pre->next;
}
if (!p)
{
pre->next = node;
node->next = NULL;
}
else
{
node->next = p->next;
p->next = node;
}
}
//删除指定学生信息
void delNode(stu *head)
{
char s[13];
puts("请输入待删除学生的姓名:");
scanf("%12s", s);
stu *p = head->next, *pre = head;
while (p)
{
if (strcmp(p->stu_name, s) == 0)
{
pre->next = p->next;
free(p);
puts("\n删除成功!");
return;
}
pre = pre->next;
p = p->next;
}
puts("\n链表是空的/删除失败/查无此人");
}
//根据学号查并显示学生信息
void findNode(stu *head)
{
char s[10];
puts("请输入学号:");
scanf("%9s", s);
stu *p = head->next;
while (p)
{
if (strcmp(p->stu_num, s) == 0)
{
printf("%s %s %s %d\n", p->stu_num, p->stu_name, p->stu_sex, p->stu_score);
return;
}
p = p->next;
}
puts("\n链表是空的/查无此人");
}
int main(void)
{
//创建头结点
stu *head = (stu *)malloc(sizeof(stu));
head->next = NULL;
int i;
while (1)
{
menu();
scanf("%d", &i);
switch (i)
{
case 1:
insert(head);
break;
case 2:
delNode(head);
break;
case 3:
findNode(head);
break;
case 0:
exit(0);
default:
break;
}
getchar();
getchar();
system("cls");
}
return 0;
}