TheXxuan 2021-07-03 21:50 采纳率: 66.7%
浏览 37
已采纳

单链表实验操作(今晚急用!)

实验19 单链表操作
1.题目要求
利用菜单可以循环实现如下各个功能:
1. 建立一个含有若干个学生信息(学号,姓名,三门成绩,平均成绩)的单链表存储结构;
2. 输出单链表各节点的数据信息;
3. 给定一个学号,能够查询输出其相关信息;
4. 给定一个序号i,在其结点之后插入一个新的学生信息。
5. 给定一个学号,删除其相关信息;
6. 按平均成绩对建立的单链表进行排序。
要求: 利用指针、动态存储分配(malloc)来建立单链表。
(自行设计输入输出格式)
2.详细设计与实现
(源程序代码)
3.调试分析
(出现的问题,如何解决,测试分析、体会)

  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-07-03 21:52
    关注
    #include"stdio.h"
    #include"stdlib.h"
    #include"string.h"  //用于调用一些函数
    struct person {
        char name[20];
        int ID;
        int chinese;
        int english;
        int math;
        struct person *next;   //连接处的指针
    };                                 //由于create里面就有initialize所以先把initialize放在前面
    
    void initialize(struct person *p, int num) {  //初始化链表里面的值
        printf("innitialize person %d\n name is:", num);  //num用于计入输入的第几个同学
        scanf_s("%s", &p->name, sizeof(p->name));
        getchar();
        printf("ID:");
        scanf_s("%d", &p->ID);
        getchar();
        printf("chinese:");
        scanf_s("%d", &p->chinese);
        getchar();
        printf("math:");
        scanf_s("%d", &p->math);
        getchar();
        printf("english:");
        scanf_s("%d", &p->english);
        getchar();
    }
    
    struct person *create(int len) {
        int num = 0;
        struct person *h = 0, *c, *pre = 0;
        while (num < len) {
            c = (struct person*)malloc(sizeof(struct person)); //malloc取内存 sizeof为这个内存的大小  然后转化成指针
            if (num == 0) { h = c; pre = c; }  // 如果num=0  h存下了首地址  为以后拿做准备
            c->next = NULL;
            if (num) {
                pre->next = c;  //pre为前一块内存的地址  把后一块的首地址赋给前一块的尾
                pre = c;      //收尾连接后  pre指前一块的功能就完成了  然后再指向现在的内存 为下一次拿内存、赋地址做准备
            }
            initialize(c, num);   //每取一块地址就去输入一次
            ++num;
        }return h;
    }
    void traverse(struct person *head) {
        int index = 1;    // 用于计数第几个学生
        while (head != NULL) {  //同样一直到后面没有地址结束
            printf("name is: %s\t ID is:%d\t  chinese is:%d\t  englishi is:%d\t  math is:%d\n", head->name, head->ID, head->chinese, head->english, head->math);
            head = head->next;  //前一个输完后就要指向下一块地址
            ++index;
        }
    }
    
    int getlength(struct person *head) {
        int num = 0;
        while (head != NULL) {    //当head指向后面没有了 它就是NULL  结束
            ++num;
            head = head->next;  //如果head 不是NULL ++num后要把head指针指向最后
        }return num;
    }
    
    //增加学生信息
    void append_node(struct person *h) {
        struct person *t = h, *p;
        while (t->next != NULL) {      
            t = t->next;
        }p = (struct person *)malloc(sizeof(struct person));
        initialize(p, 0);
        p->next = NULL;    
        t->next = p;
        traverse(h);
    }
    
    
    //删除
    struct person * delete_ID(struct person *head, int ID, int len) {
        struct person *t = head;
        struct person *temp;
        for (int i = 0; i < (len - 1); ++i) {
            if (i == 0) {
                if (head->ID == ID) {  head = head->next;  free(t); traverse(head); return head; }
                if ((t->next)->ID == ID) {
                    temp = t->next;
                    t->next = (t->next)->next;
                    free(temp); traverse(head); return head;
                }
            }
            if (i != 0) {
                if ((t->next)->ID == ID) {
                    temp = t->next;
                    t->next = (t->next)->next;
                    free(temp); traverse(head); return head;
                }t = t->next;
            }
        }return head;
    }
    
    //学号查询
    void search_ID(struct person *head, int ID) {
        while (head != NULL) {
            if (head->ID == ID) {
                printf("name is: %s\t ID is:%d\t  chinese is:%d\t  englishi is:%d  math is:%d\n", head->name, head->ID, head->chinese, head->english, head->math);
            }head = head->next;
        }
    }
    
    //姓名查询
    void search_name(struct person *head, char name[20]) {
        while (head != NULL) {
            if ((strcmp(head->name, name)) == 0) { printf("name is: %s\t ID is:%d\t  chinese is:%d\t  englishi is:%d  math is:%d\n", head->name, head->ID, head->chinese, head->english, head->math); }
            head = head->next;
        }
    }
    
    //指定学生修改
    void change(struct person *head, char name[20]) {
        while (head != NULL) {
            if (strcmp(head->name, name) == 0) {
                printf(" name is:");
                scanf_s("%s", &head->name, sizeof(head->name));
                getchar();
                printf("ID:");
                scanf_s("%d", &head->ID);
                getchar();
                printf("chinese:");
                scanf_s("%d", &head->chinese);
                getchar();
                printf("english:");
                scanf_s("%d", &head->english);
                getchar();
                printf("math:");
                scanf_s("%d", &head->math);
                getchar();
            }
            head = head->next;
        }
        traverse(head);
    }
    //数学分数平均数
    int average_math(struct person *head, int len) {
        int i = 0, sum = 0, average;
        struct person *t = head;
        while (t != NULL) {
            sum += t->math;
            t = t->next;
        }
        average = (sum / len);
        return average;
    }
    //英语分数平均数
    int average_english(struct person *head, int len) {
        int i = 0, sum = 0, average;
        struct person *t = head;
        while (t != NULL) {
            sum += t->english;
            t = t->next;
        }
        average = (sum / len);
        return average;
    }
    
    //语文分数平均数
    int average_chinese(struct person *head, int len) {
        int  sum = 0, average;
        struct person *t = head;
        while (t != NULL) {
            sum += t->chinese;
            t = t->next;
        }
        average = (sum / len);
        return average;
    }
    
    //成绩区间统计
    int statistics_math(struct person*head, int min, int max) {
        int conter = 0;
        while (head!= NULL) {
            if (head->math >= min&&head->math <= max) {
                ++conter;
                printf("name:%s math score:%d\n", head->name, head->math);
            }head = head->next;
        }return conter;
    }
    
    int statistics_chinese(struct person*head, int min, int max) {
        int conter = 0;
        while (head != NULL) {
            if (head->chinese >= min&&head->chinese <= max) {
                ++conter;
                printf("name:%s chinese score:%d\n", head->name, head->chinese);
            }head = head->next;
        }return conter;
    }
    int statistics_english(struct person*head, int min, int max) {
        int conter = 0;
        while (head != NULL) {
            if (head->english >= min&&head->english <= max) {
                ++conter;
                printf("name:%s english score:%d\n", head->name, head->english);
            }head = head->next;
        }return conter;
    }
    
    //某名学生的平均成绩
    int average_name(struct person*head, char name[20]) {
        int av = 0;
        while (head != NULL) {
            if (strcmp(head->name, name) == 0) { av += head->math; av += head->chinese; av += head->english; }
            head = head->next;
        }
        av = av / 3;
        return av;
    }
    
    //排序数学
    void rank_math(struct person *h, int len) {
        struct person  *t = h, *pre = h;
        int i, math, chinese, english,ID;
        char name[20];
        t = t->next;
        for (i = 0; i < (len - 1); ++i) {
            while (t != NULL) {
                if ((t->math) >(pre->math)) {
                    ID = t->ID; t->ID = pre->ID; pre->ID = ID;
                    math = t->math; t->math = pre->math; pre->math = math;
                    strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);
                    chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;
                    english = t->english; t->english = pre->english; pre->english = english;
                }
                t = t->next;
            }pre = pre->next; t = pre->next;
        }
        traverse(h);
    }
    //排序语文
    void rank_chinese(struct person *h, int len) {
        struct person  *t = h, *pre = h;
        int i, math, chinese, english,ID;
        char name[20];
        t = t->next;
        for (i = 0; i < (len - 1); ++i) {
            while (t != NULL) {
                if ((t->chinese) >(pre->chinese)) {
                    ID = t->ID; t->ID = pre->ID; pre->ID = ID;
                    math = t->math; t->math = pre->math; pre->math = math;
                    strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);
                    chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;
                    english = t->english; t->english = pre->english; pre->english = english;
                }
                t = t->next;
            }pre = pre->next; t = pre->next;
        }
        traverse(h);
    }
    
    //排序英语
    void rank_english(struct person *h, int len) {
        struct person  *t = h, *pre = h;
        int i, math, chinese, english,ID;
        char name[20];
        t = t->next;
        for (i = 0; i < (len - 1); ++i) {
            while (t != NULL) {
                if ((t->english) >(pre->english)) {
                    ID = t->ID; t->ID = pre->ID; pre->ID = ID;
                    math = t->math; t->math = pre->math; pre->math = math;
                    strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);
                    chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;
                    english = t->english; t->english = pre->english; pre->english = english;
                }
                t = t->next;
            }pre = pre->next; t = pre->next;
        }
        traverse(h);
    }
    
    void release(struct person *head) {
        struct person *n;   //需要一个指针存着下一个地址
        while (head != NULL) {
            n = head->next;  //把n指向下一块要释放的地址
            free(head);
            head = n;   //然后再把head从前一个地址移到下一个地址
        }
    }
    //取长度
    int getlen(struct person *head) {
        int conter = 0;
        struct person*t = head;
        while (t != NULL) {
            ++conter;
            t = t->next;
        }
        return conter;
    }
    //存入文件
    void openfile(struct person *head, int len) {
        FILE *fp;
        struct person*t = head;
        errno_t err;
        int temp;
        char str[100];
        char s[10];
        if ((err = fopen_s(&fp, "D:\\学生信息", "w")) != 0)
        {
            printf("文件打开错误\n");
        }
        else
        {
            printf("文件打开成功\n");
        }
        for (int i = 0; i < len; ++i) {
            strcpy_s(str, t->name);
            fputs("name:", fp);
            fputs(str, fp);
            fputs(": ", fp);
    
            fputs("ID:", fp);
            sprintf_s(s, "%d", t->ID);
            fputs(s, fp);
            fputs("  ", fp);
    
            sprintf_s(s, "%d", t->chinese);
            fputs("chinese:", fp);
            fputs(s, fp);
            fputs("  ", fp);
    
            sprintf_s(s, "%d", t->math);
            fputs("math:", fp);
            fputs(s, fp);
            fputs("  ", fp);
    
            sprintf_s(s, "%d", t->english);
            fputs("english:", fp);
            fputs(s, fp);
            fputs("\n", fp);
            t = t->next;
        }
        return;
    }
    
    
    void menu(struct person *head, int len) {
        int m = 0;
        int min, max;
        int ID = 0;
        int conter = 0;
        char name[20];
        while (1) {
                printf("                      请选择您需要的操作:\n");
                printf("                                       0.  遍历学生信息\n");
                printf("                                       1.  增加学生信息\n");
                printf("                                       2.  删除学生信息\n");
                printf("                                       3.  修改学生信息\n");
                printf("                                       4.  按姓名查询\n");
                printf("                                       5.  按学号查询\n");
                printf("                                       6.  语文成绩在某个区间段的人数以及学生\n");
                printf("                                       7.  数学成绩在某个区间段的人数以及学生\n");
                printf("                                       8.  英语成绩在某个区间段的人数以及学生\n");
                printf("                                       9.  语文平均分\n");
                printf("                                       10. 数学平均分\n");
                printf("                                       11. 英语平均分\n");
                printf("                                       12. 某个学生的三科平均成绩\n");
                printf("                                       13. 按语文成绩从高到低排序\n");
                printf("                                       14. 按数学成绩从高到低排序\n");
                printf("                                       15. 按英语成绩从高到底排序\n");
                printf("                                       16. 结束功能并把信息写入文件中\n");
                scanf_s("%d", &m);
                switch (m) {
                case 0: traverse(head); break;
                case 1: append_node(head); break;
                case 2: {printf("要删除学生信息的学号:");
                    scanf_s("%d", &ID);
                    head=delete_ID(head, ID, getlen(head)); }break;
                case 3: {printf("需要修改学生信息的同学姓名:");
                    scanf_s("%s", &name, sizeof(name));
                    change(head, name); }break;
                case 4: {printf("search by name:");
                    scanf_s("%s", &name, sizeof(name));
                    search_name(head, name); }break;
                case 5: {printf("学号查询:");
                    scanf_s("%d", &ID);
                    search_ID(head, ID); }break;
                case 6: {printf("请输入语文成绩的区间:");
                    printf("min=");
                    scanf_s("%d", &min);
                    printf("max=");
                    scanf_s("%d", &max);
                    printf("语文成绩在区间%d到%d之间的学生:%d人\n", min, max, statistics_chinese(head, min, max)); }break;
                case 7: {printf("请输入数学成绩的区间:");
                    printf("min=");
                    scanf_s("%d", &min);
                    printf("max=");
                    scanf_s("%d", &max);
                    printf("数学成绩在区间%d到%d之间的学生:%d人\n", min, max, statistics_math(head, min, max)); }break;
                case 8: {printf("请输入英语成绩的区间:");
                    printf("min=");
                    scanf_s("%d", &min);
                    printf("max=");
                    scanf_s("%d", &max);
                    printf("英语成绩在区间%d到%d之间的学生:共有%d人\n", min, max, statistics_english(head, min, max)); }break;
                case 9: { printf("average of chinese is%d", average_chinese(head, getlen(head))); }break;
                case 10: { printf("average of math is%d", average_math(head, getlen(head))); }break;
                case 11: { printf("average of english is%d", average_english(head, getlen(head))); }break;
                case 12: {printf("请输入学生的姓名:");
                    scanf_s("%s", &name, sizeof(name));
                    printf("%s 的平均成绩为:%d", name, average_name(head, name)); }break;
                case 13: {printf("按照语文成绩从高到底排序:");
                    rank_chinese(head, getlen(head)); }break;
                case 14: {printf("按照数学成绩从高到底排序:");
                    rank_math(head, getlen(head)); }break;
                case 15: {printf("按照英语成绩从高到底排序:");
                    rank_english(head, getlen(head)); }break;
                case 16: openfile(head, getlen(head)); return;
                }
        }
    }
    
    int main() {
        struct person *head;
        int len;
        int min, max;
        int ID = 0;
        char name[20];
        printf("请输入学生信息");
        printf("学生人数:");
        scanf_s("%d", &len);  //输入要取的地址多少
        head = create(len);   // 创建地址   在create里面就有初始复制函数嵌套
        traverse(head);    //遍历
        menu(head, getlen(head));
        release(head);       //释放内存
        system("pause");
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退