01-02-4

1、中级阶段-day1作业

使用的代码

#include<stdio.h>
typedef struct Student
{
    int num;
    char name[20];
    char sex;
}Stu;
int main()
{
    Stu s;
    scanf("%d%s %c", &s.num, s.name, &s.sex);//读取字符串时,scanf()的占位符用%s即可,用字符数组存放读取的字符串
    printf("%d %s %c\n", s.num, s.name, s.sex);
    return 0;
}

说明:

scanf()用%s作为占位符读取字符串存放到字符数组时,在字符数组空间足够的情况下,会在最后一个字符后面补上一个\0作为结束符,但是没有换行符。

2、中级阶段-day2作业

使用的代码

#include<stdio.h>
#include<stdlib.h>//malloc的头文件可以是<stdlib.h>也可是<malloc.h>。通常用<stdlib.h>
void modify_point(char*& p)
{
    p = (char*)malloc(100);//使用引用,在子函数内申请的空间在主函数可以继续使用该指针访问申请的空间
    fgets(p, 100, stdin);//
}
int main()
{
    char* p=NULL;//定义指针时,给指针初始化为NULL
    modify_point(p);
    puts(p);
    return 0;
}

3、中级阶段-day3作业

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef int ElemType;//顺序表中的元素类型
typedef struct
{
    ElemType data[MaxSize];//创建数组
    int length;//记录当前数组中有效数据的个数
}SqList;//给结构体重命名为SqList
//插入函数
bool ListInsert(SqList& L, int i, ElemType e)//使用引用,在子函数内对顺序表进行插入操作才能影响外面的顺序表.这里的i表示位置
{
    if (i<1 || i>L.length + 1)//判断插入的位置是否合法
    {
        return false;
    }
    if (L.length >= MaxSize)//判断是否有空间可以插入
    {
        return false;
    }
    for (int j = L.length; j >= i; j--)//length是最后一个元素的位置,是最后一个元素后面一个空间的下标,length-1是最后一个元素的下标
    {
        L.data[j] = L.data[j - 1];//将后面的元素向后移动一位
    }
    L.data[i - 1] = e;
    L.length++;
    return true;//走到此处,表示插入成功
}
//删除使用元素e的引用的目的是拿出对应的值
bool ListDelete(SqList& L, int i, ElemType& e)//因为要将删除的元素传回到主函数中,所以存放删除的元素的变量需要借助引用,即可影响主函数中的变量
{
    if (i<1 || i>L.length)//删除的位置必须有元素,相对与插入,插入可以访问到最后元素+1的空间即length+1,但是删除只能访问到最后一个元素的空间也就是length
    {
        return false;
    }
    if (L.length == 0)
    {
        return false;
    }
    e = L.data[i - 1];//获取删除位置处对应的元素
    for (int j = i; j < L.length; j++)
    {
        L.data[j - 1] = L.data[j];
    }
    L.length--;
    return true;
}
//打印函数
void PrintList(SqList L)//打印顺序表中的数据
{
    for (int i = 0; i < L.length; i++)
    {
        printf("%3d", L.data[i]);//将所有元素打印到同一行
    }
    printf("\n");
}
int main()
{
    SqList L;//创建循序表,命名为L:顺序表是一个结构体,内部有一个存放元素的数组,还有一个记录数组元素个数的整型变量
    bool ret_1;
    bool ret_2;
    ElemType del;
    int add_p;
    int del_p;
    scanf("%d", &add_p);
    L.data[0] = 1;
    L.data[1] = 2;
    L.data[2] = 3;
    L.length = 3;//顺序表中的数组每增加一个元素,记录元素个数的整型变量就要加一
    ret_1 = ListInsert(L, add_p, 60);//向顺序表L的第二个位置插入60这个元素
    if (ret_1)
    {
        PrintList(L);//打印插入成功后的顺序表
    }
    else {
        printf("false\n");
    }
    scanf("%d", &del_p);
    ret_2 = ListDelete(L, del_p, del);//将顺序表L的第一个位置的元素删除,并将删除的元素传回到主函数中
    if (ret_2)
    {
        printf("删除成功\n");
        printf("删除的元素值为%d\n", del);
        PrintList(L);
    }
    else {
        printf("删除失败\n");
    }
    return 0;
}

4、线性表的链式存储

A.单链表的定义

a.理论说明

头节点:单链表的第一个节点,内部没有数据,只有指向第一个节点的指针。

头指针:指向头节点的指针。

b.代码说明

①链表结构体的定义说明

链表结构体,就是一个节点。内部包含一个类型的变量,和一个指向下一节点的指针。这个指针的类型就是用该结构体定义的。但是不能用结构体的别名定义。

代码如下

