algo2-3-1.c 利用无头结点的单链表结构处理教科书图2.1(学生健康登记表)

本文主要是介绍algo2-3-1.c 利用无头结点的单链表结构处理教科书图2.1(学生健康登记表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 /* algo2-6.c 利用无头结点的单链表结构处理教科书图2.1(学生健康登记表) */
 #include"c1.h"
 #define NAMELEN 8 /* 姓名最大长度 */
 #define CLASSLEN 4 /* 班级名最大长度 */
 typedef struct
 {
   char name[NAMELEN+1]; /* 包括'\0' */
   long num;
   char sex;
   int age;
   char Class[CLASSLEN+1]; /* 包括'\0' */
   int health;
 }stud; /* 记录的结构 */


 typedef stud ElemType; /* 链表结点元素类型为结构体 */
 #include"c2-2.h"
 #include"bo2-8.c" /* 无头结点单链表的部分基本操作 */
 #include"func2-1.c" /* 无头结点单链表的扩展操作 */
 char sta[3][9]={"健康  ","一般  ","神经衰弱"}; /* 健康状况(3类) */
 FILE *fp; /* 全局变量 */

 void Print(stud e)
 { /* 显示记录e的内容 */
   printf("%-8s %6ld",e.name,e.num);
   if(e.sex=='m')
     printf(" 男");
   else
     printf(" 女");
   printf("%5d  %-4s",e.age,e.Class);
   printf("%9s\n",sta[e.health]);
 }

 void ReadIn(stud *e)
 { /* 由键盘输入结点信息 */
   printf("请输入姓名(<=%d个字符): ",NAMELEN);
   scanf("%s",(*e).name);
   printf("请输入学号: ");
   scanf("%ld",&(*e).num);
   printf("请输入性别(m:男 f:女): ");
   scanf("%*c%c",&(*e).sex);
   printf("请输入年龄: ");
   scanf("%d",&(*e).age);
   printf("请输入班级(<=%d个字符): ",CLASSLEN);
   scanf("%s",(*e).Class);
   printf("请输入健康状况(0:%s 1:%s 2:%s):",sta[0],sta[1],sta[2]);
   scanf("%d",&(*e).health);
 }

 void WriteToFile(stud e)
 { /* 将结点信息写入fp指定的文件 */
   fwrite(&e,sizeof(stud),1,fp);
 }

 Status ReadFromFile(stud *e)
 { /* 由fp指定的文件读取结点信息到e */
   int i;
   i=fread(e,sizeof(stud),1,fp);
   if(i==1) /* 读取文件成功 */
     return OK;
   else
     return ERROR;
 }

 int cmp(ElemType c1,ElemType c2)
 {
   return (int)(c1.num-c2.num);
 }

 void Modify(LinkList *L,ElemType e)
 { /* 修改结点内容,并按学号将结点非降序插入链表L */
   char s[80];
   Print(e); /* 显示原内容 */
   printf("请输入待修改项的内容,不修改的项按回车键保持原值:\n");
   printf("请输入姓名(<=%d个字符): ",NAMELEN);
   gets(s);
   if(strlen(s))
     strcpy(e.name,s);
   printf("请输入学号: ");
   gets(s);
   if(strlen(s))
     e.num=atol(s);
   printf("请输入性别(m:男 f:女): ");
   gets(s);
   if(strlen(s))
     e.sex=s[0];
   printf("请输入年龄: ");
   gets(s);
   if(strlen(s))
     e.age=atoi(s);
   printf("请输入班级(<=%d个字符): ",CLASSLEN);
   gets(s);
   if(strlen(s))
     strcpy(e.Class,s);
   printf("请输入健康状况(0:%s 1:%s 2:%s):",sta[0],sta[1],sta[2]);
   gets(s);
   if(strlen(s))
     e.health=atoi(s); /* 修改完毕 */
   InsertAscend(L,e,cmp); /* 把q所指结点的内容按学号非降序插入L(func2-1.c) */
 }

 #define N 4 /* student记录的个数 */

 Status EqualNum(ElemType c1,ElemType c2)
 {
   if(c1.num==c2.num)
     return OK;
   else
     return ERROR;
 }

 Status EqualName(ElemType c1,ElemType c2)
 {
   if(strcmp(c1.name,c2.name))
     return ERROR;
   else
     return OK;
 }

 void main()
 { /* 表的初始记录 */
   stud student[N]={{"王小林",790631,'m',18,"计91",0},{"陈红",790632,'f',20,"计91",1},
                    {"刘建平",790633,'m',21,"计91",0},{"张立立",790634,'m',17,"计91",2}};
   int i,j,flag=1;
   char filename[13];
   ElemType e;
   LinkList T,p,q;
   InitList(&T); /* 初始化链表 */
   while(flag)
   {
     printf("1:将结构体数组student中的记录按学号非降序插入链表\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:显示所有记录 11:将链表中的所有记录存入文件 12:结束\n");
     printf("请选择操作命令: ");
     scanf("%d",&i);
     switch(i)
     {
       case 1: for(j=0;j<N;j++)
   InsertAscend(&T,student[j],cmp); /* 在func2-1.c中 */
               break;
       case 2: printf("请输入文件名: ");
               scanf("%s",filename);
               if((fp=fopen(filename,"rb"))==NULL)
                 printf("打开文件失败!\n");
               else
               {
                 while(ReadFromFile(&e))
     InsertAscend(&T,e,cmp); /* 在func2-1.c中 */
                 fclose(fp);
               }
               break;
       case 3: ReadIn(&e);
        InsertAscend(&T,e,cmp); /* 在func2-1.c中 */
               break;
       case 4: printf("请输入待删除记录的学号: ");
               scanf("%ld",&e.num);
               if(!DeleteElem(&T,&e,EqualNum)) /* 在func2-1.c中 */
                 printf("没有学号为%ld的记录\n",e.num);
               break;
       case 5: printf("请输入待删除记录的姓名: ");
               scanf("%*c%s",e.name); /* %*c吃掉回车符 */
               if(!DeleteElem(&T,&e,EqualName)) /* 在func2-1.c中 */
                 printf("没有姓名为%s的记录\n",e.name);
               break;
       case 6: printf("请输入待修改记录的学号: ");
               scanf("%ld%*c",&e.num);
        if(!DeleteElem(&T,&e,EqualNum)) /* 在链表中删除该结点,并由e返回(func2-1.c) */
                 printf("没有学号为%ld的记录\n",e.num);
               else
                 Modify(&T,e); /* 修改e并按学号插入链表T */
               break;
       case 7: printf("请输入待修改记录的姓名: ");
               scanf("%*c%s%*c",e.name); /* %*c吃掉回车符 */
               if(!DeleteElem(&T,&e,EqualName)) /* func2-1.c */
                 printf("没有姓名为%s的记录\n",e.name);
               else
                 Modify(&T,e);
               break;
       case 8: printf("请输入待查找记录的学号: ");
               scanf("%ld",&e.num);
               q=Point(T,e,EqualNum,&p); /* func2-1.c */
               if(!q)
                 printf("没有学号为%ld的记录\n",e.num);
               else
                 Print(q->data);
               break;
       case 9: printf("请输入待查找记录的姓名: ");
               scanf("%*c%s",e.name);
               q=Point(T,e,EqualName,&p); /* func2-1.c */
               if(!q)
                 printf("没有姓名为%s的记录\n",e.name);
               else
                 Print(q->data);
               break;
       case 10:printf("  姓名    学号 性别 年龄 班级 健康状况\n");
               ListTraverse(T,Print);
               break;
       case 11:printf("请输入文件名: ");
               scanf("%s",filename);
               if((fp=fopen(filename,"wb"))==NULL)
                 printf("打开文件失败!\n");
               else
                 ListTraverse(T,WriteToFile);
               fclose(fp);
               break;
       case 12:flag=0;
     }
   }
 }

 

 

这篇关于algo2-3-1.c 利用无头结点的单链表结构处理教科书图2.1(学生健康登记表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/569048

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

【多系统萎缩患者必看】✨维生素补充全攻略,守护你的健康每一天!

亲爱的朋友们,今天我们要聊一个既重要又容易被忽视的话题——‌多系统萎缩患者如何科学补充维生素‌!🌟 在这个快节奏的生活中,健康成为了我们最宝贵的财富,而对于多系统萎缩(MSA)的患者来说,合理的营养补充更是维护身体机能、提升生活质量的关键一步。👇 🌈 为什么多系统萎缩患者需要特别关注维生素? 多系统萎缩是一种罕见且复杂的神经系统疾病,它影响身体的多个系统,包括自主神经、锥体外系、小脑及锥

明明的随机数处理问题分析与解决方案

明明的随机数处理问题分析与解决方案 引言问题描述解决方案数据结构设计具体步骤伪代码C语言实现详细解释读取输入去重操作排序操作输出结果复杂度分析 引言 明明生成了N个1到500之间的随机整数,我们需要对这些整数进行处理,删去重复的数字,然后进行排序并输出结果。本文将详细讲解如何通过算法、数据结构以及C语言来解决这个问题。我们将会使用数组和哈希表来实现去重操作,再利用排序算法对结果

8. 自然语言处理中的深度学习:从词向量到BERT

引言 深度学习在自然语言处理(NLP)领域的应用极大地推动了语言理解和生成技术的发展。通过从词向量到预训练模型(如BERT)的演进,NLP技术在机器翻译、情感分析、问答系统等任务中取得了显著成果。本篇博文将探讨深度学习在NLP中的核心技术,包括词向量、序列模型(如RNN、LSTM),以及BERT等预训练模型的崛起及其实际应用。 1. 词向量的生成与应用 词向量(Word Embedding)