题目要求
程序设计要求:
struct stu_info
{
char stu_num[10]; //学号
char stu_name[8]; //姓名
char stu_sex[2]; //性别
int stu_score //成绩
struct stu_info *next;
};
(1)插入新的学生信息(插入节点的位置可任意指定)
(2)删除指定的学生信息
(3)根据学号查询并显示查询到的学生信息
(4)以上三项任务分别自定义函数实现,执行后显示执行结果
(5)程序运行后要求可以循环执行前三项操作,直到选择退出时结束程序
供参考!谢谢!希望对你有帮助。
#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;
}
#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_info;
//初始化带头结点链表
stu_info *inti()
{
stu_info * head=(stu_info*)malloc(sizeof(stu_info));
head->next=NULL;
return head;
}
// 插入新的学生信息
//p为原链表,add表示新元素要插入的位置
stu_info * insertElem(stu_info * p,int add) {
int i;
stu_info * temp = p;//创建临时结点temp
//首先找到要插入位置的上一个结点
for (i = 1; i < add; i++) {
temp = temp->next;
if (temp == NULL) {
printf("插入位置无效\n");
return p;
}
}
//创建插入结点c
stu_info * c = (stu_info*)malloc(sizeof(stu_info));
printf("请输入学号:");
scanf("%s",c->stu_num);
printf("请输入姓名:");
scanf("%s",c->stu_name);
printf("请输入性别:");
scanf("%s",c->stu_sex);
printf("请输入成绩:");
scanf("%d",c->stu_score);
//向链表中插入结点
c->next = temp->next;
temp->next = c;
return p;
}
// 删除指定的学生信息
//p为原链表,add为要删除元素的下标
stu_info * delElem(stu_info * p, int add) {
stu_info * temp = p;
//遍历到被删除结点的上一个结点
for (int i = 1; i < add; i++) {
temp = temp->next;
if (temp->next == NULL) {
printf("没有该结点\n");
return p;
}
}
stu_info * del = temp->next;//单独设置一个指针指向被删除结点,以防丢失
temp->next = temp->next->next;//删除某个结点的方法就是更改前一个结点的指针域
free(del);//手动释放该结点,防止内存泄漏
return p;
}
// 根据学号查询并显示学生信息
void find_student(stu_info* head,char stu_num[])
{
stu_info *t = head;
//由于头节点的存在,因此while中的判断为t->next
while (t->next) {
t=t->next;
if (strcmp(t->stu_num,stu_num)==0){
printf("学号: %s 姓名: %s 性别: %s 成绩: %d\n", t->stu_num, t->stu_name, t->stu_sex, t->stu_score);
return ;
}
}
printf("未找到学生信息\n");
return;
}
int main()
{ stu_info *head;
//初始化
head=inti();
// 循环执行操作直到选择退出
int choice,pos,result=1;
char stu_num[10];
printf("1. 插入学生信息\n");
printf("2. 删除学生信息\n");
printf("3. 查询学生信息\n");
printf("4. 退出\n");
for(;;)
{
printf("请输入你的选择: ");
scanf("%d", &choice);
switch (choice)
{
case 1:
{
// 插入学生信息head
printf("请输入插入的位置: ");
scanf("%d", &pos);
head=insertElem(head,pos);
break;
}
case 2:
{
// 删除学生信息
printf("请输入删除的位置: ");
scanf("%d", &pos);
head=delElem(head,pos);
break;
}
case 3:
{
// 查询学生信息
printf("请输入学号: ");
scanf("%s", stu_num);
find_student(head,stu_num);
break;
}
case 4:
// 退出
result=0;
break;
default:
printf("非法输入,请重新输入\n");
break;
}
if(result==0){break;}
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu_info
{
char stu_num[10]; // 学号
char stu_name[8]; // 姓名
char stu_sex[2]; // 性别
int stu_score; // 成绩
struct stu_info *next;
};
// 定义链表的头节点
struct stu_info *head = NULL;
// 插入新的学生信息
void insert_student(struct stu_info *new_node, int pos)
{
// 如果 pos 为 0,插入到头节点之后
if (pos == 0)
{
new_node->next = head;
head = new_node;
return;
}
// 找到要插入的位置
struct stu_info *p = head;
int i;
for (i = 0; i < pos - 1 && p != NULL; i++)
p = p->next;
// 如果找到了要插入的位置,就插入
if (p != NULL)
{
new_node->next = p->next;
p->next = new_node;
}
}
// 删除指定的学生信息
void delete_student(int pos)
{
// 如果 pos 为 0,删除头节点
if (pos == 0)
{
struct stu_info *p = head;
head = head->next;
free(p);
return;
}
// 找到要删除的位置
struct stu_info *p = head;
int i;
for (i = 0; i < pos - 1 && p != NULL; i++)
p = p->next;
// 如果找到了要删除的位置,就删除
if (p != NULL && p->next != NULL)
{
struct stu_info *q = p->next;
p->next = q->next;
free(q);
}
}
// 根据学号查询并显示学生信息
void find_student(char *stu_num)
{
struct stu_info *p = head;
while (p != NULL && strcmp(p->stu_num, stu_num) != 0)
p = p->next;
// 如果找到了学生信息,就显示
if (p != NULL)
printf("学号: %s 姓名: %s 性别: %s 成绩: %d\n", p->stu_num, p->stu_name, p->stu_sex, p->stu_score);
else
printf("未找到学生信息\n");
}
int main()
{
// 循环执行操作直到选择退出
int choice;
do
{
printf("1. 插入学生信息\n");
printf("2. 删除学生信息\n");
printf("3. 查询学生信息\n");
printf("4. 退出\n");
printf("请输入你的选择: ");
scanf("%d", &choice);
switch (choice)
{
case 1:
{
// 插入学生信息
struct stu_info *new_node = (struct stu_info *)malloc(sizeof(struct stu_info));
printf("请输入学生信息(学号 姓名 性别 成绩): ");
scanf("%s%s%s%d", new_node->stu_num, new_node->stu_name, new_node->stu_sex, &new_node->stu_score);
int pos;
printf("请输入插入的位置: ");
scanf("%d", &pos);
insert_student(new_node, pos);
break;
}
case 2:
{
// 删除学生信息
int pos;
printf("请输入删除的位置: ");
scanf("%d", &pos);
delete_student(pos);
break;
}
case 3:
{
// 查询学生信息
char stu_num[10];
printf("请输入学号: ");
scanf("%s", stu_num);
find_student(stu_num);
break;
}
case 4:
// 退出
break;
default:
printf("输入有误,请重新输入\n");
break;
}
} while (choice != 4);
return 0;
}
仅供参考,望采纳,谢谢。
望采纳!!点击该回答右侧的“采纳”按钮即可采纳!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu_info
{
char stu_num[10]; // 学号
char stu_name[8]; // 姓名
char stu_sex[2]; // 性别
int stu_score; // 成绩
struct stu_info *next;
};
// 定义链表的头节点
struct stu_info *head = NULL;
// 插入新的学生信息
void insert_student(struct stu_info *new_node, int pos)
{
// 如果 pos 为 0,插入到头节点之后
if (pos == 0)
{
new_node->next = head;
head = new_node;
return;
}
// 找到要插入的位置
struct stu_info *p = head;
int i;
for (i = 0; i < pos - 1 && p != NULL; i++)
p = p->next;
// 如果找到了要插入的位置,就插入
if (p != NULL)
{
new_node->next = p->next;
p->next = new_node;
}
}
// 删除指定的学生信息
void delete_student(int pos)
{
// 如果 pos 为 0,删除头节点
if (pos == 0)
{
struct stu_info *p = head;
head = head->next;
free(p);
return;
}
// 找到要删除的位置
struct stu_info *p = head;
int i;
for (i = 0; i < pos - 1 && p != NULL; i++)
p = p->next;
// 如果找到了要删除的位置,就删除
if (p != NULL && p->next != NULL)
{
struct stu_info *q = p->next;
p->next = q->next;
free(q);
}
}
// 根据学号查询并显示学生信息
void find_student(char *stu_num)
{
struct stu_info *p = head;
while (p != NULL && strcmp(p->stu_num, stu_num) != 0)
p = p->next;
// 如果找到了学生信息,就显示
if (p != NULL)
printf("学号: %s 姓名: %s 性别: %s 成绩: %d\n", p->stu_num, p->stu_name, p->stu_sex, p->stu_score);
else
printf("未找到学生信息\n");
}
int main()
{
// 循环执行操作直到选择退出
int choice;
do
{
printf("1. 插入学生信息\n");
printf("2. 删除学生信息\n");
printf("3. 查询学生信息\n");
printf("4. 退出\n");
printf("请输入你的选择: ");
scanf("%d", &choice);
switch (choice)
{
case 1:
{
// 插入学生信息
struct stu_info *new_node = (struct stu_info *)malloc(sizeof(struct stu_info));
printf("请输入学生信息(学号 姓名 性别 成绩): ");
scanf("%s%s%s%d", new_node->stu_num, new_node->stu_name, new_node->stu_sex, &new_node->stu_score);
int pos;
printf("请输入插入的位置: ");
scanf("%d", &pos);
insert_student(new_node, pos);
break;
}
case 2:
{
// 删除学生信息
int pos;
printf("请输入删除的位置: ");
scanf("%d", &pos);
delete_student(pos);
break;
}
case 3:
{
// 查询学生信息
char stu_num[10];
printf("请输入学号: ");
scanf("%s", stu_num);
find_student(stu_num);
break;
}
case 4:
// 退出
break;
default:
printf("输入有误,请重新输入\n");
break;
}
} while (choice != 4);
return 0;
}