typedef struct LNode
{
    ElemType data;
    struct LNode* next;
}LNode,*LinkList;

②用该结构体定义头指针变量

链表头,也就是头指针,类型是该结构体对应的指针

代码如下:

LinkList L;

③用头插法新建链表
Ⅰ.对头插法的说明

即将新申请的节点,放在已有节点的最前面,即放在第一个节点处,这种插入方法称为头插法。

Ⅱ、子函数的书写说明

插入的子函数可以没有返回值。

但是必须引用该头指针。

代码如下

void CreateList(LinkList& L)

Ⅲ.在子函数内申请节点空间

利用malloc()申请的空间地址放到头指针L中。申请的空间大小用sizeof(节点结构体名)计算即可。

申请的地址还需要强制类型转换为指针类型,即节点指针类型。

此时头指针L就对应一个空间,该空间和结构体定义的空间一样,含有一个类型的变量,一个指向下一个节点的指针。

新申请的空间只有一个,没有下一个,所以申请产生的空间指向下一个空间的指针next,需先赋值为NULL。

此时结构如下:

代码如下

LNode* s; int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;

Ⅳ.先读取一个数据,放到变量中,在利用while循环将读取的数据不断放到新节点中,循环结束前再次读取

即需要在循环中利用malloc申请一个新的空间,放到一个新的节点指针变量中。(这个指针在子函数中定义,在while循环中不断替换使用)。

再将读取的数据放到这个新的节点指针中的数据变量中。

这个新的节点的指针赋值为前一个节点的next值。

结构如下:

代码如下

scanf("%d", &x);//从标准输入读取数据
// 3 4 5 6 7 9999:此时x内是3
while (x != 9999)
{
    s = (LinkList)malloc(sizeof(LNode));//申请一个新的空间,也就是存放第一个数据的空间
    s->data = x;
    s->next = L->next;//让新节点的next指针指向原有的第一个节点(即指向头节点中的next域对应的空间)
    L->next = s;//让指针的next域指向新申请的空间节点地址。
    scanf("%d", &x);
}

即:

先执行①:将新申请的节点的next与赋值为头指针对应空间中的next值,

再执行②:将头指针对应空间中的next值赋值为新申请的空间的地址。

scanf()的补充说明:scanf()卡住后,若是只有一个占位符,则只读取一个,但是可以输入多个,对于其他没有读取的数据,则会被下一次的scanf()进行读取。

Ⅵ.整体代码如下
void CreateList(LinkList& L)
{
    LNode* s; int x;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    scanf("%d", &x);//从标准输入读取数据
    // 3 4 5 6 7 9999:此时x内是3
    while (x != 9999)
    {
        s = (LinkList)malloc(sizeof(LNode));//申请一个新的空间,也就是存放第一个数据的空间
        s->data = x;
        s->next = L->next;//让新节点的next指针指向原有的第一个节点(即指向头节点中的next域对应的空间)
        L->next = s;//让指针的next域指向新申请的空间节点地址。
        scanf("%d", &x);
    }
}

④链表打印
Ⅰ.子函数名说明:

直接使用形参即可,不需要借助引用,直接传递头指针即可。所以形参也必须是节点指针结构体类型。

代码如下

void PrintList(LinkList L)

Ⅱ.在子函数中改变头指针的值,使其直接指向第一个节点

L=L->next

L本是头指针,指向头节点,头节点中的next指针指向第一个元素节点,即此时L指向第一个元素节点,可以直接使用->访问对应的data域。

Ⅲ.利用while循环,打印节点的data域
while(L!=NULL)//此时L指向第一个元素节点的地址
​
{
​
    printf("%3d",L->data);//L->data:此时访问的就是第一个元素节点的data域。
    L=L->next;//此时L->next是第二个节点的地址,将其放到L中,此时L就指向第二个元素节点地址。直到当前节点中的next域为空后,将其赋值到L指针中,再来到循环判断处,会发现不可再进入。此时的L指向NULL。
​
}

⑤尾插法新建链表
Ⅰ.对尾插法的逻辑说明

完成的是①的操作,不断的让原有的最后一个节点的next指向新的节点。

Ⅱ.子函数名说明

需要引用头指针,不需要返回。

代码如下

void CreateList2(LinkList& L)

Ⅲ.新建两个结构体指针
①其中一个指针变量指向表尾节点:

若是链表中只有一个头节点,该头节点就是表尾节点。将该节点的地址放到此变量中即可。

结构如下:

②另一个用于在循环中接收malloc()新建的节点地址
Ⅳ.利用malloc()新建一个头节点,并赋值给头指针L

malloc()新建的空间需要强制类型转换为结构体指针类型。

申请的空间大小,使用sizeof()计算一个结构体的大小即可。

