链表实现学生信息管理系统(C语言)

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef int Status;
int language;
typedef struct
{
    char num[12];
    char name[20];
    char sex;
    int sum_of_subject;
    int grade[20];
} stu;

typedef struct LNode
{
    stu student;
    LNode *next;
} node, *LinkList;

Status InofGBK(LNode *head)
{
    LinkList p, r; // p是当前进行操作的指针,r是rear
    r = head;
    int n;
    printf("输入学生总数:");
    scanf("%d", &n);
    printf("输入每个学生的信息:\n");
    int i;
    for (i = 1; i <= n; i++)
    {
        p = (LinkList)malloc(sizeof(LNode));
        p->next = NULL;

        printf("输入学号:\n");
        scanf("%s", p->student.num);
        printf("输入学生姓名:\n");
        scanf("%s", p->student.name);
        printf("输入性别:\n");
        // fflush(stdin);
        getchar();
        scanf("%c", &p->student.sex);
        printf("输入科目总数:\n");
        scanf("%d", &p->student.sum_of_subject);
        for (int i = 0; i < p->student.sum_of_subject; ++i)
        {
            printf("输入第%d科的成绩:\n", i + 1);
            scanf("%d", &p->student.grade[i]);
        }

        r->next = p;
        r = r->next;
    }
    return n;
}

Status InofANSCII(LNode *head)
{
    LinkList p, r; // p是当前进行操作的指针,r是rear
    r = head;
    int n;
    printf("enter the sum:");
    scanf("%d", &n);
    printf("enter perinformation:\n");
    int i;
    for (i = 1; i <= n; i++)
    {
        p = (LinkList)malloc(sizeof(LNode));
        p->next = NULL;

        printf("enter student number:\n");
        scanf("%s", p->student.num);
        printf("enter student's name:\n");
        scanf("%s", p->student.name);
        printf("enter sex:\n");
        // fflush(stdin);
        getchar();
        scanf("%c", &p->student.sex);
        printf("enter the total of all subjects:\n");
        scanf("%d", &p->student.sum_of_subject);
        for (int i = 0; i < p->student.sum_of_subject; ++i)
        {
            printf("enter the score of %dth:\n", i + 1);
            scanf("%d", &p->student.grade[i]);
        }

        r->next = p;
        r = r->next;
    }
    return n;
}

void out(LNode *head, char sex_)
{
    LinkList p;
    p = head;
    bool flag = 1;
    while (p->next != NULL)
    {
        p = p->next;
        if (sex_ == '@' || sex_ == p->student.sex)
        {
            if (language)
            {
                printf("%s 's\nschool number is: %s\nsex is: %c\n", p->student.name, p->student.num, p->student.sex);
                for (int i = 0; i < p->student.sum_of_subject; ++i)
                    printf("the score of the %dth subject is %d\n", i + 1, p->student.grade[i]);
            }
            else
            {
                printf("%s的\n学号是: %s\n性别是: %c\n", p->student.name, p->student.num, p->student.sex);
                for (int i = 0; i < p->student.sum_of_subject; ++i)
                    printf("第%d门学科的成绩是%d\n", i + 1, p->student.grade[i]);
            }
            printf("\n");
            if (flag)
                getchar();
            flag = 0;
        }
    }
    getchar();
}

