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;//定义指针时,给指针初始化为NULLmodify_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内是3while (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 9999scanf("%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.hqwc.cn/news/697649.html

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

相关文章

【错误的集合】力扣python

最初想法 def findErrorNums(nums):n len(nums)duplicate -1missing -1for num in nums:if nums[abs(num) - 1] < 0:duplicate abs(num)else:nums[abs(num) - 1] * -1for i in range(n):if nums[i] > 0:missing i 1breakreturn [duplicate, missing] 遇到力扣大佬…

【自动驾驶技术栈学习】1-硬件《大话自动驾驶》| 综述要点总结 by.Akaxi

----------------------------------------------------------------------------------------------------------------- 致谢&#xff1a;感谢十一号线人老师的《大话自动驾驶》书籍&#xff0c;收获颇丰 链接&#xff1a;大话自动驾驶 (豆瓣) (douban.com) -------------…

GPU性能实时监控的几种软件

在深度学习服务器上&#xff0c;各种模型的训练&#xff0c;需要监控GPU的情况&#xff0c;并且需要根据使用状态来切换不同的GPU上。 有以下四款软件&#xff0c;可以很好的进行GPU状态监控。 1. nvidia-smi 一个跨平台工具&#xff0c;用于监控和管理NVIDIA GPU的状态和性…

【数据结构】栈和队列OJ面试题

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;由于C语言没有栈的接口&#xff0c;所以我们需要自己造一个“模子”。我们直接copy之前的实现的栈的接口就可以了&#xff08;可以看我之前的博客【数据结构】栈和队列-CSDN博客copy接口&#xff09;&…

Linux进程间几种通信机制

一. 简介 经过前一篇文章的学习&#xff0c; 我们知道Linux下有两种标准&#xff1a;system V标准和 Posix标准。 System V 和 POSIX 标准是操作系统提供的接口标准&#xff0c;它们规定了操作系统应该如何实现一些基本功能&#xff0c;比如线程、进程间通信、文件处理等。 …

通过金山和微软虚拟打印机转换PDF文件,流程方法及优劣对比

文章目录 一、WPS/金山 PDF虚拟打印机1、常规流程2、PDF文件位置3、严重缺陷二、微软虚拟打印机Microsoft Print to Pdf1、安装流程2、微软虚拟打印机的优势一、WPS/金山 PDF虚拟打印机 1、常规流程 安装过WPS办公组件或金山PDF独立版的电脑,会有一个或两个WPS/金山 PDF虚拟…

校园志愿者管理系统带万字文档

文章目录 校园志愿者管理系统一、项目演示二、项目介绍三、10000字论文参考四、部分功能页面五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 校园志愿者管理系统 一、项目演示 校园志愿者管理系统 二、项目介绍 基于Spring…

vue3中通过自定义指令实现loading加载效果

前言 在现代Web开发中&#xff0c;提升用户体验一直是开发者们追求的目标之一。其中&#xff0c;一个常见的场景就是在用户与应用程序进行交互时&#xff0c;特别是当进行异步操作时&#xff08;如网络请求&#xff09;&#xff0c;为用户提供即时的反馈&#xff0c;避免用户因…

利用香港多IP服务器进行大数据分析的潜在优势?

利用香港多IP服务器进行大数据分析的潜在优势? 在当今数据驱动的时代&#xff0c;大数据分析已经成为企业获取竞争优势的不二选择。而香港作为一个拥有世界级通信基础设施的城市&#xff0c;提供了理想的环境来部署多IP服务器&#xff0c;从而为大数据分析提供了独特的优势。…

[数据结构1.0]选择排序

鼠鼠前面的博客介绍过选择排序是常见的排序算法&#xff0c;选择排序有但不限于直接选择排序和堆排序&#xff01;那么鼠鼠今天浅谈一下选择排序&#xff01; 鼠鼠本博客用排升序来介绍选择排序&#xff01; 目录 1.直接选择排序 1.1.直接选择排序 1.2.直接选择排序特性 2…

20240513,常用算法(查找,排序,拷贝替换)

做着一些和考试无关的事情 常用查找算法——续 FIND_IF find_if //按条件查找元素&#xff0c;返回迭代器POS / END()find_if(beg,end,_Fred) _Fred函数或谓词&#xff08;返回BOOL类型的仿函数&#xff09; #include<iostream> #include<string> #includ…

Raft论文阅读笔记+翻译:In Search of Understandable Consensus Algorithm

In Search of Understandable Consensus Algorithm 摘要 Raft是一种管理复制日志的共识算法。它产生与&#xff08;多&#xff09;Paxos等效的结果&#xff0c;并且与Paxos一样高效&#xff0c;但其结构与Paxos不同。这使得Raft比Paxos更易理解&#xff0c;也为构建实际系统提供…