龙华做网站哪家便宜如何设置自己网站的关键词

张小明 2025/12/31 0:06:18
龙华做网站哪家便宜,如何设置自己网站的关键词,唐山网站建设价格,优秀免费h5页面制作完成比完美更重要实验7 结构与联合实验7.1 实验目的1#xff0e;通过实验#xff0c;熟悉和掌握结构的说明和引用、结构的指针、结构数组、以及函数中使用结构的方法。2#xff0e;通过实验#xff0c;掌握动态储存分配函数的用法#xff0c;掌握自引用结构#xff0c;单…完成比完美更重要实验7 结构与联合实验7.1实验目的1通过实验熟悉和掌握结构的说明和引用、结构的指针、结构数组、以及函数中使用结构的方法。2通过实验掌握动态储存分配函数的用法掌握自引用结构单向链表的创建、遍历、结点的增删、查找等操作。3了解字段结构和联合的用法。7.2实验题目及要求1表达式求值的程序验证题设有说明char u[]UVWXYZ;char v[]xyz;struct T{int x;char c;char *t;}a[]{{11,ˊAˊ,u},{100, ˊBˊ,v}},*pa;请先自己计算下面表达式的值然后通过编程计算来加以验证。(各表达式相互无关)序号表达式计算值验证值1(p)-x2p,p-c3*p-t,*p-t4*(p)-t5*p-t6*p-t解答计算值从上至下依次为100BUxxVV用以验证计算值的源程序清单#includestdio.h#includestring.hstructT{intx;charc;char* t;};charu_data[] UVWXYZ;charv_data[] xyz;constcharu_backup[] UVWXYZ;constcharv_backup[] xyz;structTa_data[] {{11,A, u_data},{100,B, v_data}};structT* p a_data;voidreset_p() {p a_data;memcpy(u_data, u_backup,sizeof(u_backup));memcpy(v_data, v_backup,sizeof(v_backup));a_data[0].t u_data;a_data[1].t v_data;}intmain() {intval_int;charval_char;charval_char1, val_char2;printf(验证值:\n);// 1. (p)-xreset_p();val_int (p)-x;printf(1: %d\n, val_int);// 2. p, p-creset_p();val_char (p, p-c);printf(2: %c\n, val_char);// 3. *p-t, *p-treset_p();val_char1 *p-t;val_char2 *p-t;printf(3: %c, %c\n, val_char1, val_char2);// 4. *(p)-treset_p();val_char *(p)-t;printf(4: %c\n, val_char);// 5. *p-treset_p();val_char *p-t;printf(5: %c\n, val_char);// 6. *p-treset_p();val_char * p-t;printf(6: %c\n, val_char);return0;}3验证程序的运行截图图7-1程序验证题对应程序的运行截图2源程序修改替换题给定一批整数以0作为结束标志且不作为结点将其建成一个先进先出的链表先进先出链表的指头指针始终指向最先创建的结点链头先建结点指向后建结点后建结点始终是尾结点。源程序中存在什么样的错误先观察执行结果对程序进行修改、调试使之能够正确完成指定任务。源程序如下#include stdio.h#include stdlib.hstruct s_list{int data; /* 数据域 */struct s_list *next; /* 指针域 */} ;void create_list (struct s_list *headp,int *p);void main(void){struct s_list *headNULL,*p;int s[]{1,2,3,4,5,6,7,8,0}; /* 0为结束标记 */create_list(head,s); /* 创建新链表 */phead; /*遍历指针p指向链头 */while(p){printf(%d\t,p-data); /* 输出数据域的值 */pp-next; /*遍历指针p指向下一结点 */}printf(\n);}void create_list(struct s_list *headp,int *p){struct s_list * loc_headNULL,*tail;if(p[0]0) /* 相当于*p0 */;else { /* loc_head指向动态分配的第一个结点 */loc_head(struct s_list *)malloc(sizeof(struct s_list));loc_head-data*p; /* 对数据域赋值 */tailloc_head; /* tail指向第一个结点 */while(*p){ /* tail所指结点的指针域指向动态创建的结点 */tail-next(struct s_list *)malloc(sizeof(struct s_list));tailtail-next; /* tail指向新创建的结点 */tail-data*p; /* 向新创建的结点的数据域赋值 */}tail-nextNULL; /* 对指针域赋NULL值 */}headploc_head; /* 使头指针headp指向新创建的链表 */}解答错误修改main中对notes的调用错误notes的声明和定义错误应使用二级指针修改后的源程序清单#include stdio.h#include stdlib.hstruct s_list {int data;struct s_list *next;};// 接受二级指针struct s_list **void create_list(struct s_list **headpp, int *p);void main(void){struct s_list *head NULL, *p;int s[] {1, 2, 3, 4, 5, 6, 7, 8, 0};// 传递 head 的地址create_list(head, s);p head;printf(--- FIFO 链表输出 ---\n);while(p) {printf(%d\t, p-data);p p-next;}printf(\n);}// 修改后的 create_list 函数FIFOvoid create_list(struct s_list **headpp, int *p){struct s_list *loc_head NULL, *tail;if (*p 0); // 数组为空loc_head 保持 NULLelse {// 1. 创建第一个结点loc_head (struct s_list *)malloc(sizeof(struct s_list));if (loc_head NULL) return; // 检查内存分配loc_head-data *p;tail loc_head;// 2. 依次创建后续结点 (尾部插入)while (*p) {tail-next (struct s_list *)malloc(sizeof(struct s_list));if (tail-next NULL) break; // 检查内存分配tail tail-next;tail-data *p;}tail-next NULL;}// 3. 关键修正通过二级指针修改 main 函数中 head 的值*headpp loc_head;}对应程序的运行截图:图7-2程序修改后的运行截图修改替换create_list函数将其建成一个后进先出的链表后进先出链表的头指针始终指向最后创建的结点链头后建结点指向先建结点先建结点始终是尾结点。解答替换后的源程序清单// 修改后的 create_list 函数LIFO - 头部插入void create_list_lifo(struct s_list **headpp, int *p){struct s_list *new_node NULL; // 用于指向每次新创建的结点// 初始化 headpp 指向的头指针为 NULL*headpp NULL;while (*p ! 0) {// 1. 创建新结点 (new_node)new_node (struct s_list *)malloc(sizeof(struct s_list));if (new_node NULL) {printf(内存分配失败\n);return;}// 2. 填充数据域new_node-data *p;p; // 移动到下一个整数// 3. 核心 LIFO 逻辑头部插入// 新结点的 next 指向当前的链头 (*headpp)new_node-next *headpp;// 4. 更新链头将新结点设置为新的链头*headpp new_node;}// 循环结束后*headpp 就是指向最后创建的结点 (链头)}对应程序的运行截图图7-3程序替换题的运行截图3程序设计以下1至3题对应Educoder 教学平台“C语言实验”课程实验7第17关实验7-1、第18关实验7-2以及第19关实验7-3。1本关任务用单向链表建立一张班级成绩单包括每个学生的学号、姓名、英语、高等数学、普通物理、C语言程序设计四门课程的成绩。用菜单实现下列功能① 输入每个学生的各项信息。② 输出每个学生的各项信息。③ 修改指定学生的指定数据项的内容。④ 统计每个同学的平均成绩保留2位小数。⑤ 输出各位同学的学号、姓名、四门课程的总成绩和平均成绩。解答解题思路数据结构设计定义 struct student 结构体包含学号、姓名、四门课程成绩及平均成绩字段并用 next 指针构成链表。建立链表动态申请内存malloc按输入顺序将新节点尾插到链表中构成学生信息链表。遍历与输出从头指针开始遍历链表即可输出所有学生信息。修改功能根据学号查找节点选择要修改的成绩字段并更新其值。计算平均成绩与输出遍历链表计算每个学生的平均分并存入节点再次遍历输出总分与平均分。源程序清单#include stdio.h#include stdlib.h#include string.htypedef struct student {char id[20];char name[20];float eng, math, phy, cprog;float avg;struct student *next;} Stu;Stu* create(); //① 输入void print(Stu *head); //② 输出void modify(Stu *head);//③ 修改void calcAvg(Stu *head);//④ 统计平均void printAvg(Stu *head);//⑤ 输出总分和平均分int menu();int main() {Stu *head NULL;int choice;while(1) {choice menu();switch(choice) {case 1: head create(); break;case 2: print(head); break;case 3: modify(head); break;case 4: calcAvg(head); break;case 5: printAvg(head); break;case 0: exit(0);default: printf(输入错误\n);}}return 0;}int menu() {printf(\n 学生成绩管理系统 \n);printf(1. 输入学生信息\n);printf(2. 输出学生信息\n);printf(3. 修改指定学生信息\n);printf(4. 计算每位学生平均成绩\n);printf(5. 输出总分与平均分\n);printf(0. 退出\n);printf(请选择);int c; scanf(%d, c);return c;}Stu* create() {Stu *head NULL, *p, *tail NULL;int n;printf(请输入学生人数: );scanf(%d, n);for(int i 0; i n; i) {p (Stu*)malloc(sizeof(Stu));printf(输入 学号 姓名 英语 高数 物理 C语言 成绩\n);scanf(%s %s %f %f %f %f, p-id, p-name, p-eng, p-math, p-phy, p-cprog);p-avg 0;p-next NULL;if(head NULL) head p;else tail-next p;tail p;}return head;}void print(Stu *head) {Stu *p head;printf(\n学号\t姓名\t英语\t高数\t物理\tC语言\n);while(p) {printf(%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n,p-id, p-name, p-eng, p-math, p-phy, p-cprog);p p-next;}}void modify(Stu *head) {char id[20];printf(输入要修改的学生学号: );scanf(%s, id);Stu *p head;while(p strcmp(p-id, id) ! 0) p p-next;if(!p) { printf(未找到该学生\n); return; }printf(选择要修改的科目1英语 2高数 3物理 4C语言\n);int c; scanf(%d, c);float score;printf(输入新成绩: ); scanf(%f, score);if(c 1) p-eng score;else if(c 2) p-math score;else if(c 3) p-phy score;else if(c 4) p-cprog score;else printf(输入无效\n);}void calcAvg(Stu *head) {Stu *p head;while(p) {p-avg (p-eng p-math p-phy p-cprog) / 4.0;p p-next;}printf(平均分计算完成\n);}void printAvg(Stu *head) {Stu *p head;printf(\n学号\t姓名\t总分\t平均分\n);while(p) {float sum p-eng p-math p-phy p-cprog;printf(%s\t%s\t%.2f\t%.2f\n, p-id, p-name, sum, p-avg);p p-next;}}测试各项功能的运行截图图7-4程序设计题1的运行截图2本关任务对程序设计题第1题的程序⑥增加按照平均成绩进行升序排序的函数写出用交换结点数据域的方法升序排序的函数排序可用选择法或冒泡法。解答解题思路前提条件平均成绩已计算完成任务一的基础。排序策略可使用冒泡法或选择法本质都是比较两个节点的 avg 值。交换方式不改变节点之间指针关系而是直接交换结构体中的数据项包括姓名、分数等字段。源程序清单“#include stdio.h#include stdlib.h#include string.htypedef struct student {char id[20];char name[20];float eng, math, phy, cprog;float avg;struct student *next;} Stu;Stu* create(); //① 输入void print(Stu *head); //② 输出void modify(Stu *head);//③ 修改void calcAvg(Stu *head);//④ 统计平均void printAvg(Stu *head);//⑤ 输出总分和平均分void sortDataSwap(Stu *head);int menu();int main() {Stu *head NULL;int choice;while(1) {choice menu();switch(choice) {case 1: head create(); break;case 2: print(head); break;case 3: modify(head); break;case 4: calcAvg(head); break;case 5: printAvg(head); break;case 6: sortDataSwap(head); break;case 0: exit(0);default: printf(输入错误\n);}}return 0;}int menu() {printf(\n 学生成绩管理系统 \n);printf(1. 输入学生信息\n);printf(2. 输出学生信息\n);printf(3. 修改指定学生信息\n);printf(4. 计算每位学生平均成绩\n);printf(5. 输出总分与平均分\n);printf(6. 按平均成绩排序(交换数据域)\n);printf(0. 退出\n);printf(请选择);int c; scanf(%d, c);return c;}Stu* create() {Stu *head NULL, *p, *tail NULL;int n;printf(请输入学生人数: );scanf(%d, n);for(int i 0; i n; i) {p (Stu*)malloc(sizeof(Stu));printf(输入 学号 姓名 英语 高数 物理 C语言 成绩\n);scanf(%s %s %f %f %f %f, p-id, p-name, p-eng, p-math, p-phy, p-cprog);p-avg 0;p-next NULL;if(head NULL) head p;else tail-next p;tail p;}return head;}void print(Stu *head) {Stu *p head;printf(\n学号\t姓名\t英语\t高数\t物理\tC语言\n);while(p) {printf(%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n,p-id, p-name, p-eng, p-math, p-phy, p-cprog);p p-next;}}void modify(Stu *head) {char id[20];printf(输入要修改的学生学号: );scanf(%s, id);Stu *p head;while(p strcmp(p-id, id) ! 0) p p-next;if(!p) { printf(未找到该学生\n); return; }printf(选择要修改的科目1英语 2高数 3物理 4C语言\n);int c; scanf(%d, c);float score;printf(输入新成绩: ); scanf(%f, score);if(c 1) p-eng score;else if(c 2) p-math score;else if(c 3) p-phy score;else if(c 4) p-cprog score;else printf(输入无效\n);}void calcAvg(Stu *head) {Stu *p head;while(p) {p-avg (p-eng p-math p-phy p-cprog) / 4.0;p p-next;}printf(平均分计算完成\n);}void printAvg(Stu *head) {Stu *p head;printf(\n学号\t姓名\t总分\t平均分\n);while(p) {float sum p-eng p-math p-phy p-cprog;printf(%s\t%s\t%.2f\t%.2f\n, p-id, p-name, sum, p-avg);p p-next;}}void sortDataSwap(Stu *head) {Stu *p, *q;Stu temp;for(p head; p p-next; p p-next) {for(q p-next; q; q q-next) {if(p-avg q-avg) { // 升序temp *p; *p *q; *q temp;// 修正 next 指针被交换的问题Stu *t p-next;p-next q-next;q-next t;}}}printf(已按平均成绩升序排序数据域交换\n);}测试各项功能的运行截图图7-5程序设计题2的运行截图本关任务对程序设计题第2题进一步写出用交换结点指针域的方法升序排序的函数。解题思路指针操作代替数据交换找出当前循环中平均分最小的节点用指针操作将其移动到正确位置。排序方法通常采用选择排序思想每轮从剩余链表中找出最小 avg 节点并将指针调整到指定位置源程序清单#includestdio.h#includestdlib.h#includestring.htypedefstructstudent{charid[20];charname[20];floateng, math, phy, cprog;floatavg;structstudent* next;}Stu;Stu* create();//①输入voidprint(Stu*head);//②输出voidmodify(Stu*head);//③修改voidcalcAvg(Stu*head);//④统计平均voidprintAvg(Stu*head);//⑤输出总分和平均分voidsortDataSwap(Stu*head);Stu* sortPointerSwap(Stu*head);intmenu();intmain() {Stu* head NULL;intchoice;while(1) {choice menu();switch(choice) {case1: head create();break;case2: print(head);break;case3: modify(head);break;case4: calcAvg(head);break;case5: printAvg(head);break;case6: sortDataSwap(head);break;case7: head sortPointerSwap(head);break;case0: exit(0);default: printf(输入错误\n);}}return0;}intmenu() {printf(\n学生成绩管理系统\n);printf(1.输入学生信息\n);printf(2.输出学生信息\n);printf(3.修改指定学生信息\n);printf(4.计算每位学生平均成绩\n);printf(5.输出总分与平均分\n);printf(6.按平均成绩排序(交换数据域)\n);printf(7.按平均成绩排序(交换指针域)\n);printf(0.退出\n);printf(请选择);intc; scanf(%d, c);returnc;}Stu* create() {Stu* head NULL, * p, * tail NULL;intn;printf(请输入学生人数: );scanf(%d, n);for(inti 0; i n; i) {p (Stu*)malloc(sizeof(Stu));printf(输入学号姓名英语高数物理C语言成绩\n);scanf(%s %s %f %f %f %f, p-id, p-name, p-eng, p-math, p-phy, p-cprog);p-avg 0;p-next NULL;if(head NULL) head p;elsetail-next p;tail p;}returnhead;}voidprint(Stu*head) {Stu* p head;printf(\n学号\t姓名\t英语\t高数\t物理\tC语言\n);while(p) {printf(%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n,p-id, p-name, p-eng, p-math, p-phy, p-cprog);p p-next;}}voidmodify(Stu*head) {charid[20];printf(输入要修改的学生学号: );scanf(%s, id);Stu* p head;while(p strcmp(p-id, id) ! 0) p p-next;if(!p) { printf(未找到该学生\n);return; }printf(选择要修改的科目1英语2高数3物理4C语言\n);intc; scanf(%d, c);floatscore;printf(输入新成绩: ); scanf(%f, score);if(c 1) p-eng score;elseif(c 2) p-math score;elseif(c 3) p-phy score;elseif(c 4) p-cprog score;elseprintf(输入无效\n);}voidcalcAvg(Stu*head) {Stu* p head;while(p) {p-avg (p-eng p-math p-phy p-cprog) / 4.0;p p-next;}printf(平均分计算完成\n);}voidprintAvg(Stu*head) {Stu* p head;printf(\n学号\t姓名\t总分\t平均分\n);while(p) {floatsum p-eng p-math p-phy p-cprog;printf(%s\t%s\t%.2f\t%.2f\n, p-id, p-name, sum, p-avg);p p-next;}}voidsortDataSwap(Stu*head) {Stu* p, * q;Stutemp;for(p head; p p-next; p p-next) {for(q p-next; q; q q-next) {if(p-avg q-avg) {//升序temp *p; *p *q; *q temp;//修正next指针被交换的问题Stu* t p-next;p-next q-next;q-next t;}}}printf(已按平均成绩升序排序数据域交换\n);}Stu* sortPointerSwap(Stu*head) {if(!head)returnhead;Studummy, * p, * q, * minPrev, * prev;dummy.next head;prev dummy;while(prev-next) {minPrev prev;q prev-next;while(q-next) {if(q-next-avg minPrev-next-avg)minPrev q;q q-next;}if(minPrev ! prev) {//交换节点指针Stu* minNode minPrev-next;minPrev-next minNode-next;minNode-next prev-next;prev-next minNode;}prev prev-next;}printf(已按平均成绩升序排序指针域交换\n);returndummy.next;}测试各项功能的运行截图图7-6程序设计题3的运行截图7.3实验小结通过本次链表成绩管理系统的实现我不仅掌握了单向链表的建立、遍历和修改等基本操作还深入理解了结构体在数据组织中的作用在完成平均成绩计算和排序功能的过程中我体会到不同排序方法在链表结构中的实现差异尤其是交换数据域与交换指针域的逻辑思想使我对链表在动态数据管理中的优势有了更加直观而深刻的认识也提升了我分析问题和模块化设计程序的能力。实验7 结构与联合实验7.1实验目的1通过实验熟悉和掌握结构的说明和引用、结构的指针、结构数组、以及函数中使用结构的方法。2通过实验掌握动态储存分配函数的用法掌握自引用结构单向链表的创建、遍历、结点的增删、查找等操作。3了解字段结构和联合的用法。7.2实验题目及要求1表达式求值的程序验证题设有说明char u[]UVWXYZ;char v[]xyz;struct T{int x;char c;char *t;}a[]{{11,ˊAˊ,u},{100, ˊBˊ,v}},*pa;请先自己计算下面表达式的值然后通过编程计算来加以验证。(各表达式相互无关)序号表达式计算值验证值1(p)-x2p,p-c3*p-t,*p-t4*(p)-t5*p-t6*p-t解答计算值从上至下依次为100BUxxVV用以验证计算值的源程序清单#includestdio.h#includestring.hstructT{intx;charc;char* t;};charu_data[] UVWXYZ;charv_data[] xyz;constcharu_backup[] UVWXYZ;constcharv_backup[] xyz;structTa_data[] {{11,A, u_data},{100,B, v_data}};structT* p a_data;voidreset_p() {p a_data;memcpy(u_data, u_backup,sizeof(u_backup));memcpy(v_data, v_backup,sizeof(v_backup));a_data[0].t u_data;a_data[1].t v_data;}intmain() {intval_int;charval_char;charval_char1, val_char2;printf(验证值:\n);// 1. (p)-xreset_p();val_int (p)-x;printf(1: %d\n, val_int);// 2. p, p-creset_p();val_char (p, p-c);printf(2: %c\n, val_char);// 3. *p-t, *p-treset_p();val_char1 *p-t;val_char2 *p-t;printf(3: %c, %c\n, val_char1, val_char2);// 4. *(p)-treset_p();val_char *(p)-t;printf(4: %c\n, val_char);// 5. *p-treset_p();val_char *p-t;printf(5: %c\n, val_char);// 6. *p-treset_p();val_char * p-t;printf(6: %c\n, val_char);return0;}3验证程序的运行截图图7-1程序验证题对应程序的运行截图2源程序修改替换题给定一批整数以0作为结束标志且不作为结点将其建成一个先进先出的链表先进先出链表的指头指针始终指向最先创建的结点链头先建结点指向后建结点后建结点始终是尾结点。源程序中存在什么样的错误先观察执行结果对程序进行修改、调试使之能够正确完成指定任务。源程序如下#include stdio.h#include stdlib.hstruct s_list{int data; /* 数据域 */struct s_list *next; /* 指针域 */} ;void create_list (struct s_list *headp,int *p);void main(void){struct s_list *headNULL,*p;int s[]{1,2,3,4,5,6,7,8,0}; /* 0为结束标记 */create_list(head,s); /* 创建新链表 */phead; /*遍历指针p指向链头 */while(p){printf(%d\t,p-data); /* 输出数据域的值 */pp-next; /*遍历指针p指向下一结点 */}printf(\n);}void create_list(struct s_list *headp,int *p){struct s_list * loc_headNULL,*tail;if(p[0]0) /* 相当于*p0 */;else { /* loc_head指向动态分配的第一个结点 */loc_head(struct s_list *)malloc(sizeof(struct s_list));loc_head-data*p; /* 对数据域赋值 */tailloc_head; /* tail指向第一个结点 */while(*p){ /* tail所指结点的指针域指向动态创建的结点 */tail-next(struct s_list *)malloc(sizeof(struct s_list));tailtail-next; /* tail指向新创建的结点 */tail-data*p; /* 向新创建的结点的数据域赋值 */}tail-nextNULL; /* 对指针域赋NULL值 */}headploc_head; /* 使头指针headp指向新创建的链表 */}解答错误修改main中对notes的调用错误notes的声明和定义错误应使用二级指针修改后的源程序清单#include stdio.h#include stdlib.hstruct s_list {int data;struct s_list *next;};// 接受二级指针struct s_list **void create_list(struct s_list **headpp, int *p);void main(void){struct s_list *head NULL, *p;int s[] {1, 2, 3, 4, 5, 6, 7, 8, 0};// 传递 head 的地址create_list(head, s);p head;printf(--- FIFO 链表输出 ---\n);while(p) {printf(%d\t, p-data);p p-next;}printf(\n);}// 修改后的 create_list 函数FIFOvoid create_list(struct s_list **headpp, int *p){struct s_list *loc_head NULL, *tail;if (*p 0); // 数组为空loc_head 保持 NULLelse {// 1. 创建第一个结点loc_head (struct s_list *)malloc(sizeof(struct s_list));if (loc_head NULL) return; // 检查内存分配loc_head-data *p;tail loc_head;// 2. 依次创建后续结点 (尾部插入)while (*p) {tail-next (struct s_list *)malloc(sizeof(struct s_list));if (tail-next NULL) break; // 检查内存分配tail tail-next;tail-data *p;}tail-next NULL;}// 3. 关键修正通过二级指针修改 main 函数中 head 的值*headpp loc_head;}对应程序的运行截图:图7-2程序修改后的运行截图修改替换create_list函数将其建成一个后进先出的链表后进先出链表的头指针始终指向最后创建的结点链头后建结点指向先建结点先建结点始终是尾结点。解答替换后的源程序清单// 修改后的 create_list 函数LIFO - 头部插入void create_list_lifo(struct s_list **headpp, int *p){struct s_list *new_node NULL; // 用于指向每次新创建的结点// 初始化 headpp 指向的头指针为 NULL*headpp NULL;while (*p ! 0) {// 1. 创建新结点 (new_node)new_node (struct s_list *)malloc(sizeof(struct s_list));if (new_node NULL) {printf(内存分配失败\n);return;}// 2. 填充数据域new_node-data *p;p; // 移动到下一个整数// 3. 核心 LIFO 逻辑头部插入// 新结点的 next 指向当前的链头 (*headpp)new_node-next *headpp;// 4. 更新链头将新结点设置为新的链头*headpp new_node;}// 循环结束后*headpp 就是指向最后创建的结点 (链头)}对应程序的运行截图图7-3程序替换题的运行截图3程序设计以下1至3题对应Educoder 教学平台“C语言实验”课程实验7第17关实验7-1、第18关实验7-2以及第19关实验7-3。1本关任务用单向链表建立一张班级成绩单包括每个学生的学号、姓名、英语、高等数学、普通物理、C语言程序设计四门课程的成绩。用菜单实现下列功能① 输入每个学生的各项信息。② 输出每个学生的各项信息。③ 修改指定学生的指定数据项的内容。④ 统计每个同学的平均成绩保留2位小数。⑤ 输出各位同学的学号、姓名、四门课程的总成绩和平均成绩。解答解题思路数据结构设计定义 struct student 结构体包含学号、姓名、四门课程成绩及平均成绩字段并用 next 指针构成链表。建立链表动态申请内存malloc按输入顺序将新节点尾插到链表中构成学生信息链表。遍历与输出从头指针开始遍历链表即可输出所有学生信息。修改功能根据学号查找节点选择要修改的成绩字段并更新其值。计算平均成绩与输出遍历链表计算每个学生的平均分并存入节点再次遍历输出总分与平均分。源程序清单#include stdio.h#include stdlib.h#include string.htypedef struct student {char id[20];char name[20];float eng, math, phy, cprog;float avg;struct student *next;} Stu;Stu* create(); //① 输入void print(Stu *head); //② 输出void modify(Stu *head);//③ 修改void calcAvg(Stu *head);//④ 统计平均void printAvg(Stu *head);//⑤ 输出总分和平均分int menu();int main() {Stu *head NULL;int choice;while(1) {choice menu();switch(choice) {case 1: head create(); break;case 2: print(head); break;case 3: modify(head); break;case 4: calcAvg(head); break;case 5: printAvg(head); break;case 0: exit(0);default: printf(输入错误\n);}}return 0;}int menu() {printf(\n 学生成绩管理系统 \n);printf(1. 输入学生信息\n);printf(2. 输出学生信息\n);printf(3. 修改指定学生信息\n);printf(4. 计算每位学生平均成绩\n);printf(5. 输出总分与平均分\n);printf(0. 退出\n);printf(请选择);int c; scanf(%d, c);return c;}Stu* create() {Stu *head NULL, *p, *tail NULL;int n;printf(请输入学生人数: );scanf(%d, n);for(int i 0; i n; i) {p (Stu*)malloc(sizeof(Stu));printf(输入 学号 姓名 英语 高数 物理 C语言 成绩\n);scanf(%s %s %f %f %f %f, p-id, p-name, p-eng, p-math, p-phy, p-cprog);p-avg 0;p-next NULL;if(head NULL) head p;else tail-next p;tail p;}return head;}void print(Stu *head) {Stu *p head;printf(\n学号\t姓名\t英语\t高数\t物理\tC语言\n);while(p) {printf(%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n,p-id, p-name, p-eng, p-math, p-phy, p-cprog);p p-next;}}void modify(Stu *head) {char id[20];printf(输入要修改的学生学号: );scanf(%s, id);Stu *p head;while(p strcmp(p-id, id) ! 0) p p-next;if(!p) { printf(未找到该学生\n); return; }printf(选择要修改的科目1英语 2高数 3物理 4C语言\n);int c; scanf(%d, c);float score;printf(输入新成绩: ); scanf(%f, score);if(c 1) p-eng score;else if(c 2) p-math score;else if(c 3) p-phy score;else if(c 4) p-cprog score;else printf(输入无效\n);}void calcAvg(Stu *head) {Stu *p head;while(p) {p-avg (p-eng p-math p-phy p-cprog) / 4.0;p p-next;}printf(平均分计算完成\n);}void printAvg(Stu *head) {Stu *p head;printf(\n学号\t姓名\t总分\t平均分\n);while(p) {float sum p-eng p-math p-phy p-cprog;printf(%s\t%s\t%.2f\t%.2f\n, p-id, p-name, sum, p-avg);p p-next;}}测试各项功能的运行截图图7-4程序设计题1的运行截图2本关任务对程序设计题第1题的程序⑥增加按照平均成绩进行升序排序的函数写出用交换结点数据域的方法升序排序的函数排序可用选择法或冒泡法。解答解题思路前提条件平均成绩已计算完成任务一的基础。排序策略可使用冒泡法或选择法本质都是比较两个节点的 avg 值。交换方式不改变节点之间指针关系而是直接交换结构体中的数据项包括姓名、分数等字段。源程序清单“#include stdio.h#include stdlib.h#include string.htypedef struct student {char id[20];char name[20];float eng, math, phy, cprog;float avg;struct student *next;} Stu;Stu* create(); //① 输入void print(Stu *head); //② 输出void modify(Stu *head);//③ 修改void calcAvg(Stu *head);//④ 统计平均void printAvg(Stu *head);//⑤ 输出总分和平均分void sortDataSwap(Stu *head);int menu();int main() {Stu *head NULL;int choice;while(1) {choice menu();switch(choice) {case 1: head create(); break;case 2: print(head); break;case 3: modify(head); break;case 4: calcAvg(head); break;case 5: printAvg(head); break;case 6: sortDataSwap(head); break;case 0: exit(0);default: printf(输入错误\n);}}return 0;}int menu() {printf(\n 学生成绩管理系统 \n);printf(1. 输入学生信息\n);printf(2. 输出学生信息\n);printf(3. 修改指定学生信息\n);printf(4. 计算每位学生平均成绩\n);printf(5. 输出总分与平均分\n);printf(6. 按平均成绩排序(交换数据域)\n);printf(0. 退出\n);printf(请选择);int c; scanf(%d, c);return c;}Stu* create() {Stu *head NULL, *p, *tail NULL;int n;printf(请输入学生人数: );scanf(%d, n);for(int i 0; i n; i) {p (Stu*)malloc(sizeof(Stu));printf(输入 学号 姓名 英语 高数 物理 C语言 成绩\n);scanf(%s %s %f %f %f %f, p-id, p-name, p-eng, p-math, p-phy, p-cprog);p-avg 0;p-next NULL;if(head NULL) head p;else tail-next p;tail p;}return head;}void print(Stu *head) {Stu *p head;printf(\n学号\t姓名\t英语\t高数\t物理\tC语言\n);while(p) {printf(%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n,p-id, p-name, p-eng, p-math, p-phy, p-cprog);p p-next;}}void modify(Stu *head) {char id[20];printf(输入要修改的学生学号: );scanf(%s, id);Stu *p head;while(p strcmp(p-id, id) ! 0) p p-next;if(!p) { printf(未找到该学生\n); return; }printf(选择要修改的科目1英语 2高数 3物理 4C语言\n);int c; scanf(%d, c);float score;printf(输入新成绩: ); scanf(%f, score);if(c 1) p-eng score;else if(c 2) p-math score;else if(c 3) p-phy score;else if(c 4) p-cprog score;else printf(输入无效\n);}void calcAvg(Stu *head) {Stu *p head;while(p) {p-avg (p-eng p-math p-phy p-cprog) / 4.0;p p-next;}printf(平均分计算完成\n);}void printAvg(Stu *head) {Stu *p head;printf(\n学号\t姓名\t总分\t平均分\n);while(p) {float sum p-eng p-math p-phy p-cprog;printf(%s\t%s\t%.2f\t%.2f\n, p-id, p-name, sum, p-avg);p p-next;}}void sortDataSwap(Stu *head) {Stu *p, *q;Stu temp;for(p head; p p-next; p p-next) {for(q p-next; q; q q-next) {if(p-avg q-avg) { // 升序temp *p; *p *q; *q temp;// 修正 next 指针被交换的问题Stu *t p-next;p-next q-next;q-next t;}}}printf(已按平均成绩升序排序数据域交换\n);}测试各项功能的运行截图图7-5程序设计题2的运行截图本关任务对程序设计题第2题进一步写出用交换结点指针域的方法升序排序的函数。解题思路指针操作代替数据交换找出当前循环中平均分最小的节点用指针操作将其移动到正确位置。排序方法通常采用选择排序思想每轮从剩余链表中找出最小 avg 节点并将指针调整到指定位置源程序清单#includestdio.h#includestdlib.h#includestring.htypedefstructstudent{charid[20];charname[20];floateng, math, phy, cprog;floatavg;structstudent* next;}Stu;Stu* create();//①输入voidprint(Stu*head);//②输出voidmodify(Stu*head);//③修改voidcalcAvg(Stu*head);//④统计平均voidprintAvg(Stu*head);//⑤输出总分和平均分voidsortDataSwap(Stu*head);Stu* sortPointerSwap(Stu*head);intmenu();intmain() {Stu* head NULL;intchoice;while(1) {choice menu();switch(choice) {case1: head create();break;case2: print(head);break;case3: modify(head);break;case4: calcAvg(head);break;case5: printAvg(head);break;case6: sortDataSwap(head);break;case7: head sortPointerSwap(head);break;case0: exit(0);default: printf(输入错误\n);}}return0;}intmenu() {printf(\n学生成绩管理系统\n);printf(1.输入学生信息\n);printf(2.输出学生信息\n);printf(3.修改指定学生信息\n);printf(4.计算每位学生平均成绩\n);printf(5.输出总分与平均分\n);printf(6.按平均成绩排序(交换数据域)\n);printf(7.按平均成绩排序(交换指针域)\n);printf(0.退出\n);printf(请选择);intc; scanf(%d, c);returnc;}Stu* create() {Stu* head NULL, * p, * tail NULL;intn;printf(请输入学生人数: );scanf(%d, n);for(inti 0; i n; i) {p (Stu*)malloc(sizeof(Stu));printf(输入学号姓名英语高数物理C语言成绩\n);scanf(%s %s %f %f %f %f, p-id, p-name, p-eng, p-math, p-phy, p-cprog);p-avg 0;p-next NULL;if(head NULL) head p;elsetail-next p;tail p;}returnhead;}voidprint(Stu*head) {Stu* p head;printf(\n学号\t姓名\t英语\t高数\t物理\tC语言\n);while(p) {printf(%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n,p-id, p-name, p-eng, p-math, p-phy, p-cprog);p p-next;}}voidmodify(Stu*head) {charid[20];printf(输入要修改的学生学号: );scanf(%s, id);Stu* p head;while(p strcmp(p-id, id) ! 0) p p-next;if(!p) { printf(未找到该学生\n);return; }printf(选择要修改的科目1英语2高数3物理4C语言\n);intc; scanf(%d, c);floatscore;printf(输入新成绩: ); scanf(%f, score);if(c 1) p-eng score;elseif(c 2) p-math score;elseif(c 3) p-phy score;elseif(c 4) p-cprog score;elseprintf(输入无效\n);}voidcalcAvg(Stu*head) {Stu* p head;while(p) {p-avg (p-eng p-math p-phy p-cprog) / 4.0;p p-next;}printf(平均分计算完成\n);}voidprintAvg(Stu*head) {Stu* p head;printf(\n学号\t姓名\t总分\t平均分\n);while(p) {floatsum p-eng p-math p-phy p-cprog;printf(%s\t%s\t%.2f\t%.2f\n, p-id, p-name, sum, p-avg);p p-next;}}voidsortDataSwap(Stu*head) {Stu* p, * q;Stutemp;for(p head; p p-next; p p-next) {for(q p-next; q; q q-next) {if(p-avg q-avg) {//升序temp *p; *p *q; *q temp;//修正next指针被交换的问题Stu* t p-next;p-next q-next;q-next t;}}}printf(已按平均成绩升序排序数据域交换\n);}Stu* sortPointerSwap(Stu*head) {if(!head)returnhead;Studummy, * p, * q, * minPrev, * prev;dummy.next head;prev dummy;while(prev-next) {minPrev prev;q prev-next;while(q-next) {if(q-next-avg minPrev-next-avg)minPrev q;q q-next;}if(minPrev ! prev) {//交换节点指针Stu* minNode minPrev-next;minPrev-next minNode-next;minNode-next prev-next;prev-next minNode;}prev prev-next;}printf(已按平均成绩升序排序指针域交换\n);returndummy.next;}测试各项功能的运行截图图7-6程序设计题3的运行截图7.3实验小结通过本次链表成绩管理系统的实现我不仅掌握了单向链表的建立、遍历和修改等基本操作还深入理解了结构体在数据组织中的作用在完成平均成绩计算和排序功能的过程中我体会到不同排序方法在链表结构中的实现差异尤其是交换数据域与交换指针域的逻辑思想使我对链表在动态数据管理中的优势有了更加直观而深刻的认识也提升了我分析问题和模块化设计程序的能力。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