void InsertList(LNode *head)
{
    int i = 0;
    int k;
    LinkList p, r;
    r = head;
    stu e;
    if (language)
        printf("if need specific postion,please enter \"1\"\nelse enter any key\n");
    else
        printf("如果需要在特定位置插入,输入\"1\"\n不需要只需输入任意键\n");
    getchar();
    char c;
    c = getchar();
    if (c == '1')
    {
        if (language)
        {
            printf("please enter where you'll insert\n");
            scanf("%d", &k);
            printf("please enter the information of the student who'll be inserted:\n");
            printf("enter school number:\n");
            scanf("%s", e.num);
            printf("enter name:\n");
            scanf("%s", e.name);
            printf("enter sex:\n");
            getchar();
            scanf("%c", &e.sex);
            printf("enter the total of all subjects:\n");
            scanf("%d", &e.sum_of_subject);
            for (int i = 0; i < e.sum_of_subject; ++i)
            {
                printf("enter the score of %dth:\n", i + 1);
                scanf("%d", &e.grade[i]);
            }
        }
        else
        {
            printf("请输入你想插入学生的位置\n");
            scanf("%d", &k);
            printf("请输入插入学生的信息:\n");
            printf("请输入学号:\n");
            scanf("%s", e.num);
            printf("请输入名字:\n");
            scanf("%s", e.name);
            printf("请输入性别:\n");
            fflush(stdin);
            scanf("%c", &e.sex);
            printf("输入科目总数:\n");
            scanf("%d", &e.sum_of_subject);
            for (int i = 0; i < e.sum_of_subject; ++i)
            {
                printf("输入第%d科的成绩:\n", i + 1);
                scanf("%d", &e.grade[i]);
            }
        }
        while (r && i < k - 1)
        {
            r = r->next;
            i++;
        }
        if (r != NULL)
        {
            p = (LinkList)malloc(sizeof(LNode));
            p->student = e;
            p->next = r->next;
            r->next = p;
        }
        else
        {
            printf("insert wrang\n");
        }
    }
    else
    {
        if (language)
        {
            printf("please enter the information of the student who'll be inserted:\n");
            printf("enter school number:\n");
            scanf("%s", e.num);
            printf("enter name:\n");
            scanf("%s", e.name);
            printf("enter sex:\n");
            getchar();
            scanf("%c", &e.sex);
            printf("enter the total of all subjects:\n");
            scanf("%d", &e.sum_of_subject);
            for (int i = 0; i < e.sum_of_subject; ++i)
            {
                printf("enter the score of %dth:\n", i + 1);
                scanf("%d", &e.grade[i]);
            }
        }
        else
        {
            printf("请输入插入学生的信息:\n");
            printf("请输入学号:\n");
            scanf("%s", e.num);
            printf("请输入名字:\n");
            scanf("%s", e.name);
            printf("请输入性别:\n");
            fflush(stdin);
            scanf("%c", &e.sex);
            printf("输入科目总数:\n");
            scanf("%d", &e.sum_of_subject);
            for (int i = 0; i < e.sum_of_subject; ++i)
            {
                printf("输入第%d科的成绩:\n", i + 1);
                scanf("%d", &e.grade[i]);
            }
        }
        while (1)
        {
            if (r->next == NULL)
                break;
            r = r->next;
        }
        p = (LinkList)malloc(sizeof(LNode));
        p->student = e;
        p->next = r->next;
        r->next = p;
    }
}

void DeleteList(LNode *head)
{
    LinkList p, r;
    int k;
    r = head;
    k = 0;
    if (language)
        printf("who you will delete and enter his(her) school number:\n");
    else
        printf("请输入你想删除学生的学号:\n");
    char nu[12];
    scanf("%s", nu);
    stu e;
    bool flag = 0;
    while (r->next != NULL)
    {
        if (!strcmp(nu, r->next->student.num))
        {
            p = r->next;
            // free(r->next);
            r->next = p->next;
            free(p);
            flag = 1;
            break;
        }
        r = r->next;
    }
    if (flag)
    {
        if (language)
            printf("Accept!\n");
        else
            printf("删除成功!\n");
        getchar();
    }
    else
    {
        if (language)
            printf("Not found!\n");
        else
            printf("未找到该学生!");
        getchar();
    }
    getchar();
    return;
}

Status searchway()
{
    int x;
    if (language)
    {
        printf("please choose way to search:\n");
        printf("\"1\" for name\n\"2\" for student number\n\"3\" for grades\n\"4\" for sex\n");
    }
    else
    {
        printf("请选择一种方式搜索:\n");
        printf("\"1\" 代表按姓名\n\"2\" 代表按学号\n\"3\" 代表按单科成绩\n\"4\" 代表性别\n");
    }
    scanf("%d", &x);
    getchar();
    return x;
}

void search1(LNode *head)
{
    LinkList p;
    p = head;
    if (language)
        printf("please enter student's name:\n");
    else
        printf("请输入学生姓名:");
    stu e;
    scanf("%s", e.name);
    bool flag = 0;
    while (p->next != NULL)
    {
        p = p->next;
        if (!strcmp(e.name, p->student.name))
        {
            if (language)
            {
                printf("school number is: %s\nsex is: %c\n", p->student.num, p->student.sex);
                for (int i = 0; i < p->student.sum_of_subject; ++i)
                    printf("the score of the %dth subject is %d\n", i + 1, p->student.grade[i]);
            }
            else
            {
                printf("学号是: %s\n性别是: %c\n", p->student.num, p->student.sex);
                for (int i = 0; i < p->student.sum_of_subject; ++i)
                    printf("第%d门学科的成绩是%d\n", i + 1, p->student.grade[i]);
            }
            getchar();
            flag = 1;
            break;
        }
    }
    if (!flag)
    {
        if (language)
            printf("Wrang!\n");
        else
            printf("学生不存在!\n");
        getchar();
    }
    getchar();
    return;
}

