数据结构 day3

news2024/9/21 2:32:44

 

目录

思维导图:

学习内容:

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;           //顺序表长度为0

    printf("创建成功\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);             //获取Class
    while (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.coloradmin.cn/o/1934886.html

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

相关文章

C/C++ xml库

文章目录 一、介绍1.1 xml 介绍1.2 xml 标准1.3 xml 教程1.4 xml 构成 二、C/C xml 库选型2.1 选型范围2.2 RapidXML2.3 tinyxml22.4 pugixml2.5 libxml 五、性能比较5.1 C xml 相关的操作有哪些5.2 rapidxml、Pugixml、TinyXML2 文件读取性能比较 六、其他问题6.1 version和 e…

【ARMv8/v9 异常模型入门及渐进 9.1 - FIQ 和 IRQ 打开和关闭】

请阅读【ARMv8/v9 ARM64 System Exception】 文章目录 FIQ/IRQ Enable and Disable汇编指令详解功能解释使用场景和注意事项 FIQ/IRQ Enable and Disable 在ARMv8/v9架构中&#xff0c;可以使用下面汇编指令来打开FIQ和 IRQ,代码如下&#xff1a; asm volatile ("msr da…

国内从事双臂机器人的团队

一、背景 随着人形机器人的发展&#xff0c;双臂协同操作得到了越来越多研究人员的关注。我自己也是做双臂机器人方向的&#xff0c;虽然通过看论文或刷知乎了解到国内有许多团队在做双臂机器人方向&#xff0c;但还没有系统的整理过&#xff0c;因此趁这次机会&#xff0c;好…

利用patch-package补丁,解决H5预览PDF时电子签章不显示问题

利用patch-package补丁&#xff0c;解决H5预览PDF时电子签章不显示问题 一、问题描述 在生产环境中&#xff0c;遇到了一个紧急的技术问题&#xff1a;用户在移动端H5页面上查看电子票时&#xff0c;PDF文件预览功能正常&#xff0c;但其中的电子签章未能正常显示。这一问题直…

CentOS6minimal安装nginx-1.26.1.tar.gz 笔记240718

CentOS6安装新版nginx 240718, CentOS6.1-minimal 安装 nginx-1.26.1.tar.gz 下载 nginx-1.26.1.tar.gz 的页面 : https://nginx.org/en/download.html 下载 nginx-1.26.1.tar.gz : https://nginx.org/download/nginx-1.26.1.tar.gz CentOS6.1已过期, 给它更换yum源, 将下面…

设计分享—国外网站设计赏析

今天还是给大家分享一些国外的网站设计案例&#xff5e; 蓝蓝设计是一家专注而深入的界面设计公司&#xff0c;为期望卓越的国内外企业提供卓越的大数据可视化界面设计、B端界面设计、桌面端界面设计、APP界面设计、图标定制、用户体验设计、交互设计、UI咨询、高端网站设计、平…

基于PHP+MYSQL开发制作的趣味测试网站源码

基于PHPMYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分&#xff0c; 自己手动在数据库里修改数据&#xff0c;数据库里有就会优先查询数据库的信息&#xff0c; 没设置的话第一次查询缘分都是非常好的 95-99&#xff0c;第二次查就比较差 &#xff0c; 所以如果要…

Redis 关于内存碎片的解决方法

今天生产机报内存爆满异常被叫过去查看问题&#xff0c;通过各种排除最终定位到了Redis的内存碎片的问题&#xff0c;这篇博客将详细介绍Redis内存碎片问题并给出最佳实践解决此问题。 Redis的内存碎片原理 先引用Redis官方的原话&#xff1a; 当键被删除时&#xff0c;Redis …

MYSQL中的库表建立基础操作

任务&#xff1a;新建产品库mydb6_product&#xff0c; 新建3张表如下: 一&#xff0c; employees表 &#xff08;1&#xff09;:id&#xff0c;整型&#xff0c;主键 &#xff08;2&#xff09;:name&#xff0c;字符串&#xff0c;最大长度50&#xff0c;不能为空 &#xff…

SQL每日一题:删除重复电子邮箱

题干 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主键列(具有唯一值的列)。 该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。 编写解决方案 删除 所有重复…

SpringBoot框架学习笔记(三):Lombok 和 Spring Initailizr

1 Lombok 1.1 Lombok 介绍 &#xff08;1&#xff09;Lombok 作用 简化JavaBean开发&#xff0c;可以使用Lombok的注解让代码更加简洁Java项目中&#xff0c;很多没有技术含量又必须存在的代码&#xff1a;POJO的getter/setter/toString&#xff1b;异常处理&#xff1b;I/O…

C语言学习笔记[25]:循环语句for

for循环 for循环的基本语法 for(表达式1;表达式2;表达式3)循环语句; 表达式1为初始化部分&#xff0c;用于初始化循环变量的。 表达式2为条件判断部分&#xff0c;用于判断循环何时终止。 表达式3为调整部分&#xff0c;用于循环条件的调整。 例如用for循环实现打印1~10的数字…

HarmonyOS根据官网写案列~ArkTs从简单地页面开始

Entry Component struct Index {State message: string 快速入门;build() {Column() {Text(this.message).fontSize(24).fontWeight(700).width(100%).textAlign(TextAlign.Start).padding({ left: 16 }).fontFamily(HarmonyHeiTi-Bold).lineHeight(33)Scroll() {Column() {Ba…

object-C 解答算法:移动零(leetCode-283)

移动零(leetCode-283) 题目如下图:(也可以到leetCode上看完整题目,题号283) 解题思路: 本质就是把非0的元素往前移动,接下来要考虑的是怎么移动,每次移动多少? 这里需要用到双指针,i 记录每次遍历的元素值, j 记录“非0元素值”需要移动到的位置; 当所有“非0元素值”都移…

解决TypeError: __init__() takes 1 positional argument but 2 were given

问题描述&#xff1a; 如下图&#xff0c;在使用torch.nn.Sigmoid非线性激活时报错 源代码&#xff1a; class testrelu(nn.Module):def __init__(self):super().__init__()self.sigmoid Sigmoid()def forward(self, input):output self.sigmoid(input)return outputwriter…

可视化剪辑,账号矩阵,视频分发,聚合私信一体化营销工具 源----代码开发部署方案

可视化剪辑&#xff1a; 为了实现可视化剪辑功能&#xff0c;可以使用流行的视频编辑软件或者开发自己的视频编辑工具。其中&#xff0c;通过设计用户友好的界面&#xff0c;用户可以简单地拖拽和放大缩小视频片段&#xff0c;剪辑出满足需求的视频。在开发过程中&#xff0c;可…

接口测试JMeter-1.接口测试初识

第一章 接口测试初识 1. 接口测试理论基础 “接口测试”一个让人觉得非常高大上的名词&#xff0c;特别是对于刚入门的测试同学而言。随着测试技术不断的深化&#xff0c;“接口测试”出现在我们视野中的频次越来越高。那么接口测试到底是如何做的&#xff1f;接口测试的优势又…

Uniapp 组件 props 属性为 undefined

问题 props 里的属性值都是 undefined 代码 可能的原因 组件的名字要这样写&#xff0c;这个官方文档有说明

Linux-CentOS7忘记密码找回步骤

虚拟机版本 一、进入开机页面&#xff0c;先按上下&#xff08;↑↓&#xff09;键&#xff0c;以免系统自动启动。 二、按“e”键进入编辑页面,找到如下图位置&#xff0c;输入&#xff1a;init/bin/sh 按CTRLX 进入单用户模式。 三、 输入 mount -o remount,rw / 然后按 ent…

verilog bug记录——正点原子spi_drive存在的问题

verilog bug记录——正点原子spi_drive存在的问题 问题概述代码修改—spi_drive.v遗留问题 问题概述 因为项目需求&#xff0c;需要利用spi对flash进行擦除和写入操作&#xff0c;所使用的开发板是正电原子的达芬奇开发板&#xff0c;我事先往Flash里面存了两个bit&#xff0c…