C-EASY-2:指针
碎碎念:这一节的难度会比较大,会涉及一些你在c语言基础课中没有学到的内容,你可以借助ai辅助完成代码,但是我希望你能弄清楚为什么代码要那么写。这一章的内容主要是大一下的专业课内容,在这一题的范围内你可以不那么清楚代码怎么写,但要弄清楚原理,不能纯ai。
Step 1. 指针与结构体
Section titled “Step 1. 指针与结构体”什么是指针?
Section titled “什么是指针?”指针是C语言提供的一种特殊变量类型,用于存储内存地址。C语言中为指针提供了取地址(&)和解引用(*)运算符,以及算术运算支持(通常都涉及数组)。尝试了解它们的用法以及指针的相关知识,回答下列问题:
-
如何在C语言中定义指针变量?指针变量的大小是固定的吗?其大小与什么有关?
-
写出以下代码的输出结果,并解释原因。
int x = 10;int* p = &x;*p = 20;int arr[3] = {3, 6, 9};int *q = arr;int y = ++*arr + *++q;printf("%d %d", x, y); -
什么是野指针?简述其危害。如何避免产生野指针?
-
尝试设计一个真正有效的swap()函数
什么是结构体?
Section titled “什么是结构体?”结构体是用户自定义的复合数据类型,可包含不同数据类型的成员。请自行了解结构体的相关内容,回答下列问题:
-
请你完成一个PerInfo结构体的定义,成员组成如下。了解一下typedef关键字与结构体的一般用法,利用typedef为你刚刚定义的结构体取一个别名。提交最终的结构体定义。
1. 个人姓名(字符型数组,长度为10个字节)2. 性别(字符型)3. 年龄(整型)4. 身高(双精度浮点型) -
了解并说明结构体指针的含义。
-
了解一下结构体的内存对齐规则,据此计算一下你刚刚定义的结构体占用字节的大小(可用sizeof运算符验证计算结果)。提交计算过程。(此外,你还可以尝试更改一下结构体中成员的定义顺序,看看对结构体占用字节数的影响)
Step2. 链操作
Section titled “Step2. 链操作”什么是链表?
Section titled “什么是链表?”链表是一种线性数据结构,它由一组节点组成,每个节点包含数据域和指针域;数据域用于存储元素本身,指针域用于存储下一个节点的地址,从而把各个节点按逻辑顺序连接起来。
请你先自学链表,了解什么是链表,然后回答下面的问题。
- 请对比链表和数组的存储,讲讲链表和数组的区别
- 简述单向链表节点的结构特点。定义一个只存储一个整数的单向链表节点。
实现基本的链操作
Section titled “实现基本的链操作”在我们日后的学习中,各种操作都要围绕增删改查进行,接下来让我们实现链操作的增删改查。
你需要将接下来的所有函数放在一个c文件中,并将其上传。
使用你在上一步定义的单向链表节点作为链表节点。链表初始状态为头指针Head指向一个data值为0的节点,此时该节点为链表唯一节点。(head -> 0 -> NULL)
在添加元素之前,我们需要先明白,我们添加的元素是什么。链表存储的是节点而非数据,因此我们需要先实现一个定义节点的函数。
请你设计一个函数,传入一个数据(int即可),返回一个存储这个数据的节点。
如何在链表中插入一个元素呢?我们可以定义一个新的节点A,让A指向头节点0,然后再让头指针指向A,实现头插
请你实现头插函数。函数传入主链表的头指针head和一个数据n
在实现链表的头插以后,你会自然的想到,能否在链表的尾部插入一个节点。
请你自己设计尾插函数,并用代码将其实现。(提示:不要直接用头指针,定义一个新的指针将其赋值为头指针)
如何查找一个元素呢?查找中很多算法,但在这一题当中,你只需要掌握最基本的遍历查找即可。
在数组中,我们想要查找第n位的元素,我们只需要访问arr[n-1]即可。但是在链表中,我们需要依次访问每一个节点,直至访问到第n个节点。依次访问每一个节点,这就是遍历。
通过遍历思想,我们可以打印链表每个节点的数据。请你实现这个打印链表函数,传入链表头指针。且打印后不要改变头指针的指向。
通过这个打印函数,你可以先验证上面你添加元素的函数是否正确。
我们更多查找的是,定义一个数据n,查找链表中是否存在一个节点,其存储的数据为n。
请你实现这个查找函数。传入头节点head和要查找的数据n,输出这个节点距头节点的距离(统计这是第几个节点)。如果有多个数据为n的节点只返回第一个,如果没有查找到则返回false。
删除和更改:
Section titled “删除和更改:”在查找到某一个特定节点的基础上,通过修改data的值即可实现更改。
那么该如何删除一个节点呢?我们需要引入双指针。两个指针交替向前直到后一个指针指向要删除的节点,前一个指针在要删除节点前。然后让前一个指针指向要删除节点的下一个节点。然后free掉要删除的节点即可。
请你实现删除第n个节点的函数。只传入头指针和n,如果链表节点数少于n返回false,反之返回true。
请根据上面双指针的思想,设计一个函数,传入头指针,然后将链表倒置,头指针指向新链表的第一个节点。
链操作不止可以用在链表上,其他所有的数据结构都可以采用顺序表和链表两种存储方式。在下一题中我们会学习简单的二叉树,其中就会用到链来存储数据。
本题提交方式
Section titled “本题提交方式”出题人联系方式
Section titled “出题人联系方式”出题人:
taaaakoooo
QQ:1748798371