void search2(LNode *head)
{
    LinkList p;
    if (language)
        printf("please enter the school number of student:\n");
    else
        printf("请输入学生学号:");
    stu e;
    char nu[12];
    scanf("%s", nu);
    p = head;
    bool flag = 0;
    while (p->next != NULL)
    {
        p = p->next;
        if (!strcmp(nu, p->student.num))
        {
            if (language)
            {
                printf("name is: %s\nsex is: %c\n", p->student.name, p->student.sex);
                for (int i = 0; i < p->student.sum_of_subject; ++i)
                    printf("the score of the %dth subject is %d\n", i + 1, p->student.grade[i]);
            }
            else
            {
                printf("姓名是: %s\n性别是: %c\n", p->student.name, p->student.sex);
                for (int i = 0; i < p->student.sum_of_subject; ++i)
                    printf("第%d门学科的成绩是%d\n", i + 1, p->student.grade[i]);
            }
            getchar();
            flag = 1;
            break;
        }
    }
    if (!flag)
    {
        if (language)
            printf("Wrang!\n");
        else
            printf("学生不存在!\n");
        getchar();
    }
    getchar();
    return;
}

void search3(LNode *head, const int subject)
{
    LinkList p;
    p = head;
    if (language)
    {
        printf("please enter student's score:\n");
        printf("We'll match you with the student(students) with the closest score automatically\n");
    }
    else
    {
        printf("请输入学生该门科成绩:\n");
        printf("我们将会自动为您匹配 与您输入的成绩 最接近的学生:\n");
    }
    int sco;
    scanf("%d", &sco);
    int dev = 1e5;
    char mark[20][12];
    int k = 0; //存同分的人数
    while (p->next != NULL)
    {
        p = p->next;
        if (abs(p->student.grade[subject] - sco) < dev) //查找(所输入成绩与学生成绩)差值最小的学生,并将学号存入mark[]
        {
            dev = abs(p->student.grade[subject] - sco);
            k = 0;
            strcpy(mark[0], p->student.num);
        }
        else if (abs(p->student.grade[subject] - sco) == dev) //继续查找是否有相同成绩的人
        {
            strcpy(mark[++k], p->student.num);
        }
    }
    LinkList q;
    q = head;
    int i = 0;
    for (; i <= k; i++)
    {
        while (q->next != NULL)
        {
            q = q->next;
            if (!strcmp(mark[i], q->student.num))
            {
                if (language)
                {
                    printf("school number is: %s\nname is: %s\nsex is: %c\n", q->student.num, q->student.name, q->student.sex);
                    for (int i = 0; i < q->student.sum_of_subject; ++i)
                        printf("the score of the %dth subject is %d\n", i + 1, q->student.grade[i]);
                }
                else
                {
                    printf("学号是: %s\n姓名是: %s\n性别是: %c\n", q->student.num, q->student.name, q->student.sex);
                    for (int i = 0; i < q->student.sum_of_subject; ++i)
                        printf("第%d门学科的成绩是%d\n", i + 1, q->student.grade[i]);
                }
                printf("\n");
                getchar();
                break;
            }
        }
    }
    getchar();
    return;
}

void menuofANSCII()
{
    printf("*****************************************************\n");
    printf("*               1.enter students                    *\n");
    printf("*               2.search nodes                      *\n");
    printf("*               3.insert node                       *\n");
    printf("*               4.delete node                       *\n");
    printf("*               5.show all nodes                    *\n");
    printf("*               6.exit                              *\n");
    printf("*               plaese chose a function             *\n");
    printf("*****************************************************\n");
}

void menuofGBK()
{
    printf("*****************************************************\n");
    printf("*               1.逐个输入学生信息                  *\n");
    printf("*               2.根据特征搜索学生                  *\n");
    printf("*               3.插入学生                          *\n");
    printf("*               4.删除学生                          *\n");
    printf("*               5.显示所有学生                      *\n");
    printf("*               6.退出                              *\n");
    printf("*               请选择相应功能                      *\n");
    printf("*****************************************************\n");
}