江阴网站制作wordpress插件安装教程视频

在人工智能的浪潮中,大模型(LLM)驱动的智能体(Agent)正从单一的问答工具,演变为具备复杂规划、工具使用和记忆能力的自主实体。当这些智能体不再是孤立的存在,开始相互协作、交流,形…

张小明 2025/12/30 21:55:02 网站建设

房地产集团网站模板佛山企业网站建设

无需训练即可复刻声音:EmotiVoice的零样本克隆奇迹 在虚拟主播深夜直播时用“疲惫中带着温柔”的语气讲述故事,或游戏角色在重伤濒死时发出颤抖而沙哑的呼喊——这些曾依赖专业配音演员和后期制作的场景,如今只需几秒录音和一行代码就能实现…

张小明 2025/12/30 21:55:00 网站建设

公司建设网站价格多少钱装修公司报价明细表范本

Qwen3-VL-30B能否在CUDA 12.x环境稳定运行?一文讲透部署真相! 你是不是也遇到过这种尴尬场面:手握一张H100,显卡风扇呼呼转,心里盘算着跑Qwen3-VL-30B做多图推理,结果刚一执行model.to(cuda)就报错&#xf…

张小明 2025/12/30 23:56:54 网站建设

高端外贸网站建设深汕特别合作区属于深圳吗

AUTOSAR实战解析:从BSW到RTE的工程落地之路一场关于“解耦”的革命:为什么汽车软件需要AUTOSAR?你有没有遇到过这样的场景?一款新车型上市,ECU换了颗芯片——结果整个应用层代码几乎要重写;或者两个不同供应…

张小明 2025/12/30 14:18:53 网站建设

网站建设实训结论和体会计算机网站建设开题报告

GPT-SoVITS语音过渡自然度主观评分 在虚拟主播流畅讲述双语故事、失语者用自己“原声”重新开口说话的今天,我们正见证着语音合成技术从“能听”向“像人”的深刻跃迁。尤其当一句话结束与下一句开始之间的那半秒停顿——既不过长如死寂,也不仓促如断电&…

张小明 2025/12/30 23:56:49 网站建设

建设部网站一级开发资质中企动力 网站建设 收费

摘要:社交辅助机器人(SARs)作为新兴数字疗法(DTx)工具,正深度融合人工智能与医疗健康领域,成为数字健康(DH)生态的核心组成部分。SARs 通过传感器数据采集、多设备协同&a…

张小明 2025/12/30 23:56:47 网站建设