燕山大学三级项目-基于链表的学生信息管理系统-C语言实现

前言

相信这是不少小伙伴的c语言课设作业,提供思路供大家参考,功能就是最朴实的增删改查,

朴实无华提供个骨架 (* ̄︶ ̄)

结构体
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct score {  //使用typedef,便于声明变量
    int c;  // c语言成绩
    int math;  // 高数成绩
    int english;  // 英语成绩
}score;

typedef struct stu {   // 定义学生结构体
    char name[20];   //学生姓名
    char num[20];    //学生学号
    char sex[10];    //学生性别
    int age;         //学生年龄
    score s;
}stu;

typedef struct linklist {  // 定义链表
    stu date;    //将一个stu结构体保存到linklist中
    struct linklist* next;  // 指向下一个节点
}linklist;

struct linklist* head = NULL;  // 初始化头结点
菜单界面
void menu() {
    system("cls");  // 清屏

    printf("                                                        \n");
    printf("                                                        \n");
    printf("             ========  学生信息管理系统========         \n");
    printf("                                                        \n");
    printf("                       0、退出系统                      \n");
    printf("                       1、添加学生信息                  \n");
    printf("                       2、查找学生信息                  \n");
    printf("                       3、删除学生信息                  \n");
    printf("                       4、修改学生信息                  \n");
    printf("                       5、显示学生信息                  \n");
    printf("                                                        \n");
}
添加学生信息

//添加学生信息
void add(linklist* head) { // 传入头结点
    printf("\t\t\t\t欢迎来到添加界面,请按要求完成操作\n");
    linklist* q = (linklist*)malloc(sizeof(linklist));
    q->next = NULL;
    linklist* p;
    p = head;   //将头结点赋给p来保存
    char name[20];
    printf("请输入姓名:");
    scanf("%s", name);
    printf("\n请输入学号:");
    char num[20];
    scanf("%s", num);
    while (p->next != NULL) {
        // 运用 strcmp字符串共享 , 通过比较姓名和学号,来判断学生是否存在
        if (strcmp(p->date.num, num) == 0 && strcmp(p->date.name, name) == 0) {
            printf("该学生已存在\n");
            break;
        }
        // 如果要添加的学生未未存在, 将节点向下移动
        p = p->next;
    }
    if (p->next == NULL) {  //p已经指向链表的最后一个节点

        strcpy(q->date.num, num); // 将得到的输入结果转成字符串
        strcpy(q->date.name, name);
        printf("\n性别:");
        scanf("%s", q->date.sex);
        printf("\n请输入年龄:");
        scanf("%d", &q->date.age);
        printf("\n请输入高数成绩:");
        scanf("%d", &q->date.s.math);
        printf("\n请输入c语言成绩:");
        scanf("%d", &q->date.s.c);
        printf("\n请输入英语成绩:");
        scanf("%d", &q->date.s.english);

        p->next = q; // 将当前已经记录完信息的节点连在p后面
        p = q;  //让p再次指向更新后新链表的最后
    }
}

删除学生信息

//删除学生信息
void delet(linklist* head) {

    linklist* p, * q;
    p = (linklist*)malloc(sizeof(linklist));
    q = (linklist*)malloc(sizeof(linklist));
    p = head;
    q = p->next; //头结点不存放数据, 因此让q指向下一个节点并开始比较
    char name3[20];
    if (p == NULL) {
        printf("此时无数据");
        return;
    }
    else {
        printf("请输入要删除的学生姓名");
        scanf("%s", name3);
        while (q != NULL) {
            if (strcmp(q->date.name, name3) == 0) {  //比较学生姓名
                p->next = q->next; // 将当前节点与链表断开
                free(q);  // 释放空间, 完成删除
                printf("\t\t\t\t     恭喜您!删除成功!!!   \n");

            }
            p = q;  
            q = q->next;  //将节点下移
        }

    }
}
查找学生信息

//
void search(linklist* head) {
    int k = 0;  //k作为是否找到了要查找的学生的标志,初始化为0,如果找到了则变为1
    char name3[20];
    printf("请输入学生姓名:\n");
    scanf("%s", name3);
    linklist* p;
    p = (linklist*)malloc(sizeof(linklist));
    p = head->next;
    if (p == NULL) {
        printf("\t\t\t\t\t还未录入信息!!!\n");
    }
    while (p != NULL) {
        if (strcmp(name3, p->date.name) == 0) {
            k = k + 1;
            printf("\n姓名\t年龄\t性别\t学号\t\t高数成绩\tc语言成绩\t英语成绩\n");
            printf("%s", p->date.name);
            printf("\t%d", p->date.age);
            printf("\t%s", p->date.sex);
            printf("\t%s", p->date.num);
            printf("\t%d", p->date.s.math);
            printf("\t\t%d", p->date.s.c);
            printf("\t\t%d", p->date.s.english);

            //    printf("\n%s\t\t%3d\t\t%s\t\t%s\t\t%3d\t\t%3d\t\t%3d",p->date.name,p->date.age,p->date.sex,p->date.num,p->date.s.chinese,p->date.s.math,p->date.s.english);

        }
        p = p->next;
    }
    if (k == 0) {
        printf("查无此人");
    }
}
修改学生信息

