C++单向链表节点增删操作详解

陈默
陈默
发布时间:2026-10-16 | 7人浏览过
原创

本文详细解析C++单向链表中节点的创建与插入操作,包括使用`malloc`分配内存的结构体设计,以及头插法、尾插法和中间插入的完整代码实现。

链表节点与内存管理基础

单向链表由一系列节点组成,每个节点包含存储数据的域(data)和指向下一个节点的指针(next)。在C++中,通常使用`struct`来定义节点,并通过动态内存分配函数为节点分配空间,以实现长度可变的列表结构。

第1步:定义节点结构体

为了统一管理节点,首先定义包含数据域和指针域的结构体。此结构体是后续所有操作的基础。

struct Node {
	int data;
	struct Node* next;
};

第2步:创建新节点

在进行任何插入操作前,需有一个通用的节点创建函数。该函数负责申请内存、初始化数据域并将 `next` 置为空,确保新节点处于未连接状态。

struct Node* createNode(int data) {
	// 动态分配内存并转换为 Node 类型指针
	struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
	// 初始化数据域
	newNode->data = data;
	// 初始化指针域为空
	newNode->next = NULL;
	return newNode;
}

链表的初始化

为了实现统一的插入逻辑(避免判断是否为空链表),本例采用带头结点的链表。头结点不存具体业务数据,仅作为入口。

struct Node* createList() {
	// 创建一个指针对象表示表头
	struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
	// 头结点的 next 初始化为 NULL,表示链表为空
	headNode->next = NULL;
	return headNode;
}

节点的插入操作

链表的核心在于指针的重定向。插入操作主要分为三种场景:头部插入、尾部插入以及指定位置后插入。

第3步:头部插入(头插法)

目的是将新节点置于有效数据的第一个位置。操作上只需让新节点的 `next` 指向当前 `head.next`,然后更新 `head.next` 指向新节点。

void insertNodeByHead(struct Node* headNode, int data) {
	// 1. 创建新节点
	struct Node* newNode = createNode(data);
	// 2. 新节点指向原首元素
	newNode->next = headNode->next;
	// 3. 头结点指向新节点
	headNode->next = newNode;
}

第4步:尾部插入(尾插法)

目的是将新节点追加到链表末尾。需要遍历找到最后一个节点(其 `next` 为 `NULL`),然后将最后节点的 `next` 指向新节点。

void insertNodeByTail(struct Node* headNode, int data) {
	// 1. 创建新节点
	struct Node* newNode = createNode(data);
	// 2. 遍历找到最后一个节点
	while (headNode->next != NULL) {
		headNode = headNode->next;
	}
	// 3. 将最后节点的 next 指向新节点
	headNode->next = newNode;
	newNode->next = NULL;
}

第5步:中间节点插入

要求在值为 `i` 的节点后面插入新节点。流程为先查找目标节点,检查是否存在,若存在则修改指针指向。

void insertNodeByCenter(struct Node* headNode, int data, int i) {
	struct Node* posNode = headNode;
	// 1. 创建新节点
	struct Node* newNode = createNode(data);
	
	// 2. 查找值为 i 的节点
	if (posNode == NULL) {
		printf("无法查找此数据,链表为空\n");
	} else {
		while (posNode->data != i) {
			posNode = posNode->next;
			// 如果遍历完还没找到
			if (posNode == NULL) {
				printf("未找到此数据\n");
				break;
			}
		}
		// 只有当循环正常结束时执行插入(即 posNode 不是 NULL)
		if (posNode != NULL) {
			newNode->next = posNode->next;
			posNode->next = newNode;
		}
	}
}

要点总结

C++链表的插入操作关键在于理解指针的传递与重定向。通过定义结构体和辅助的创建函数,可以清晰地分离逻辑步骤。注意在处理中间插入时,必须确保目标节点确实存在,以防止空指针访问或逻辑错误。

以上就是C++链表节点添加操作的详细内容,更多关于C++链表技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表