跳转到内容

C-EASY-2:指针

计算机系统Banner

碎碎念:这一节的难度会比较大,会涉及一些你在c语言基础课中没有学到的内容,你可以借助ai辅助完成代码,但是我希望你能弄清楚为什么代码要那么写。这一章的内容主要是大一下的专业课内容,在这一题的范围内你可以不那么清楚代码怎么写,但要弄清楚原理,不能纯ai。

指针是C语言提供的一种特殊变量类型,用于存储内存地址。C语言中为指针提供了取地址(&)解引用(*)运算符,以及算术运算支持(通常都涉及数组)。尝试了解它们的用法以及指针的相关知识,回答下列问题:

  1. 如何在C语言中定义指针变量?指针变量的大小是固定的吗?其大小与什么有关?

  2. 写出以下代码的输出结果,并解释原因。

    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);
  3. 什么是野指针?简述其危害。如何避免产生野指针?

  4. 尝试设计一个真正有效的swap()函数

结构体是用户自定义的复合数据类型,可包含不同数据类型的成员。请自行了解结构体的相关内容,回答下列问题:

  1. 请你完成一个PerInfo结构体的定义,成员组成如下。了解一下typedef关键字与结构体的一般用法,利用typedef为你刚刚定义的结构体取一个别名。提交最终的结构体定义。

    1. 个人姓名(字符型数组,长度为10个字节)
    2. 性别(字符型)
    3. 年龄(整型)
    4. 身高(双精度浮点型)
  2. 了解并说明结构体指针的含义。

  3. 了解一下结构体的内存对齐规则,据此计算一下你刚刚定义的结构体占用字节的大小(可用sizeof运算符验证计算结果)。提交计算过程。(此外,你还可以尝试更改一下结构体中成员的定义顺序,看看对结构体占用字节数的影响)

链表是一种线性数据结构,它由一组节点组成,每个节点包含数据域和指针域;数据域用于存储元素本身,指针域用于存储下一个节点的地址,从而把各个节点按逻辑顺序连接起来。

请你先自学链表,了解什么是链表,然后回答下面的问题。

  1. 请对比链表和数组的存储,讲讲链表和数组的区别
  2. 简述单向链表节点的结构特点。定义一个只存储一个整数的单向链表节点。

在我们日后的学习中,各种操作都要围绕增删改查进行,接下来让我们实现链操作的增删改查。

你需要将接下来的所有函数放在一个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。

在查找到某一个特定节点的基础上,通过修改data的值即可实现更改。

那么该如何删除一个节点呢?我们需要引入双指针。两个指针交替向前直到后一个指针指向要删除的节点,前一个指针在要删除节点前。然后让前一个指针指向要删除节点的下一个节点。然后free掉要删除的节点即可。

请你实现删除第n个节点的函数。只传入头指针和n,如果链表节点数少于n返回false,反之返回true。

请根据上面双指针的思想,设计一个函数,传入头指针,然后将链表倒置,头指针指向新链表的第一个节点。

链操作不止可以用在链表上,其他所有的数据结构都可以采用顺序表和链表两种存储方式。在下一题中我们会学习简单的二叉树,其中就会用到链来存储数据。

提交点这里

出题人:出题人头像  taaaakoooo

QQ:1748798371

邮箱:1748798371@qq.com