codecrystal321 2022-12-23 09:35 采纳率: 100%
浏览 73
已结题

C语言链表题,记录学生信息

###求助,小白遇到一个C语言链表题,求助大神怎么做

创建一个 单向链表 来记录学生信息,人数3--5人;链表结点为结构变量,结构的要求如下:

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)程序运行后要求可以循环执行前三项操作,直到选择退出时结束程序

  • 写回答

2条回答 默认 最新

  • 冷月半明 2022-12-23 11:01
    关注
    
    #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; // 指向下一个结点的指针
    };
    
    // 插入新的学生信息
    void insert_node(struct stu_info **head, char *stu_num, int pos) {
    // 申请新结点
    struct stu_info *new_node = malloc(sizeof(struct stu_info));
    // 将新结点的信息赋值为要插入的学号
    strcpy(new_node->stu_num, stu_num);
    // 如果要插入的位置是第一个结点,则直接将新结点插入到头部
    if (pos == 1) {
        new_node->next = *head;
        *head = new_node;
    } else {
        // 否则,先找到要插入的位置的前一个结点
        struct stu_info *prev = *head;
        for (int i = 1; i < pos - 1; i++) {
            prev = prev->next;
        }
    
        // 将新结点插入到链表中
        new_node->next = prev->next;
        prev->next = new_node;
    }
    }
    
    // 删除指定的学生信息
    void delete_node(struct stu_info **head, char *stu_num) {
    // 先找到要删除的结点的前一个结点
    struct stu_info *prev = *head;
    while (prev->next != NULL && strcmp(prev->next->stu_num, stu_num) != 0) {
    prev = prev->next;
    }
    // 如果找到了要删除的结点,则将前一个结点的 next 指针指向要删除的结点的下一个结点
    if (prev->next != NULL) {
    struct stu_info *node_to_delete = prev->next;
    prev->next = node_to_delete->next;
    free(node_to_delete);
    }
    }
    
    // 根据学号查询并显示查询到的学生信息
    void find_node(struct stu_info *head, char *stu_num) {
    struct stu_info *node = head;
    while (node != NULL) {
    if (strcmp(node->stu_num, stu_num) == 0) {
    // 找到了学号匹配的结点,输出其信息
    printf("学号: %s\n", node->stu_num);
    printf("姓名: %s\n", node->stu_name);
    printf("性别: %s\n", node->stu_sex);
    printf("成绩: %d\n", node->stu_score);
    return;
    }
    node = node->next;
    }
    // 如果没有找到学号匹配的结点,则输出提示
    printf("未找到学号为 %s 的学生信息\n", stu_num);
    }
    
    int main() {
    // 初始化链表
    struct stu_info *head = NULL;
    // 循环执行操作
    int op;
    do {
        printf("\n1. 插入学生信息\n");
        printf("2. 删除学生信息\n");
        printf("3. 查询学生信息\n");
        printf("4. 退出\n");
        printf("请选择要执行的操作: ");
        scanf("%d", &op);
    
        switch (op) {
            case 1: {
                // 插入学生信息
                char stu_num[10];
                int pos;
                printf("请输入要插入的学号: ");
                scanf("%s", stu_num);
                printf("请输入要插入的位置(1-based): ");
                scanf("%d", &pos);
                insert_node(&head, stu_num, pos);
                break;
            }
            case 2: {
                // 删除学生信息
                char stu_num[10];
                printf("请输入要删除的学号: ");
    scanf("%s", stu_num);
    delete_node(&head, stu_num);
    break;
    }
    case 3: {
    // 查询学生信息
    char stu_num[10];
    printf("请输入要查询的学号: ");
    scanf("%s", stu_num);
    find_node(head, stu_num);
    break;
    }
    case 4: {
    // 退出程序
    break;
    }
    default: {
    printf("输入错误,请重新输入\n");
    break;
    }
    }
    } while (op != 4);
    return 0;
    }
    
    
    

    如果你觉得有帮助请采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月31日
  • 已采纳回答 12月23日
  • 创建了问题 12月23日