创建一个 单向链表 来记录学生信息,人数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)程序运行后要求可以循环执行前三项操作,直到选择退出时结束程序

供参考!谢谢!希望对你有帮助。

img

img

img

img

#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;
}