#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define NULL 0 //在个别编译器已经定义了该符号常量,此时会有warning,但保留好
typedef int Status;
typedef struct Score{ //很多学生将此处写作Student不合理!
char stuName[20]; char courseName[20]; float score;
}Score;
typedef Score ElemType;
typedef struct{
ElemType* elem; //存放元素的动态数组 首地址(动态数组名)
int length; //学生个数
}SqList;//顺序表类型定义,一个包含数组首址(数组名) 和 表长的结构体类型。命名为ScoList如何?
void InputSco(Score &score){ //此处返回取值类型为void或Status均可
printf("请输入学生姓名:");gets(score.stuName); //输入提示语句很重要!
printf("请输入课程姓名:");gets(score.courseName);
printf("请输入分数:");scanf("%f",& score.score);
getchar(); //此处用以读取输入完分数后用户键入的回车符,否则回车会被作为下一个学生
//的姓名读入。若下一个输入的数据不是字符或者字符串就没事了
}
void OutputSco(Score score){ //需要加&吗?
printf("学生:%10s", score.stuName); //输出提示同样重要!
printf("课程:%16s", score.courseName); //注意格式控制
printf("分数:%8.1f\n", score.score); //注意格式控制符里面\n 的作用和好处
}
//Status InputElem(ElemType &s){InputSco(s);}
//Status OutputElem(ElemType s){OutputSco(s);}
void InputElem(ElemType &s){InputSco(s);}
void OutputElem(ElemType s){OutputSco(s);}
Status ListCreate_Sq (SqList &L) //注意函数名后面的_Sq
//实际将元素个数的读取放入此函数更合理
//创建顺序表,成功返回OK,并用L带回
//创建失败返回ERROR
//思路:输入个数,开辟数组,循环:每次输入一个元素信息
{
printf("请输入元素个数:");
scanf("%d",&L.length);
getchar();//读取输入缓冲区里面的回车符,以防被后面的字符串输入函数读取
if(L.length<=0)return ERROR;
L.elem=(ElemType *)malloc(L.length*sizeof(ElemType)); //Score *不好,因后者使得函数通用性差
if(!L.elem)exit(OVERFLOW); //!L.elem也可写作L.elem==NULL
printf("请输入各条记录的信息:\n");
for(int i=0;i<L.length;++i) //指针法如何改写?
InputElem(L.elem[i]); //此处不宜写InputSco,道理同上面。另外,注意越界!
return OK;
}
void ListPrint_Sq (SqList L) //此处不应再拿n作参数,为什么?
//输出表信息
//思路:循环L.length次:每次输出一个元素信息。
{
if(!L.elem)printf("表为空!\n");
else
{
printf("该表共含有%d条记录,各记录信息如下:\n",L.length);
for(int i=0;i<L.length; ++i) //指针法如何改写?
OutputElem(L.elem[i]); //此处不宜写OutputSco,道理同上面
}
}
Status ListDelete_Sq (SqList &L, int i,ElemType &s) //注意此处L应该为引用型,否则表长不会被改变
//删除第i个位置的元素并带回,i代表位序,从1开始
//成功返回OK, 失败返回ERROR
//思路:备份原表中第i个元素, 第i+1至n个记录依次前移
{
if(i<=0||i>L.length||!L.elem)return ERROR;
s=L.elem[i-1]; //若分成员赋值,则字符串赋值不能用=,应用strcpy
for(int k=i;k<L.length;k++) //k代表要移动的元素的下标
L.elem[k-1]=L.elem[k]; //k or i? 若分成员赋值,则字符串赋值不能用=,应用strcpy
--L.length;
return OK;
}
int main(){ //main返回值类型的选择
int n;
SqList L;
ElemType e;
if(ListCreate_Sq(L)){ // 判断条件也可写作ListCreate_Sq(L)==OK
ListPrint_Sq(L);
int k;
printf("清输入要删除的记录的序号(从1开始):");
scanf("%d",&k);
if(ListDelete_Sq(L,k,e)==OK)
{
printf("您删除的记录信息如下:\n");
OutputElem(e);
printf("删除后的表信息如下:\n");
ListPrint_Sq(L);
}
else
printf("删除结点失败!\n"); //失败的情况也应处理
}
else
printf("创建表失败!");
return OK;
}
Kinonoyomeo
- 粉丝: 94
- 资源: 1万+
最新资源
- MySQL的重点知识和使用
- 机器人及自动驾驶SLAM定位知识体系构建思维导图
- 本人项目进行中采集的数据集,包含原始数据和处理后的数据,项目持续更新 .zip
- 安卓项目源码AndroidPlayer(仿酷狗播放器)
- 四旋翼无人机,进行simulink建模与仿真,对它的运动学模型和动力学模型进行了必要且详细的研究和分析,运用牛顿-欧拉方程建立了四旋翼的运动学和动力学方程,最后推导出四个旋翼的角速度表达式 采用了一
- 标注自己的数据集,训练、评估、测试、部署自己的人工智能算法.zip
- 安卓项目源码AndroidTXT文本阅读器源码
- BLDC无刷直流电机matlab仿真,转速电流双闭环控制,有感或无感相方式,电机模型自带反电动势输出,默认用无感反电动势过零相方式,里面有霍尔信号(未使用),Simulink仿真
- 目标检测数据集制作VOC、COCO、YOLO等常用数据集格式的制作和常用脚本.zip
- 基于matlab的改进的量子遗传算法对多变量函数寻优完整代码,内容详细,包含运行说明,该代码在量子旋转门调整中做了一些改进,在“Qgate1”中可以看到,旋转角度并不是固定不变的,而是将其与适应度以及
- 安卓项目源码android豆瓣手机客户端源码
- 目标检测数据集标注工具.zip
- postgis-1.5.6.tar.gz
- postgis-1.5.7.tar.gz
- 三菱电梯LEHY-Pro电梯地址码
- postgis-1.5.8.tar.gz
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