✅ 在我们不知道一组数据的具体长度的时候,链表可以派上用场。
单链表中的节点一般由数据域和指针域组成,数据域中存储所需数据,指针域存放下一个指向下一个节点的指针。以下实例使用C语言中创建了一个单链表,插入数据的方式采用了尾插法。
#include <stdio.h>
#include <stdlib.h>
// 定义节点
typedef int ElementType;
typedef struct NodeList *PtrToNode;
struct NodeList {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
// 创建链表
List CreatList() {
// 给头结点开辟空间
PtrToNode L = (PtrToNode)malloc(sizeof(struct NodeList));
// 如果返回NULL说明内存已满
if (L == NULL) {
printf("out of memory!");
exit(0);
}
// 头结点指向NULL
L->Next = NULL;
// 返回头节点
return L;
}
// 使用尾插法插入新节点
List InsertNode(List L, ElementType x) {
// 找到现有的尾部节点
PtrToNode tail = L;
while (tail->Next != NULL) {
tail = tail->Next;
}
// 给新节点开辟空间
PtrToNode NewNode = (PtrToNode)malloc(sizeof(struct NodeList));
if (NewNode == NULL) {
printf("out of memory!");
exit(1);
}
// 给新节点存入数据,然后使新节点指向NULL
NewNode->Data = x;
NewNode->Next = NULL;
// 尾部节点指向新节点,更新尾部节点
tail->Next = NewNode;
tail = NewNode;
return L;
}
// 打印列表的值
List PrintList(List L) {
// 跳过头节点
PtrToNode head;
head = L->Next;
// 判断是否为空列表
if (head == NULL) {
printf("EMPTY LIST!");
exit(1);
}
// 循环打印列表中的值
while (head != NULL) {
printf("%d\n", head->Data);
head = head->Next;
}
}
int main() {
List L = CreatList();
InsertNode(L, 10);
InsertNode(L, 15);
PrintList(L);
}