链表是一种常见的数据结构,用于实现各种算法和系统中的数据存储和管理。它是一个节点的集合,每个节点包含数据和指向下一个节点的指针。使用指针可以动态分配内存空间,因此可以在运行时添加或删除节点。
以下是一个简单的C语言链表示例:
#include <stdio.h>
#include <stdlib.h>
typedef struct node { // 定义链表节点结构体
int data; // 数据域
struct node *next; // 指针域
} Node, *LinkedList; // Node表示节点类型,LinkedList表示指向节点的指针类型
/**
* 创建链表并返回头结点
*/
LinkedList createLinkedList() {
LinkedList head = (LinkedList) malloc(sizeof(Node)); // 分配头结点内存空间
head->next = NULL; // 头结点的指针域初始值为NULL
return head;
}
/**
* 向链表尾部添加一个节点
*/
void addNode(LinkedList head, int data) {
Node *newNode = (Node *) malloc(sizeof(Node)); // 分配新节点内存空间
newNode->data = data; // 填充新节点的数据域
newNode->next = NULL; // 新节点的指针域初始值为NULL
Node *p = head;
while (p->next != NULL) { // 找到链表的末尾节点
p = p->next;
}
p->next = newNode; // 将新节点连接到链表的末尾
}
/**
* 打印链表中的所有节点数据
*/
void printLinkedList(LinkedList head) {
Node *p = head->next; // 头结点没有数据,所以跳过头结点
while (p != NULL) { // 遍历链表中的所有节点
printf("%d ", p->data); // 打印节点数据
p = p->next; // 指向下一个节点
}
printf("\n");
}
/**
* 释放链表内存空间
*/
void freeLinkedList(LinkedList head) {
Node *p = head;
while (p != NULL) {
Node *q = p;
p = p->next;
free(q); // 释放节点内存空间
}
}
int main() {
LinkedList head = createLinkedList(); // 创建链表
addNode(head, 1); // 添加节点
addNode(head, 2);
addNode(head, 3);
printLinkedList(head); // 打印链表
freeLinkedList(head); // 释放链表内存空间
return 0;
}
该示例包含以下函数:
createLinkedList()
:创建一个空链表并返回头节点。addNode()
:将一个新节点添加到链表的末尾。printLinkedList()
:遍历链表并打印所有节点的数据。freeLinkedList()
:释放链表内存空间。
在 main()
函数中,首先使用 createLinkedList()
创建一个空链表,然后使用 addNode()
向链表中添加三个节点。接下来,使用 printLinkedList()
打印链表中的所有节点数据。最后,使用 freeLinkedList()
释放链表内存空间。
需要注意的是,在释放链表内存空间时,应该从头节点开始遍历,并依次释放每个节点的内存空间。