数据结构 day3

 

目录

思维导图:

学习内容:

1. 顺序表

1.1 概念

1.2 有关顺序表的操作

1.2.1 创建顺序表

1.2.2 顺序表判空和判断满 

1.2.3 向顺序表中添加元素 

1.2.4 遍历顺序表 

 1.2.5 顺序表按位置进行插入元素

1.2.6 顺序表任意位置删除元素 

 1.2.7 按值进行查找位置函数

1.2.8 按位置修改函数 

1.2.9 按值修改函数 

课外作业:


思维导图:

055445247c8547658cc133ff184b4d79.png


学习内容:

1. 顺序表

1.1 概念

1. 顺序存储的线性表叫做顺序表

        线性表:说明该容器对应的逻辑结构为线性结构

        顺序存储:表示存储结构为顺序结构,就是使用连续的存储空间进行操作

2.  连续存储空间:可以使用数组来完成或者使用堆区空间

3.  顺序表的表示方式:除了使用一个连续的内存存储顺序表外,还需要外加一个表示顺序表实际长度的变量完成

c7625f2fb37b4b3fa07259cae2a592f7.png

4. 对顺序表长度的解析:

        1、顺序表的长度能够表示顺序表中实际使用的元素个数

        2、也能够表示数组中第一个没有存放数据元素的数组元素下标

        3、要遍历整个顺序表时,顺序表的长度是最大上限

5. 顺序表结构体类型

        

#define MAX 20          //顺序表最大容量
typedef int datatype;   //数据元素类型//定义顺序表结构体类型
typedef struct
{datatype data[MAX];   //存放顺序表的数组int len;             //顺序表的长度
}SeqList, *SeqListPtr;

1.2 有关顺序表的操作

1.2.1 创建顺序表

        1、可以在堆区申请一个顺序表,后面操作时,只需要将该顺序表的起始地址传递即可

        2、申请出顺序表的空间后,至少需要对顺序表的长度初始化

例如:

//定义顺序表的创建函数
SeqListPtr list_create()
{//在堆区申请一个顺序表的大小空间SeqListPtr L = (SeqListPtr)malloc(sizeof(SeqList));if(NULL == L){printf("创建失败\n");return NULL;}//程序执行至此,表示顺序表创建成功memset(L->data, 0, sizeof(L->data));    //将数组初始化L->len = 0;           //顺序表长度为0printf("创建成功\n");return L;
}

1.2.2 顺序表判空和判断满 

        1、对于添加顺序表元素的操作而言,需要判断顺序表是否已经满了,如果满了的话,则添加失败

                一般情况:len <= MAX   

                满:len == MAX

        2、对于减少顺序表元素的操作而言,需要判断顺序表是否已经空了,如果空了的话,就减少失败

                空:len == 0

int list_empty(SeqListPtr L)
{return L->len==0;
}//判满函数,满返回真,非满返回假
int list_full(SeqListPtr L)
{return L->len==MAX;
}

1.2.3 向顺序表中添加元素 

        1、判断条件:如果顺序表已经满了,就不能进行添加操作

        2、每次添加的数据放入到顺序表的最后面,也就是放在len所在的位置

        3、添加完元素后,需要将长度增加

//添加元素
int list_add(SeqListPtr L, datatype e)
{//判断逻辑if(NULL==L || list_full(L)){printf("添加失败\n");return -1;}//添加逻辑:将要添加的元素放到最后一个位置L->data[L->len] = e;//表的变化L->len++;printf("添加成功\n");return 0;
}

1.2.4 遍历顺序表 

        1、判断逻辑:表是否合法,表是否为空

        2、本质上就是数组的遍历,只是遍历到顺序表的长度结束即可

//遍历顺序表
void list_show(SeqListPtr L)
{//判断逻辑if(NULL == L || list_empty(L)){printf("遍历失败\n");return ;}//遍历printf("顺序表中元素分别是:");for(int i=0; i<L->len; i++){printf("%d\t", L->data[i]);}printf("\n");
}

 1.2.5 顺序表按位置进行插入元素

        1、 判断逻辑:顺序表不为空,顺序表不满,要插入位置不能小于0,也不能大于len

        2、 插入逻辑:需要将从最后一个元素到要插入位置的元素之间所有元素整体向后移动一格