代码如下

L = (LinkList)malloc(sizeof(LNode));

Ⅴ.利用while循环,不断增加节点

在循环中,利用malloc()申请空间。空间大小用sizeof()计算一个节点结构体即可。最后需要强制类型转换为节点指针类型。

使用新建节点的指针访问对应的data域,将读取的数据放到新建的节点的data域中。

再将表尾节点的next域赋值为刚申请的空间的地址。

最后令表尾指针指向新的节点即可。

结构如下:

即再循环中执行操作为:

α.malloc()新建节点

β.给节点的data域赋值

γ.将尾指针的next值赋值为新节点的地址(即上图中的①)

δ.将尾指针指向新节点的地址(即上图中的②)

代码如下:

while (x != 9999)
{
    s = (LNode*)malloc(sizeof(LNode));
    s->data = x;
    r->next = s;//让尾部节点的next指向新申请的节点空间
    r = s;//r指针指向新的表尾节点
    scanf("%d", &x);
}

Ⅵ.循环结束后,再将最后一个节点的next赋值为NULL

尾指针指向表尾节点,该指针使用->即可访问对应的next域,即最后一个节点的next,将其赋值为NULL即可。

代码如下

r->next = NULL;

Ⅶ.整体代码如下:
void CreateList2(LinkList& L)
{
    int x;//用于接受放入链表data域中的数据
    L = (LinkList)malloc(sizeof(LNode));
    LNode* s, * r = L;//r中用于存放表尾节点的地址,指向链表尾部
    //3 4 5 6 7 9999
    scanf("%d", &x);
    while (x != 9999)
    {
        s = (LNode*)malloc(sizeof(LNode));
        s->data = x;
        r->next = s;//让尾部节点的next指向新申请的节点空间
        r = s;//r指针指向新的表尾节点
        scanf("%d", &x);
    }
    r->next = NULL;//尾节点的next指针赋值为NULL
}
​
​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在windows server下安装mysql5.7数据库,并使用Navicat Premium 15可视化工具新建数据库并读取数据库信息。

如何在windows server下安装mysql5.7数据库&#xff1f; MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/点击↑&#xff0c;然后选择对应版本和平台↓下载 将下载后的安装包放入固定目录&#xff08;这里以D:…

韩国Doosan斗山机械手维修

在现代工业领域&#xff0c;斗山机器人以其高效、精准和稳定的性能而受到广泛应用。然而&#xff0c;随着使用时间的增加&#xff0c;机器人难免会出现Doosan机器人故障。 常见斗山机器人故障及Doosan机械手维修方法 1. 电源故障 - 故障现象&#xff1a;机器人电源无法正常开…

【JavaSE】多线程

目录 进程与线程进程线程 几个基本概念串行和并行并行与并发 多线程概念多线程的优点/好处多线程问题分析 Java多线程的基本使用Thread类主线程守护线程案例&#xff1a;显示主线程名 多线程实现方式继承java.lang.Thread类步骤代码实现start()和run()的区别&#xff1f; 注意 …

专业音频修复软件:iZotope RX 11 for Mac 激活版

iZotope RX 专为满足后期制作专业人士的苛刻需求而设计的一款专业音频修复软件。iZotope RX 10添加了新的特性和功能&#xff0c;以解决当今后期项目中存在的一些最常见的修复问题&#xff0c;使其成为音频后期制作的最终选择。虽然包含许多其他新功能&#xff0c;但这里是新的…

Git-基础

概念&#xff1a;一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用&#xff1a;记录代码内容&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 Git安装 安装路径不能出现中文 git -v//查看git版本 Git配置用户信息…

代码大师的工具箱:现代软件开发利器

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

MySQL数据查询优化

MySQL调优是开发中必不可少的内容&#xff0c;以下是对MySQL查询性能优化的部分总结 1. explain关键字的使用 explain关键字可以模拟优化器执行sql查询语句&#xff0c;获取sql的执行信息&#xff0c;使用方法&#xff1a; explainsql语句 1.1 字段详解 id&#xff08;select …

东南亚电商巨头:Zalora,卖家如何通过自养号测评快速提升产品销量

Zalora&#xff0c;中文名为“左拉”&#xff0c;是东南亚地区备受瞩目的时尚电商平台。总部位于新加坡&#xff0c;其业务已覆盖包括中国香港、中国台湾、印尼、菲律宾、泰国、越南、马来西亚及文莱等11个亚太地区。Zalora以其丰富的品牌产品线、卓越的服务体验和高效的物流配…

数据分析的数据模型

