此文是我结合官方文档进行的改写,鉴于有和我前几年一样的初学者,我把官网很多没说明的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结构体的指针
- 存储内容:指针变量存储的是结构体
Node
在内存中的地址,而不是结构体本身的数据。 - 内存分配:指针变量本身占用的空间较小,通常是一个机器字长(例如32位系统上是4字节,64位系统上是8字节),只存储地址信息。
- 访问方式:访问结构体成员时,需要使用指针解引用操作,如
ptr->data
或(*ptr).data
,其中ptr
是结构体指针。 - 动态分配:指针常用于动态内存分配,如使用
malloc()
或new
在运行时为结构体分配内存。 - 灵活性:指针提供了更大的灵活性,可以在程序运行时改变指向,便于动态管理和修改数据结构。
Node结构体变量
- 存储内容:直接存储结构体
Node
的所有数据成员,包括data
和next
指针等。 - 内存分配:在栈上分配(如果是局部变量)或静态分配(如果是全局变量或静态局部变量),随变量定义自动分配所需大小的内存。
- 访问方式:直接通过
.
操作符访问成员,如node.data
。 - 生命周期:通常与声明它的作用域相关联,局部变量在函数退出时销毁,全局变量或静态变量则在整个程序运行期间存在。
- 固定大小:大小在编译时确定,不易在运行时改变。
总结来说,指针提供了一种间接访问数据的方式,更加灵活,适合动态内存管理和链表等动态数据结构的构建,而直接的结构体变量存储数据更为直接,适用于大小固定、生命周期与作用域明确的场景。
1.4、单链表
单链表是一种链式存取的数据结构,,链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。以“结点的序列”表示的线性表称作线性链表(单链表),单链表是链式存取的结构。对于链表的每一个结点,我们使用结构体(struct)进行设计,其主要内容有:
其中,DATA数据元素,可以为你想要储存的任何数据格式,可以是数组,可以是int,甚至可以是结构体(这就是传说中的结构体套结构体)
NEXT为一个指针,其代表了一个可以指向的区域,通常是用来指向下一个结点,链表的尾部NEXT指向NULL(空),因为尾部没有任何可以指向的空间了
故,对于一个单链表的结点定义,可以代码描述成:
1 2 3 4 5 6 |
|
其中
-
typedef
关键字:typedef
是C语言中的一个关键字,用于为现有的数据类型创建一个新的名字(别名)。这样做可以让代码更易于阅读,或者简化复杂的类型声明。 -
类型别名:
} Node;
:这结束了结构体的定义,并直接命名这个结构体类型为Node
,无需再用struct
关键字前缀。, *LinkedList;
:通过typedef
,这里定义了LinkedList
作为一个类型别名,它实际上是struct Node*
的别名,即它是一个指向Node
结构体的指针类型。这意味着当你声明一个变量为LinkedList
类型时,你实际上是在声明一个指向Node
结构体的指针。
-
结构体定义:
struct Node
定义了一个名为Node
的结构体类型。结构体是一种复合数据类型,允许你组合不同类型的数据项(称为成员)到一个单独的变量中。-
int data;
:这是结构体Node
中的第一个成员,类型为int
,用于存储链表中的实际数据。这里的数据类型可以按需替换为任何其他类型,比如float
、char
数组、甚至是其他结构体类型。 -
struct Node *next;
:这是结构体中的第二个成员,是一个指针,类型为指向struct Node
的指针,即它指向链表中的下一个节点。这正是单链表的特性之一,通过next
指针将多个节点串联起来。
-