数据结构中单链表的基本设计(1)

此文是我结合官方文档进行的改写,鉴于有和我前几年一样的初学者,我把官网很多没说明的c语言基础定义、函数、宏、关键字等进行详细说明,更加方便读者进行阅读和学习,新手小白也可一篇文章及学会链表、不需要再进行各种繁复的检索即可学会链表。希望能有点赞与支持。

 附(前字节程序员收徒、外接各种程序软件设计开发、招聘实习生和远程开发)

淘宝链接:链接:商品详情页

详细请见我博客中的 数据结构中单链表的基本设计(总)

1、首先你得看看这个:

1.1指针

  • p: 如果 p 被声明为一个指针类型,比如 int *p;,那么 p 本身是一个变量,它存储了一个内存地址。这个地址是另一个变量(例如一个整数)在内存中的位置。

  • *p: 当你写 *p 时,这被称为指针的解引用。这意味着你要访问 p 所指向的那个内存地址里的数据。换句话说,*p 给你的是存储在 p 指向的地址中的值。

例如,如果你这样初始化一个指针并给它赋值:

1int x = 10;
2int *p = &x; // p 现在存储了变量 x 的地址

在这个例子中,*p 将会给你变量 x 的值,即 10。所以如果之后你这样使用:

1printf("%d\n", *p); // 输出 x 的值,即 10

这就是 p*p 的基本区别:p 是地址,*p 是该地址处的内容。

1.2结构体定义

1struct Tag {
2    int myInt;       // 整型变量
3    char myChar;     // 字符变量
4    float myFloat;   // 浮点型变量
5};

在这个例子中,struct Tag定义了一个名为Tag的结构体类型,它包含了三个成员:一个整型myInt,一个字符型myChar,和一个浮点型myFloat

创建结构体变量

定义好结构体类型后,你可以声明结构体变量:

1struct Tag example;

example就是一个struct Tag类型的变量,你可以通过.操作符访问和修改其成员:

1example.myInt = 10;
2example.myChar = 'A';
3example.myFloat = 3.14;
结构体数组与指针

结构体也可以作为数组元素或被指针指向,例如:

1struct Tag array[10];   // 结构体数组,包含10个Tag结构体
2struct Tag *ptr;       // 指向Tag结构体的指针
3
4ptr = &example;        // ptr指向example结构体
5ptr->myInt = 20;      // 使用指针访问和修改结构体成员,等效于example.myInt = 20;

结构体是C语言中处理复杂数据结构的基础,广泛应用于实现链表、树、图形数据等多种数据组织形式中。

1.3Node结构体与其指针

指向Node结构体的指针
  1. 存储内容:指针变量存储的是结构体Node在内存中的地址,而不是结构体本身的数据。
  2. 内存分配:指针变量本身占用的空间较小,通常是一个机器字长(例如32位系统上是4字节,64位系统上是8字节),只存储地址信息。
  3. 访问方式:访问结构体成员时,需要使用指针解引用操作,如ptr->data(*ptr).data,其中ptr是结构体指针。
  4. 动态分配:指针常用于动态内存分配,如使用malloc()new在运行时为结构体分配内存。
  5. 灵活性:指针提供了更大的灵活性,可以在程序运行时改变指向,便于动态管理和修改数据结构。
Node结构体变量
  1. 存储内容:直接存储结构体Node的所有数据成员,包括datanext指针等。
  2. 内存分配:在栈上分配(如果是局部变量)或静态分配(如果是全局变量或静态局部变量),随变量定义自动分配所需大小的内存。
  3. 访问方式:直接通过.操作符访问成员,如node.data
  4. 生命周期:通常与声明它的作用域相关联,局部变量在函数退出时销毁,全局变量或静态变量则在整个程序运行期间存在。
  5. 固定大小:大小在编译时确定,不易在运行时改变。

总结来说,指针提供了一种间接访问数据的方式,更加灵活,适合动态内存管理和链表等动态数据结构的构建,而直接的结构体变量存储数据更为直接,适用于大小固定、生命周期与作用域明确的场景。

1.4、单链表

单链表是一种链式存取的数据结构,,链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。以“结点的序列”表示的线性表称作线性链表(单链表),单链表是链式存取的结构。对于链表的每一个结点,我们使用结构体(struct)进行设计,其主要内容有:

单链表结点结构

其中,DATA数据元素,可以为你想要储存的任何数据格式,可以是数组,可以是int,甚至可以是结构体(这就是传说中的结构体套结构体)

NEXT为一个指针,其代表了一个可以指向的区域,通常是用来指向下一个结点,链表的尾部NEXT指向NULL(空),因为尾部没有任何可以指向的空间了

故,对于一个单链表的结点定义,可以代码描述成:

1

2

3

4

5

6

//定义结点类型

typedef struct Node {

    int data;       //数据类型,你可以把int型的data换成任意数据类型,包括结构体struct等复合类型

    struct Node *next;          //单链表的指针域

} Node,*LinkedList;  

//Node表示结点的类型,LinkedList表示指向Node结点类型的指针类型

其中

  1. typedef关键字typedef是C语言中的一个关键字,用于为现有的数据类型创建一个新的名字(别名)。这样做可以让代码更易于阅读,或者简化复杂的类型声明。

  2. 类型别名

    • } Node;:这结束了结构体的定义,并直接命名这个结构体类型为Node,无需再用struct关键字前缀。
    • , *LinkedList;:通过typedef,这里定义了LinkedList作为一个类型别名,它实际上是struct Node*的别名,即它是一个指向Node结构体的指针类型。这意味着当你声明一个变量为LinkedList类型时,你实际上是在声明一个指向Node结构体的指针。
  3. 结构体定义struct Node定义了一个名为Node的结构体类型。结构体是一种复合数据类型,允许你组合不同类型的数据项(称为成员)到一个单独的变量中。

    • int data;:这是结构体Node中的第一个成员,类型为int,用于存储链表中的实际数据。这里的数据类型可以按需替换为任何其他类型,比如floatchar数组、甚至是其他结构体类型。

    • struct Node *next;:这是结构体中的第二个成员,是一个指针,类型为指向struct Node的指针,即它指向链表中的下一个节点。这正是单链表的特性之一,通过next指针将多个节点串联起来。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比比芭比波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值