c++:
// 链表的系列操作
#include <bits/stdc++.h> // 包含标准库中的所有头文件,但不建议在正式项目中使用
using namespace std; // 使用标准命名空间
// 定义链表节点结构
struct Node {
int data; // 节点数据
struct Node* next; // 指向下一个节点的指针
};
// 创建链表
struct Node* creat_link(struct Node* head) {
// 注意:这里创建的head节点并没有被使用,而是被新的头节点覆盖了
head = (struct Node*)malloc(sizeof(struct Node)); // 分配头节点内存
head->next = NULL; // 初始化头节点的next指针为NULL
struct Node *tail = head; // 尾指针初始化为头节点
for(int i = 1; i <= 10; i++) {
struct Node *temp = (struct Node*)malloc(sizeof(struct Node)); // 分配新节点内存
temp->data = i; // 设置新节点的数据
temp->next = NULL; // 初始化新节点的next指针为NULL
tail->next = temp; // 将新节点添加到链表末尾
tail = temp; // 更新尾指针
}
return head; // 返回链表的头节点
}
// 遍历链表
void print_link(struct Node* head) {
// 注意:这里直接修改了head指针,可能会丢失头节点,但在这个函数中只是遍历
head = head->next; // 跳过头节点(假头),开始遍历
while(head) {
cout << head->data << endl; // 输出当前节点的数据
head = head->next; // 移动到下一个节点
}
}
// 删除某个元素
void delete_node(struct Node* head, int value) {
if (head == NULL || head->next == NULL) {
// 如果链表为空或只有一个节点(即假头),则无法删除
return;
}
struct Node* prev = head; // prev用于记录当前节点的前一个节点
struct Node* current = head->next; // current用于遍历链表
while(current != NULL) {
if(current->data == value) {
// 如果找到了要删除的节点
prev->next = current->next; // 将前一个节点的next指针指向当前节点的下一个节点
free(current); // 释放当前节点的内存
return; // 删除成功,返回
}
prev = current; // 移动prev和current到下一个节点
current = current->next;
}
// 如果遍历完整个链表都没有找到要删除的节点,则不执行任何操作
}
int main() {
struct Node *head = NULL; // 初始化头指针为NULL
head = creat_link(head); // 创建链表
delete_node(head, 5); // 删除值为5的节点
print_link(head); // 遍历并打印链表
// 注意:在真实情况下,应该释放整个链表的内存,但这里为了简洁省略了
return 0;
}
c语言:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data; // 节点数据
struct Node* next; // 指向下一个节点的指针
} Node;
// 创建链表
Node* create_link() {
Node *head = (Node*)malloc(sizeof(Node)); // 分配头节点内存
head->next = NULL; // 初始化头节点的next指针为NULL
return head; // 返回链表的头节点
}
// 在链表中插入元素
void insert_node(Node* head, int value) {
Node *temp = (Node*)malloc(sizeof(Node)); // 分配新节点内存
temp->data = value; // 设置新节点的数据
temp->next = NULL; // 初始化新节点的next指针为NULL
head->next = temp; // 将新节点添加到链表末尾
head = temp; // 更新尾指针
}
// 遍历链表
void print_link(Node* head) {
head = head->next; // 跳过头节点(假头),开始遍历
while(head) {
printf("%d", head->data); // 输出当前节点的数据
head = head->next; // 移动到下一个节点
}
}
// 删除某个元素
void delete_node(Node* head, int value) {
if (head == NULL || head->next == NULL) {
// 如果链表为空或只有一个节点(即假头),则无法删除
return;
}
Node* prev = head; // prev用于记录当前节点的前一个节点
Node* current = head->next; // current用于遍历链表
while(current != NULL) {
if(current->data == value) {
// 如果找到了要删除的节点
prev->next = current->next; // 将前一个节点的next指针指向当前节点的下一个节点
free(current); // 释放当前节点的内存
return; // 删除成功,返回
}
prev = current; // 移动prev和current到下一个节点
current = current->next;
}
// 如果遍历完整个链表都没有找到要删除的节点,则不执行任何操作
}
int main() {
Node *head = create_link(); // 创建链表
insert_node(head, 1); // 插入元素1
insert_node(head, 2); // 插入元素2
insert_node(head, 3); // 插入元素3
print_link(head); // 遍历并打印链表
// 注意:在真实情况下,应该释放整个链表的内存,但这里为了简洁省略了
return 0;
}