01-02-4

news2024/11/28 3:48:46

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
}
​
​

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

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

相关文章

重大升级 | OpenSCA SaaS全面接入供应链安全情报!

结合社区用户反馈及研发小伙伴的积极探索&#xff0c; OpenSCA 项目组再次发力&#xff0c;SaaS版本重大升级啦&#xff01; 用户的需求是OpenSCA前进的动力&#xff0c;欢迎更多感兴趣的朋友们积极试用和反馈~ 更 新 内 容 1.全面接入云脉XSBOM供应链安全情报 2.强大的资产…

【异常】SpringBoot整合RabbitMQ-发送消息报错

错误信息 reply-code406, reply-textPRECONDITION_FAILED - inequivalent arg ‘x-message-ttl’ for queue ‘hello-queue’ in vhost ‘/lq’: received none but current is the value ‘10000’ of type ‘signedint’, class-id50, method-id10 错误原因 hello-queue这…

省公派访学|社科老师赴世界名校牛津大学开展研究

F老师已获某省公派出国访学半年的资助&#xff0c;希望落实的学校尽量知名。但因为F老师只是硕士毕业而无博士学位&#xff0c;专业方向又是社科类&#xff0c;所以申请到世界知名高校有一定难度。经过努力&#xff0c;最终我们获得了世界顶尖高校-英国牛津大学的访问学者邀请函…

C++常见十种排序方式

目录 前言 1、选择排序 介绍 参考代码 2、冒泡排序 介绍 参考代码 3、插入排序 介绍 参考代码 4、希尔排序 介绍 参考代码 5、快速排序 介绍 参考代码 6、并归排序 介绍 参考代码 7、堆排序 介绍 参考代码 8、基数排序 介绍 参考代码 9、计数排序 介绍 参考代…

用户需求甄别和筛选的6大标准

产品经理日常经常接收到大量的需求&#xff0c;并不是所有的需求都需要开发&#xff0c;需要进行甄别和筛选&#xff0c;这样有利于确保项目的成功、优化资源利用以及提高产品质量。 那么针对这些用户需求进行甄别或筛选的评判标准是什么&#xff1f;需求筛选可以说是初步的需求…

设计模式-工厂模式设计与详解

一、设计模式介绍 设计模式是我们开发中常常需要面对的核心概念&#xff0c;它们是解决特定问题的模板或者说是经验的总结。这些模式被设计出来是为了让软件设计更加清晰、代码更加可维护且能应对未来的变化。良好的设计模式不仅能解决重复代码的问题&#xff0c;还能使团队中…

关于修改ant-design-vue的table组件背景色遇到闪动的问题

项目中需要修改表格的背景色为以下样式 修改完之后发现表格行还有个hover的背景色&#xff0c;于是再次重置样式如下 .ant-table-tbody > tr {&:hover {td {// background: red !important;background: transparent !important;}}}这样重置之后&#xff0c;hover的样式…

【中级软件设计师】上午题16-算法(应试考试简略版)

上午题16-算法 1 回溯法1.1 n皇后问题 2 分治法3 动态规划3.1 0-1背包问题3.2 最长公共子序列3.3 矩阵连乘 4 贪心算法5 分支限界法总结 1 回溯法 深度优先方法搜索 1.1 n皇后问题 2 分治法 一般来说&#xff0c;分治算法在每一层递归上都有3个步骤 &#xff08;1&#xff…

【C++】详解STL的适配器容器之一:优先级队列 priority_queue

目录 堆算法 概述 向下调整建堆 向上调整建堆 建堆算法 仿函数 概述 使用介绍 emtpy size top push pop 模拟实现 仿函数 框架 向下调整算法 向上调整算法 pop push empty top 要理解优先级队列&#xff0c;需要有如下知识 STL容器之一的vector&#xf…

嵌入式:基于STM32的RFID访问控制系统

在商业和住宅建筑中&#xff0c;访问控制系统是确保安全的关键组件。使用射频识别&#xff08;RFID&#xff09;技术&#xff0c;我们可以创建一个安全、方便的门禁系统。本教程将详细说明如何使用STM32微控制器实现RFID基础的门禁系统&#xff0c;该系统能够控制电子锁并记录访…