数据分析的数据模型 前言一、优化模型1.1线性优化模型1.1.1线性优化模型定义1.1.2线性优化模型求解算法1. 1.2.1图解法1. 1.2.2. 单纯形法 1.1.3 线性优化模型的应用 1.2非线性优化模型1.2.1非线性优化模型定义1.2.2非线性优化划模型求解方法1. 2.2.1有约束非线性模型算法1.2.2…

windows版本达梦数据复制软件 DMDRS安装

安装步骤&#xff1a; 1&#xff1a; 2&#xff1a;注意安装提醒 3&#xff1a;接受 4&#xff1a;选择安装路径&#xff0c;注意权限以及所需空间大小 5&#xff1a;观察支持的数据源类型

华企盾DSC数据防泄密软件有哪些水印功能?

在企业数据安全领域&#xff0c;水印技术是一种重要的信息保护策略&#xff0c;用于防止数据泄露和确保信息的原始性和完整性。根据回顾的资料&#xff0c;以下是企业中常用的几种水印技术&#xff1a; 屏幕浮水印&#xff1a;这种水印能够在用户的屏幕上显示公司的标志或者其他…

安服仔养成篇——漏洞修复

漏洞披露是安全服务工作的日常内容之一&#xff0c;常见漏洞扫描和渗透测试两种方式&#xff0c;完整的工作流程还包括了后续的复核以及提供漏洞整改建议&#xff0c;这篇文章给大家分享一下up在漏洞修复上的一些经验和容易遇到的问题&#xff0c;希望能对师傅们有所帮助。 漏洞…

mmdetection在训练自己数据集时候 报错‘ValueError: need at least one array to concatenate’

问题&#xff1a; mmdetection在训练自己数据集时候 报错‘ValueError: need at least one array to concatenate’ 解决方法&#xff1a; 需要修改数据集加载的代码文件&#xff0c;数据集文件在路径configs/base/datasets/coco_detection.py里面&#xff0c;需要增加meta…

RSAC2024: 洞悉安全新趋势 - 天空卫士前沿观察

以"可能的艺术"&#xff08;The Art of the Possible&#xff09;为主题&#xff0c;备受瞩目的RSA Conference 2024&#xff08;RSAC2024&#xff09;已于5月6日在旧金山盛大开幕。这一年度盛会不仅是网络安全领域最新技术与趋势的展示窗口&#xff0c;更是全球网络…

zabbix基础

监控系统基本介绍&#xff1a; 企业级应用中&#xff0c;服务器数量众多&#xff0c;一般情况下需要维护人员进行长时间对服务器体系、计算机或其他网络设备&#xff08;包括硬件和软件&#xff09;进行长时间进行性能跟踪&#xff0c;保证正常稳定安全的运行&#xff0c;于是…

桥接模式(Bridge)——结构型模式

桥接模式&#xff08;Bridge&#xff09;——结构型模式 桥接模式是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&#xff0c; 从而能在开发时分别使用。 假如有三个类Circle、triangle和rectangle&#xff0c;现在要…

祝贺嫦娥六号发射成功,思迈特再为航天项目提供数据支持和保障

近日&#xff0c;嫦娥六号由长征五号遥八运载火箭在中国文昌航天发射场发射成功。 据悉&#xff0c;嫦娥六号是中国探月工程的第六个探测器&#xff0c;其主要任务是前往月球背面的南极-艾特肯盆地进行科学探测和样品采集。 嫦娥六号任务不仅是技术上的挑战&#xff0c;也是科学…

嗨动PDF编辑器适合你的pdf编辑器,试试吧!

pdf编辑器有哪些&#xff1f;在数字化办公日益普及的今天&#xff0c;PDF文档因其跨平台、高保真度的特性而备受欢迎。无论是工作汇报、学术研究还是日常学习&#xff0c;我们都需要对PDF文档进行编辑、修改和整理。然而&#xff0c;如何选择合适的PDF编辑器却成了许多人头疼的…

本地搭建各大直播平台录屏服务结合内网穿透工具实现远程管理录屏任务

文章目录 1. Bililive-go与套件下载1.1 获取ffmpeg1.2 获取Bililive-go1.3 配置套件 2. 本地运行测试3. 录屏设置演示4. 内网穿透工具下载安装5. 配置Bililive-go公网地址6. 配置固定公网地址 本文主要介绍如何在Windows系统电脑本地部署直播录屏利器Bililive-go&#xff0c;并…

做抖店如何提高与达人合作的几率?有效筛选+有效推品

我是王路飞。 总是有很多新手商家&#xff0c;找我吐槽&#xff0c;抖音上的达人特别不好找&#xff0c;好不容易加上了&#xff0c;要么是发消息不回复&#xff0c;要么是寄样后就没下文了。 虽然一直都说找达人带货玩法比较简单&#xff0c;但也离不开电商的基本逻辑&#…