void change(linklist* head) {
    printf("\t\t\t\t欢迎来到修改界面,请按要求完成操作\n");
    char name4[20];
    printf("请输入学生姓名:\n");
    scanf("%s", name4);
    int k = 0;
    linklist* p;
    p = (linklist*)malloc(sizeof(linklist));
    p = head->next;
    while (p != NULL) {
        if (strcmp(name4, p->date.name) == 0) {
            k = 1;
            printf("%s", p->date.num);
            printf("\n姓名\t年龄\t性别\t学号\t\t高数成绩\tc语言成绩\t英语成绩\n");
            printf("%s", p->date.name);
            printf("\t\t%3d", p->date.age);
            printf("\t\t");
            printf("%s", p->date.sex);
            printf("\t\t");
            printf("%s", p->date.num);
            printf("\t\t%3d", p->date.s.c);
            printf("\t\t%3d", p->date.s.math);
            printf("\t\t%3d", p->date.s.english);
        }

        p = p->next;
    }
    if (k == 0) {
        printf("查无此人\n");
    }

    printf("\t\t\t\t1.学号  2.性别  3.年龄  4.c语言成绩  5.英语成绩  6.高数成绩  \n");


    int sel4;
    printf("\n请按要求输入要修改信息的编号:");
    scanf("%d", &sel4);
    p = head->next;
    while (p != NULL) {
        if (strcmp(name4, p->date.name) == 0) {
            switch (sel4) {
            case 1:
                char s1[20];
                printf("\n请输入修改后的学号:");
                scanf("%s", s1);
                strcpy(p->date.num, s1);
                break;
            case 2:
                char s2[20];
                printf("\n请输入修改后的性别:");
                scanf("%s", s2);
                strcpy(p->date.sex, s2);
                break;
            case 3:
                int s3;
                printf("\n请输入修改后的年龄:");
                scanf("%d", &s3);

                p->date.age = s3;
                break;
            case 4:
                int s4;
                printf("\n请输入修改后的c语言成绩:");
                scanf("%d", &s4);

                p->date.s.c = s4;
                break;
            case 5:
                int s5;
                printf("\n请输入修改后的英语成绩:");
                scanf("%d", &s5);

                p->date.s.english = s5;
                break;
            case 6:
                int s6;
                printf("\n请输入修改后的高数成绩:");
                scanf("%d", &s6);

                p->date.s.math = s6;
                break;
            }
        }
        p = p->next;
    }
}
显示学生信息

//显示学生信息
void show(linklist* head) {
    linklist* p;
    p = (linklist*)malloc(sizeof(linklist));
    p = head->next;
    printf("\n姓名\t年龄\t性别\t学号\t\t高数成绩\tc语言成绩\t英语成绩\n");
    while (p != NULL) {
        printf("\n");
        printf("%s", p->date.name);
        printf("\t%d", p->date.age);
        printf("\t%s", p->date.sex);
        printf("\t%s", p->date.num);
        printf("\t%d", p->date.s.math);
        printf("\t\t%d", p->date.s.c);
        printf("\t\t%d", p->date.s.english);
    
        p = p->next; //下移,指向下一个节点

    }

}
主方法

//主方法
int main()
{
    int choose;
    head = (linklist*)malloc(sizeof(linklist));//定义一个头结点
    head->next = NULL;
    while (1) {
        menu();
        scanf("%d", &choose);
        switch (choose) {
        case 1:

            do {
                system("cls");
                add(head);
                char sel[5];
                printf("\t\t\t\t\t\t是否继续添加(yes or no): ");
                scanf("%s", sel);
                if (strcmp(sel, "yes") == 0) continue;
                else break;
            } while (1);
            break;
        case 2:

            do {
                printf("\t\t\t\t欢迎来到查找界面,请按要求完成操作\n");
                search(head);
                printf("\n\n\t\t\t\t\t\t是否继续查找(yes or no):");
                char sel2[5];
                scanf("%s", sel2);
                if (strcmp(sel2, "yes") == 0) continue;
                else break;
            } while (1);
            break;
        case 3:
            do {

                delet(head);
                char sel3[5];
                printf("\t\t\t\t是否继续删除(yes or no): ");
                scanf("%s", sel3);
                if (strcmp(sel3, "yes") == 0) continue;
                else break;
            } while (1);
            break;
        case 4:
            change(head);
            break;
        case 5:

            system("cls");
            printf("\t\t\t\t欢迎来到显示界面,请按要求完成操作\n\n\n");
            show(head);

            printf("\n\n\n退出请输入0:");
            int sel6;
            scanf("%d", &sel6);
            if (sel6 == 0)
                break;

        default:
            printf("\n感谢使用!\n");

            system("pause");  //中断程序
            return 0;
        }
    }
    return 0;
}

感谢观看,对你有帮助的话希望可以给个三连和关注!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千泽.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值