您现在的位置是:首页 >技术教程 >【C/C++】用指针处理链表网站首页技术教程
【C/C++】用指针处理链表
简介【C/C++】用指针处理链表
在C或C++等编程语言中,链表是一种常见的数据结构,它通过一系列节点相互连接来存储数据。每个节点通常包含两部分:数据本身和指向下一个节点的指针。使用指针来操作链表可以实现插入、删除、遍历等操作。
以下是一个基本的单向链表的示例,包括节点的定义和一些基本的操作函数:
节点定义
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
struct Node {
int data;
struct Node* next;
};
创建新节点
// 创建一个新节点并初始化数据
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (!newNode) {
printf("内存分配失败
");
exit(1);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
在链表的头部插入一个新节点:
// 在链表头部插入新节点
void insertAtHead(struct Node** head, int data) {
struct Node* newNode = createNode(data);
newNode->next = *head;
*head = newNode;
}
在链表的尾部插入一个新节点:
// 在链表尾部插入新节点
void insertAtTail(struct Node** head, int data) {
struct Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
return;
}
struct Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
删除节点
根据值删除节点:
// 根据值删除节点
void deleteNode(struct Node** head, int key) {
struct Node* temp = *head;
struct Node* prev = NULL;
// 检查头节点是否就是要删除的节点
if (temp != NULL && temp->data == key) {
*head = temp->next;
free(temp);
return;
}
// 搜索要删除的节点
while (temp != NULL && temp->data != key) {
prev = temp;
temp = temp->next;
}
// 如果没有找到节点
if (temp == NULL) return;
// 从链表中删除节点
prev->next = temp->next;
free(temp);
}
遍历链表
// 遍历链表并打印每个节点的数据
void printList(struct Node* head) {
struct Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL
");
}
主函数示例
int main() {
struct Node* head = NULL;
insertAtHead(&head, 1);
insertAtHead(&head, 2);
insertAtTail(&head, 3);
insertAtTail(&head, 4);
printf("链表内容: ");
printList(head);
deleteNode(&head, 3);
printf("删除值为3的节点后: ");
printList(head);
return 0;
}
注意事项
- 内存管理:在创建和删除节点时,务必注意内存的管理,避免内存泄漏。
- 空指针检查:在操作链表时,要经常检查指针是否为空,以避免访问非法内存。
- 边界条件:在处理链表操作时,要考虑各种边界条件,如头节点、尾节点和只有一个节点的链表等。
通过掌握这些基本操作,你可以有效地处理链表,并在需要时扩展这些操作以满足更复杂的需求。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。