c语言·链表的创建与使用

1、原理

2、静态链表

3、动态链表

目录

1、原理

2、静态链表

3、动态链表


I、原理

由本结点内指向结构体类型的指针赋值为下一个结点的地址,就可以实现结点之间的链接,形成一个链表。大概原理如图:

 此时一个完整的结构体类型就可以看作是一个结点,n个结点相连接形成一个链表。

II、静态链表(先定义好所有的变量,再引用)

(1)、创建:

  • (a)、创立一个结构体类型,同时增加指向结构体类型的指针:struct (类型名){ 成员列表; struct + 类型名+指针名;};
  • (b)、主函数内定义几个需要用到的结构体类型变量以及两个指针;定义的指针一定是struct 类型名+指针名形式,否则不能指向结构体的首地址。
  • (c)、在主函数内定义好其余变量的值,并把下一个结构体的地址赋值给上一个结构体的指针,最后一个结构体指针为空指针。

(2)使用

  • (d)最后以循环的形式输出,注意不能以“p.name”的形式输出

 III、动态链表

补给:void *malloc(unsigned int size)表示在内存中分配一个长度为size的连续存储空间,其中size不为负数。此函数的返回值为所分配的首字节地址,但因为是无类型的指针,因而需要强制转换为结构体类型指针。建立动态链表时需要用malloc函数实时申请内存。需要用到的库函数为stdlib.h;

(1)、创建

(a)、第一步与静态链表的创建相同,建立一个结构体类型;

(b)、在主函数或者新建立的一个结构体类型指针函数内定义好相关的变量:结构体指针(包括头指针(指向首个结点的首字节)、指针p1(承接下一结点首字节地址,开辟新结点)、指针p2(连接两个结点))

 其中,ln表示整个结构体所需要的内存:ln=sizeof(struct 结构体类型);可以定义为全局变量,也可以在函数中定义;

(c)、使用循环语句可以自由进行输入,并且可以自由决定创建的结点个数;

大概流程:

 

 最后要把最后一个指针赋值为空指针;

 (2)、输出

(d)、利用循环语句对已有的值进行输出;

 

 

C语言中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。创建和插入链表链表操作的基础。以下是如何在C语言创建和插入节点的步骤: ### 创建链表 1. **定义节点结构体**:首先,定义一个结构体来表示链表的节点,通常包含一个数据域和一个指向下一个节点的指针。 ```c typedef struct Node { int data; // 数据域 struct Node* next; // 指针域,指向下一个节点 } Node; ``` 2. **创建头节点**:通常情况下,链表的头节点是一个哑节点(dummy node),即它的数据域不存储有效数据,这样可以简化插入和删除操作。 ```c Node* head = (Node*)malloc(sizeof(Node)); // 分配头节点的内存 if (head != NULL) { head->next = NULL; // 初始化头节点的指针域为NULL } ``` ### 插入节点 插入节点通常有三种情况:在链表头部插入、在链表尾部插入和在链表中间插入。 1. **在链表头部插入节点**: ```c Node* insertAtHead(Node* head, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode != NULL) { newNode->data = data; // 设置新节点的数据 newNode->next = head->next; // 新节点指向原头部节点 head->next = newNode; // 头节点指向新节点 } return head; } ``` 2. **在链表尾部插入节点**: ```c Node* insertAtTail(Node* head, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode != NULL) { newNode->data = data; // 设置新节点的数据 newNode->next = NULL; // 新节点指向NULL,因为它是尾部节点 Node* current = head; while (current->next != NULL) { // 遍历到链表的最后一个节点 current = current->next; } current->next = newNode; // 将最后一个节点的next指向新节点 } return head; } ``` 3. **在链表中间插入节点**: ```c Node* insertAfter(Node* prevNode, int data) { if (prevNode == NULL) { return head; // 如果前一个节点为NULL,则不执行插入 } Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode != NULL) { newNode->data = data; // 设置新节点的数据 newNode->next = prevNode->next; // 新节点指向原前一个节点的下一个节点 prevNode->next = newNode; // 原前一个节点指向新节点 } return head; } ``` 在所有情况中,插入节点后都应当返回头节点的指针,以便链表可以正确地被遍历或操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值