品鉴中的品鉴笔记:如何记录和分享自己的品鉴心得

品鉴云仓酒庄雷盛红酒的过程&#xff0c;不仅是品尝美酒&#xff0c;更是一次与葡萄酒深度对话的旅程。为了更好地记录和分享自己的品鉴心得&#xff0c;养成写品鉴笔记的习惯是十分必要的。 首先&#xff0c;选择一个适合的记录工具。可以是传统的笔记本&#xff0c;也可以是…

爆!1688「搜索推广」实操打法,8大要点快速上手!

想要1688平台上提高商品的搜索排名和曝光率&#xff0c;吸引更多的潜在客户并提升销量&#xff0c;店雷达将尽量具体地介绍相关操作方法和运营思路&#xff0c;建议大家收藏起来慢慢看。 一、了解1688平台搜索方式 1、品搜&#xff1a;这是买家最常用的搜索方式&#xff0c;通…

消息中间件是什么?有什么用?常见的消息中间件有哪些?

1.什么是消息中间件&#xff1f; 消息中间件基于队列模型在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。 2.现实中的痛点&#xff1a; 1.Http请求基于请求与响应的模型&#xff0c;在高并发的情况下&#xff0c;客户端发送大量的请求达到服务器端…

C# WinForm —— 19 PictureBox 介绍

1. 简介 PictureBox 主要用于显示图像&#xff0c;也可以给它注册单击事件&#xff0c;来把它变成一个按钮 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般以 pixB 开头BackColor控件的背景色BackgroundImage控件的背景图像BorderStylePictur…

开放式耳机什么品牌最好?2024五款新晋爆款产品推荐!

​如今的耳机市场天下三分&#xff0c;有线入耳式耳机、蓝牙无线入耳式耳机以及开放式耳机&#xff0c;传统的有线入耳式耳机戴着不稳就算了&#xff0c;线很容易揉成一团&#xff0c;看着就头大&#xff1b;无线入耳式的耳机&#xff0c;同样面临着戴着不稳的问题&#xff0c;…

如何在群晖NAS中开启FTP并实现使用公网地址远程访问传输文件

文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 本文主要介绍如何在群晖NAS中开启FTP服务并结合cpolar内网穿透工具&#xff0c;实现使用固定公网地址远程访问群晖FTP服务实现文件上传下载。 Cpolar内…

Nginx内网环境开启https

文章目录 前言一、open-ssl1. 验证2. 安装3.生成ssl证书 一、nginx1. 验证支持模块2. 安装必要模块2.1 重新编译nginx2.2 替换原文件 3. 配置https 总结 前言 nginx开启https前提&#xff1a; 服务器支持open-sslnginx 包含--with-http_ssl_module --with-stream --with-stre…

JavaScript原理篇——Promise原理及笔试题实战演练

Promise 是 JavaScript 中用于处理异步操作的对象&#xff0c;它代表了一个可能还没有完成的操作的最终完成或失败&#xff0c;以及其结果值。Promise 对象有三种状态&#xff1a; Pending&#xff08;进行中&#xff09;&#xff1a;初始状态&#xff0c;既不是成功&#xff0…

前端js面试题--从字符串中删除删除注释代码

问题&#xff1a;从字符串中删除删除注释代码 描述&#xff1a; solution(weex,rex # and react\nflutter\nnative ssss !hybrid app, [#, !]) 写一个solution函数清除后面参数数组里面的字符串 打印效果 代码1 思路&#xff1a; 将字符全凡是有去掉标志符号的全部添加\n…

flutter 使用Scrollbar 时出现 滚动条不置顶问题

Flutter 使用 CupertinoScrollbar 、Scrollbar 与 ListView.builder 结合使用时&#xff0c; 当把 ListView.builder 边距设置为 padding: const EdgeInsets.all(0) 的时候&#xff0c; Scrollbar 的滚动条不置顶。 如图&#xff1a;右侧边上的滚动条 解决方法&#xff1a; …