Student management system

来源:互联网 发布:淘宝的所在地怎么修改 编辑:程序博客网 时间:2024/06/08 10:02

带头结点判空表的条件 H->next == NULL
不带头结点判空表的条件 H == NULL;此时H是头指针

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <windows.h>struct stud{    char id[13];    char name[21];    int score1, score2, score3;    int sum;    struct stud *next;};typedef struct stud LNode, *LinkList;//LNode a等价于struct stud a//LinkList p 等价于 struct stud *pvoid Display();void CreateList(LinkList head);void PrintList(LinkList head);void ListDelete(LinkList head);void ListInsert(LinkList head);void ListStaticScore(LinkList head);int main(){    LinkList head;    int select;    head = (LinkList) malloc (sizeof(LNode));    head -> next = NULL;    Display();    while(1)    {        scanf("%d", &select);        switch(select)        {            case 1: CreateList(head);                    break;            case 2: ListInsert(head);                    break;            case 3: ListDelete(head);                    break;            case 4: PrintList(head);                    printf("\n");                    break;            case 5: ListStaticScore(head);                    break;            case 0:                    exit(0);        }    }    return 0;}void Display(){    printf("\n======================================\n\n");    printf("*欢迎进入学生管理系统 V3.0!*\n");    printf("1: 创建列表\n");    printf("2: 插入元素\n");    printf("3: 删除元素\n");    printf("4: 显示元素\n");    printf("5: 统计\n");    printf("0: 退出系统\n");    printf("\nCopyright @ 2017 STU by CLAY. All rights reserved.");    printf("\n======================================\n");    printf("请选择菜单项: \n");}void CreateList(LinkList head)//尾插法{    printf("输入若干整数,输入 # 表示结束 \n");    LinkList p, rear = head;    while(1)    {        p = (LinkList)malloc(sizeof(LNode));        scanf("%s", p->id);        if(p->id[0] != '#' )        {            scanf("%s%d%d%d", p->name, &p->score1, &p->score2, &p->score3);            p->sum = p->score1 + p->score2 + p->score3;        }        else            break;        rear ->next = p;        rear = p;    }    rear ->next = NULL;    printf("\n新创建的学生信息为:\n");    PrintList(head);}void PrintList(LinkList head){    LinkList p = head ->next;    while(p)    {        printf("%s\t%s\t%d\t%d\t%d\t%d\n", p ->id, p->name, p->score1, p->score2, p->score3, p->sum);        p = p ->next;    }}void ListInsert(LinkList head){    printf("当前链表中学生信息为:\n");    PrintList(head);    LinkList p, pre = head->next, rec;//rec存的是待插入节点之前的节点,按id顺序插    int flag = 0;    p = (LinkList)malloc(sizeof(LNode));    printf("\n请输入待添加学生的信息: \n");    scanf("%s%s%d%d%d", p->id, p->name, &p->score1, &p->score2, &p->score3);    p->sum = p->score1+p->score2+p->score3;    while(pre)    {        if( strcmp(pre->id, p->id) == 0)        {            flag = 1;            break;        }        if( strcmp(pre->id, p->id) > 0 )        {            flag = 0;            break;        }        rec = pre;        pre = pre->next;    }    if(flag == 1)    {        printf("学号已有,无法添加\n\n");    }    else    {        if( !pre)        {            rec->next =  p;            p->next = NULL;        }        else        {              p->next = rec->next;              rec->next = p;        }    }    printf("\n链表修改后的学生信息为:\n");    PrintList(head);}void ListDelete(LinkList head){    printf("当前链表中学生信息为:\n");    PrintList(head);    LinkList p, pre=head->next, rec;    int flag = 0;    p = (LinkList)malloc(sizeof(LNode));    printf("\n请输入待删除学生的学号信息:\n");    scanf("%s", p->id);    while(pre)    {        if( strcmp(p->id, pre->id) == 0)        {            printf("待删除学生的信息为:\n");            printf("%s\t%s\t%d\t%d\t%d\t%d\n", pre->id, pre->name, pre->score1, pre->score2, pre->score3, pre->sum);            flag = 1;            break;        }        rec = pre;        pre = pre->next;    }    if(flag == 0)        printf("查无此号,无法删除!\n");    else//考虑三种情况在头结点后,中间,末尾的空节点    {        if( pre == head->next)        {             head->next = pre->next;            free(pre);        }        else if( pre->next != NULL)        {            rec->next = pre->next;            free(pre);        }        else            rec->next = NULL;    }    printf("\n链表修改后的学生信息为:\n");    PrintList(head);}void ListStaticScore(LinkList head){    printf("当前链表中学生信息为:\n");    PrintList(head);    printf("有不及格学生信息统计为:\n");    LinkList pre = head->next;    while(pre)    {        if( (pre->score1 < 60) || (pre->score2 < 60) || (pre->score3 < 60) )        {            printf("%s\t%s\t%d\t%d\t%d\t%d\n", pre->id, pre->name, pre->score1, pre->score2, pre->score3, pre->sum);        }        pre = pre->next;    }}
0 0
原创粉丝点击