int main()
{
    printf("请选择你的语言:\n\"0\"代表中文\n\"1\"refers to English\n");
    scanf("%d", &language);
    int x;
    LNode *head;
    head = (LinkList)malloc(sizeof(LNode));
    head->next = NULL;
    bool flag = 0;
    while (1)
    {
        system("cls");
        if (language)
            menuofANSCII();
        else
            menuofGBK();
        scanf("%d", &x);

        switch (x)
        {
        case 1:
            if (language)
                flag = InofANSCII(head);
            else
                flag = InofGBK(head);
            break;
        case 2:
            switch (searchway())
            {
            case 1:
                search1(head);
                break;
            case 2:
                search2(head);
                break;
            case 3:
                if (language)
                    printf("plesse enter the serial number of the subject:\n");
                else
                    printf("输入你想查找的科目序号:\n");
                int ord;
                scanf("%d", &ord);
                search3(head, ord - 1);
                break;
            case 4:
                if (language)
                    printf("plesse enter the sex you want:\n");
                else
                    printf("输入你想查找的性别:\n");
                char c;
                c = getchar();
                out(head, c);
            }
            break;
        case 3:
            if (!flag)
            {
                if (language)
                    printf("you must enter students by \"1\" first!\nenter any key to exit");
                else
                    printf("你必须先使用\"1\"输入学生信息\n输入任意键退出");
                getchar();
                getchar();
                break;
            }
            InsertList(head);
            break;
        case 4:
            DeleteList(head);
            break;
        case 5:
            out(head, '@');
            break;
        case 6:
            return 0;
        }
    }
}

/*
测试数据:
输入
3
01
zhang
f
3
34 56 56
02
li
m
3
78 90 97
03
huang
f
3
34 54 67

插入
1
4
04
ai
f
3
89 78 90

*/

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴回答你关于C语言课程设计的问题!链表是一种常用的数据结构,可以用来实现学生信息管理系统。下面是一个简单的示例代码,实现学生信息的添加、查找和删除功能: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct student { char name[50]; int age; struct student* next; } Student; Student* createStudent(char name[], int age) { Student* newStudent = (Student*)malloc(sizeof(Student)); strcpy(newStudent->name, name); newStudent->age = age; newStudent->next = NULL; return newStudent; } void addStudent(Student** head, char name[], int age) { Student* newStudent = createStudent(name, age); if (*head == NULL) { *head = newStudent; } else { Student* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = newStudent; } printf("学生 %s 添加成功\n", name); } void findStudent(Student* head, char name[]) { if (head == NULL) { printf("学生信息为空\n"); return; } Student* temp = head; while (temp != NULL) { if (strcmp(temp->name, name) == 0) { printf("找到学生 %s,年龄:%d\n", name, temp->age); return; } temp = temp->next; } printf("未找到学生 %s\n", name); } void deleteStudent(Student** head, char name[]) { if (*head == NULL) { printf("学生信息为空\n"); return; } Student* temp = *head; Student* prev = NULL; while (temp != NULL) { if (strcmp(temp->name, name) == 0) { if (prev == NULL) { *head = temp->next; } else { prev->next = temp->next; } free(temp); printf("删除学生 %s 成功\n", name); return; } prev = temp; temp = temp->next; } printf("未找到学生 %s\n", name); } void printStudents(Student* head) { if (head == NULL) { printf("学生信息为空\n"); return; } printf("学生信息列表:\n"); Student* temp = head; while (temp != NULL) { printf("姓名:%s,年龄:%d\n", temp->name, temp->age); temp = temp->next; } } void destroyStudents(Student** head) { if (*head == NULL) { return; } Student* current = *head; Student* next; while (current != NULL) { next = current->next; free(current); current = next; } *head = NULL; printf("释放学生信息成功\n"); } int main() { Student* head = NULL; addStudent(&head, "张三", 20); addStudent(&head, "李四", 21); addStudent(&head, "王五", 22); printStudents(head); findStudent(head, "李四"); findStudent(head, "赵六"); deleteStudent(&head, "李四"); printStudents(head); destroyStudents(&head); return 0; } ``` 这个例子中,我们定义了一个`Student`结构体,包含学生的姓名和年龄,并且有一个指向下一个学生的指针。我们可以使用`createStudent`函数创建一个新的学生节点,然后用`addStudent`函数将学生添加到链表中。`findStudent`函数用于查找指定姓名的学生,`deleteStudent`函数用于删除指定姓名的学生,`printStudents`函数用于打印所有学生信息,`destroyStudents`函数用于释放链表内存。 希望这个示例能够帮助你开始实现学生信息管理系统!如果你有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值