将新元素放入到要插入位置即可

/定义任意位置插入函数 
int list_insert_pos(SeqListPtr L, int pos, datatype e)
{//判断逻辑if(NULL==L || list_full(L) || pos<0 || pos>L->len){printf("插入失败\n");return -1;}//腾空逻辑for(int i=L->len-1; i>=pos; i--){L->data[i+1] = L->data[i];//将前面的元素后移}//插入数据L->data[pos] = e;//表长变化L->len++;printf("插入成功\n");return 0;
}

1.2.6 顺序表任意位置删除元素 

        1、判断逻辑:表是否为空、表是否合法、删除位置是否合法

        2、需要将要删除位置后面的元素开始到最后一个位置为止,整体前移动一格

//定义任意位置删除函数
int list_delete_pos(SeqListPtr L, int pos)
{//判断逻辑 if(NULL==L || list_empty(L) || pos<0 || pos>=L->len){printf("删除失败\n");return -1;}//删除逻辑for(int i=pos+1; i<L->len; i++){L->data[i-1] = L->data[i];      //将元素向前偏移}//表长变化L->len --;printf("删除成功\n");return 0;
}

 1.2.7 按值进行查找位置函数

//定义按值查找位置函数
int list_search_value(SeqListPtr L, datatype e)
{//判断逻辑if(NULL==L || list_empty(L)){printf("查找失败\n");return -1;}//遍历整个顺序表for(int i=0; i<L->len; i++){if(L->data[i] == e){return i;        //返回查找到的数据下标}}printf("没找到\n");return -1;
}

1.2.8 按位置修改函数 

//按位置进行修改
int list_update_pos(SeqListPtr L, int pos, datatype e)
{//判断逻辑if(NULL==L || pos<0 || pos>=L->len || list_empty(L)){printf("修改失败\n");return -1;}//正常进行修改L->data[pos] = e;printf("修改成功\n");return 0;
}

1.2.9 按值修改函数 

//按值进行修改
int list_update_value(SeqListPtr L, datatype old_e, datatype new_e)
{//判断逻辑if(NULL==L || list_empty(L)){printf("修改失败\n");return -1;}//根据旧值找的位置int res = list_search_value(L, old_e);if(res == -1){printf("没有要修改的值\n");return -1;}//调用函数完成按位置修改list_update_pos(L, res, new_e);printf("修改成功\n");return 0;
}

课外作业:

上节课的作业,加上增删改查方法。

解析:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100            //最大容量//定义学生类型
struct stu
{char name[20];int age;int score;
};
//定义班级类型
struct Class
{struct stu student[MAX];       //存放学生的容器int size;                      //实际人数
};
struct Class *create(int count){struct Class *cls = (struct Class *)malloc(sizeof(struct Class));cls->size = count;if(NULL == cls){printf("申请失败\n");return NULL;}//程序执行至此,表示内存申请成功//给内存空间进行初始化memset(cls, 0, sizeof(int)*(count));//将内存地址返回return cls;
}int list_empty(struct Class *stu)
{return stu->size ==0;
}int list_full(struct Class *stu)
{return stu->size == MAX;
}//菜单
void print_menu(){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("功能8:修改一个学生信息\n");printf("功能9:查询一个学生信息\n");printf("功能0:退出\n");printf("请选择操作(0-5):");
}
//定义学生录用信息函数
int enterstu(struct Class *stu){                  for (int i = 0; i < stu->size; i++)            // 循环遍历输入各个学生信息{printf("输入学生 %d 的姓名:", i + 1);scanf("%s",stu->student[i].name);printf("输入学生 %d 的年龄:", i + 1);scanf("%d",&stu->student[i].age);printf("输入学生 %d 的成绩:", i + 1);scanf("%d",&stu->student[i].score);}
}
//求出学生成绩最大最小值函数
void maxminstu(struct Class *stu){int maxscore=0;             //定义初始值int minscore=0;              //定义初始值for (int i = 0; i < stu->size; i++)          {//判断最大值if(stu->student[i].score >stu->student[maxscore].score)            {                                                   maxscore = i;}//判断最小值if(stu->student[i].score < stu->student[minscore].score){minscore = i;}}//打印输出成绩最大最小值的信息printf("最高成绩的名字为%s,年龄为%d,成绩为%d\n",stu->student[maxscore].name,stu->student[maxscore].age,stu->student[maxscore].score);printf("最低成绩的名字为%s,年龄为%d,成绩为%d\n",stu->student[minscore].name,stu->student[minscore].age,stu->student[minscore].score);
}
//打印学生信息函数
void print_stu(struct Class *stu){if(NULL == stu){printf("error\n");return ;}printf("姓名\t年龄\t成绩\n");for (int i = 0; i < stu->size; i++)           // 循环遍历学生信息,打印出来{printf("%s\t%d\t%d\n",stu->student[i].name,stu->student[i].age,stu->student[i].score);}
}
//排序函数
void sortstu(struct Class *stu){for(int i = 1; i < stu->size; i++){                  //交换三部曲for(int j = 0; j < stu->size-i; j++){if(stu->student[j].score > stu->student[j+1].score){struct stu temp = stu->student[j];stu->student[j] = stu->student[j+1];stu->student[j+1] = temp;}}}print_stu(stu);
}
//释放内存的函数
void destroy(struct Class *stu)
{//释放内存if(NULL != stu){free(stu);       //释放空间stu = NULL;}
}
int stu_insert(struct Class *stu,int pos){if(NULL == stu || list_full(stu) || pos <0 || pos >stu->size){printf("插入失败\n");return -1;}for (int i = stu->size; i > pos; i--){stu->student[i] = stu->student[i-1];}printf("输入学生的姓名:");scanf("%s",stu->student[pos].name);printf("输入学生的年龄:");scanf("%d",&stu->student[pos].age);printf("输入学生的成绩:");scanf("%d",&stu->student[pos].score);stu->size++;printf("插入成功\n");print_stu(stu);return 0;
}
int stu_delete(struct Class *stu,char *value)
{int pos=0;if(NULL == stu || list_empty(stu)){printf("删除失败\n");return -1;}for (int i = 0; i < stu->size; i++){if(strcmp(stu->student[i].name,value) == 0){pos=i;}}for(int i=pos;i<stu->size;i++){stu->student[i]=stu->student[i+1];}stu->size--;printf("删除成功\n");print_stu(stu);return 0;
}
int stu_update(struct Class *stu ,char *value)
{if(NULL == stu || list_empty(stu) ){printf("修改失败\n");return -1;}for (int i = 0; i < stu->size; i++){if(strcmp(stu->student[i].name,value) == 0){printf("输入学生的年龄:");scanf("%d",&stu->student[i].age);printf("输入学生的成绩:");scanf("%d",&stu->student[i].score);}}printf("修改成功\n");print_stu(stu);return 0;
}
int stu_seach(struct Class *stu,char *value){if(NULL == stu || list_empty(stu) ){printf("查找失败\n");return -1;}for (int i = 0; i < stu->size; i++){if(strcmp(stu->student[i].name,value) == 0){printf("找到了\n");printf("学生姓名为:%s,年龄为%d,成绩为%d\n",stu->student[i].name,stu->student[i].age,stu->student[i].score);}else{printf("未找到");}}return 0;
}
int main(int argc, char const *argv[])
{int menu=0;  int size =0 ;printf("请输入班级实际人数:");scanf("%d",&size);                 //输入实际人数struct  Class *cls = create(size);             //获取Classwhile (1){//提示用户输入功能print_menu();scanf("%d",&menu);switch (menu){case 1:enterstu(cls);break;case 2:print_stu(cls);break;case 3:maxminstu(cls);break;case 4:{destroy(cls);cls = NULL;print_stu(cls);}break;case 5:sortstu(cls);break;case 6:{int n=0;printf("请输入你要插入第几个位置:");scanf("%d",&n);stu_insert(cls,n-1);}break;case 7:{char value[MAX]="";printf("请输入你要删除信息的姓名");scanf("%s",value);stu_delete(cls,value);}break;case 8:{char value[MAX]="";printf("请输入你要修改信息的姓名");scanf("%s",value);stu_update(cls,value);}break;case 9:{char value[MAX]="";printf("请输入你要查找的姓名");scanf("%s",value);stu_seach(cls,value);}break;case 0: goto END;default:printf("您输入的功能有误,请重新输入\n");}}END:return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能取纸机,帮助移动公厕,无人值守降低运营成本

在快节奏的城市生活中&#xff0c;移动公厕作为临时性或应急性的公共卫生设施&#xff0c;扮演着不可或缺的角色。然而&#xff0c;传统移动公厕的管理面临着诸多挑战&#xff0c;尤其是纸巾供应与使用效率问题。近年来&#xff0c;智能取纸机的出现&#xff0c;为移动公厕的管…

好玩新游:辛特堡传说中文免费下载,Dungeons of Hinterberg 游戏分享

在游戏中&#xff0c;你将扮演Luisa&#xff0c;一个被现实生活拖得疲惫不堪的法律实习生。她决定暂时远离快节奏的公司生活&#xff0c;踏上征服辛特堡地下城的旅程…她会在第一天就被击退&#xff0c;还是能成为顶级猎魔人呢&#xff1f;只有一个办法可以找到答案... 体验刺激…

《Milvus Cloud向量数据库指南》——SPLADE:基于BERT的Learned稀疏向量技术深度解析

在自然语言处理(NLP)领域,随着深度学习技术的飞速发展,预训练语言模型如BERT(Bidirectional Encoder Representations from Transformers)已成为推动研究与应用进步的重要基石。BERT通过其强大的上下文感知能力,在多项NLP任务中取得了显著成效,尤其是在文本表示和语义理…

昇思25天学习打卡营第20天| GAN图像生成

GAN是一种特别酷的机器学习模型&#xff0c;它由两个部分组成&#xff1a;生成器和判别器。生成器的任务是制造假的图像&#xff0c;而判别器则要判断图像是真是假。这俩就像是在玩一个捉迷藏的游戏&#xff0c;生成器越做越好&#xff0c;判别器也越来越聪明。 想象一下&…

光耦合器技术的实际应用

光耦合器也称为光隔离器&#xff0c;是现代电子产品中的关键组件&#xff0c;可确保电路不同部分之间的信号完整性和隔离。它们使用光来传输电信号&#xff0c;提供电气隔离和抗噪性。 结构和功能 光耦合器通常由以下部分组成&#xff1a; 1.LED&#xff08;发光二极管&#…

yolov5进行识别安全帽

进行毕业设计 下载yolov5使用按照教程来进行就行注意事项&#xff08;有必要看看&#xff09;效果 总结 下载yolov5 地址是&#xff1a;https://github.com/ultralytics/yolov5 使用按照教程来进行就行 这里简单说一下&#xff1a; 下载需要的命令&#xff1a; pip install -…

前端vue框架的项目文件创建及常见Vue指令运用

前言 本文介绍前端Vue框架&#xff0c;先从npm工具创建的Vue项目开始&#xff0c;对项目结构的一些文件用途进行说明&#xff0c;随后对Vue文件编写所用的两种风格&#xff08;选项式API和组合式API风格&#xff09;做了区分&#xff0c;同时对编写代码中常见的生命周期钩子函…

【OpenREALM学习笔记:14】单目视觉SLAM方法在UAV影像上重建三维地形的思考

最近在学习SLAM技术与测绘三维影像重建的相关知识&#xff0c;结合自己的感受&#xff0c;撰写一下对于单目视觉SLAM利用无人机影像重建三维地形的一些看法。 1. 单目视觉SLAM系统在三维地形重建中所面临的挑战有哪些&#xff1f; 单目视觉SLAM众所周知的一个问题是&#xff…

C语言联合及枚举

一.联合体 1.联合体类型的声明 像结构体一样&#xff0c;联合体也是由一个或者多个成员构成&#xff0c;这些成员可以不同的类型,但是编译器只为最大的成员分配足够的内存空间。 联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体,给联合体其中一个成员赋值…

AVL树超详解上

前言 学习过了二叉树以及二叉搜索树后&#xff08;不了解二叉搜索树的朋友可以先看看这篇博客&#xff0c;二叉搜索树详解-CSDN博客&#xff09;&#xff0c;我们在一般情况下对于二叉搜索树的插入与查询时间复杂度都是O(lgN)&#xff0c;是十分快的&#xff0c;但是在一些特殊…

多维时序 | Transformer+BiLSTM多变量时间序列预测(Python)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 多维时序 | TransformerBiLSTM多变量时间序列预测&#xff08;Python&#xff09; python代码&#xff0c;pytorch框架 程序设计 完整程序和数据获取方式私信博主回复多维时序 | TransformerBiLSTM多变量时间序列预…

Ubuntu 查询未更新的包 进行手动更新

lsb_release -a 查询ubuntu的版本号&#xff0c;我这边是20.04 apt list --upgradable 查询未更新的包 sudo apt --only-upgrade install php/focal 中间遇到输入选择&#xff0c;输入y即可

linux shell脚本编程(分支语句、循环语句)

一、分支语句 1、语法结构 : if 表达式 then 命令表 fi 如果表达式为真 , 则执行命令表中的命令 ; 否则退出 if 语句 , 即执行 fi 后面的语句。 if 和 fi 是条件语句的语句括号 , 必须成对使用 ;命令表中的命令可以是一条 , 也可以是若干条。 2、语法结构为 : if 表达式 t…

pdf太大了怎么变小 pdf太大了如何变小一点

在数字化时代&#xff0c;pdf文件已成为工作与学习的重要工具。然而&#xff0c;有时我们可能会遇到pdf文件过大的问题&#xff0c;这会导致传输困难或者存储不便。别担心&#xff0c;下面我将为你介绍一些实用的技巧和工具&#xff0c;帮助你轻松减小pdf文件的大小。 方法一、…

java之利用二维数组来计算年利润和每个季度的营业额

public class TwodimensionDemo2 {public static void main(String[] args) {//创建二维数组来存储数据int [][]yearArrArr{{22,66,44},{77,33,88},{25,45,65},{11,66,99}};int yearSum0;//遍历二维数组&#xff0c;得到每一个一维数组并求和for (int i 0; i < yearArrArr.…

Linux fork、进程的退出和等待详解

初识fork函数 它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;子进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 最简单的fork使用示例 #include<stdi…

每日一题,力扣leetcode Hot100之11. 盛最多的水

解法一&#xff1a; 双层循环遍历找结果&#xff0c;相当于是一个暴力求解方法&#xff0c;两层嵌套循环的时间复杂度是O(N2&#xff09;&#xff0c;所以有一些样例测试时间超时 class Solution:def maxArea(self, height: List[int]) -> int:max_result0for i in range(…

VMware 安装完,设备管理器中没有虚拟网卡(vmnet0、wmnet1、vmnet8) / 虚拟网络编辑器中没有桥接模式

问题&#xff1a;VMware 安装完&#xff0c;设备管理器中没有虚拟网卡(vmnet0、wmnet1、vmnet8) / 虚拟网络编辑器中没有桥接模式 1、确认 Device Install Service 和 Device Setup Manager 没有被禁用 Device Install Service 和 Device Setup Manager是 Windows 操作系统中…

GraphRAG参数与使用步骤 | 基于GPT-4o-mini实现更便宜的知识图谱RAG

首先给兄弟朋友们展示一下结论&#xff0c;一个文本18万多字&#xff0c;txt文本大小185K&#xff0c;采用GraphRAG,GPT-4o-mini模型&#xff0c;索引耗时差不多5分钟&#xff0c;消耗API价格0.15美元 GraphRAG介绍 GraphRAG是微软最近开源的一款基于知识图谱技术的框架&#…

“论系统安全架构设计及其应用”,写作框架,软考高级论文,系统架构设计师论文

论文真题 随着社会信息化进程的加快&#xff0c;计算机及网络已经被各行各业广泛应用&#xff0c;信息安全问题也变得愈来愈重要。它具有机密性、完整性、可用性、可控性和不可抵赖性等特征。信息系统的安全保障是以风险和策略为基础&#xff0c;在信息系统的整个生命周期中提…