- 初始化链表
- 插入节点
- 打印链表
- 删除指定值的节点
- 反转链表
- 概要设计
- 定义一个结构体表示链表的节点,包含一个整数值和一个指向下一个节点的指针。
- 定义一个头指针,用于指向链表的头节点。
- 实现初始化函数init,将头指针置为NULL。
- 实现插入函数insert,在链表末尾插入新节点。
- 实现打印函数printList,遍历链表并打印节点的值。
- 实现删除函数DelElem,删除链表中所有指定值的节点。
- 实现反转函数InversionElem,反转链表的节点顺序。
#include <stdio.h>
#include <stdlib.h>
// 定义单链表节点结构
typedef struct SLinkNode {
int data;
struct SLinkNode* next;
} SLinkNode;
// 初始化链表
void init(SLinkNode** L) { //指向指针的指针 L,该指针指向链表的头节点。
*L = NULL; // 将头指针设置为NULL,表示链表为空
}
// 在链表末尾插入节点
void insert(SLinkNode** L) {
SLinkNode* newNode = (SLinkNode*)malloc(sizeof(SLinkNode)); // 创建新节点
printf("输入一个整数: ");
scanf_s("%d", &(newNode->data)); // 输入节点的整数值
newNode->next = NULL;
if (*L == NULL) {
*L = newNode; // 如果链表为空,将新节点设置为头节点
}
else {
SLinkNode* temp = *L;
while (temp->next != NULL) {
temp = temp->next; // 找到链表的末尾节点
}
temp->next = newNode; // 将新节点插入到末尾节点的next指针处
}
}
// 打印链表
void printList(SLinkNode* L) {
SLinkNode* temp = L;
while (temp != NULL) {
printf("%d ", temp->data); // 打印节点的整数值
temp = temp->next;
}
printf("\n");
}
// 删除链表中所有指定的整数
void DelElem(SLinkNode** L, int x) {
SLinkNode* prev = NULL;
SLinkNode* current = *L;
while (current != NULL) {
if (current->data == x) {
if (prev == NULL) {
*L = current->next; // 如果要删除的节点是头节点,将头指针指向下一个节点
free(current); // 释放要删除的节点的内存
current = *L; // 将当前节点设置为下一个节点,继续遍历
}
else {
prev->next = current->next; // 如果要删除的节点不是头节点,将前一个节点的next指针指向下一个节点
free(current); // 释放要删除的节点的内存
current = prev->next; // 将当前节点设置为下一个节点,继续遍历
}
}
else {
prev = current; // 如果当前节点不是要删除的节点,将前一个节点设置为当前节点
current = current->next; // 将当前节点设置为下一个节点,继续遍历
}
}
}
// 反转链表
void InversionElem(SLinkNode** L) {
SLinkNode* prev = NULL;
SLinkNode* current = *L;
SLinkNode* next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next; //进入一个循环,直到current变为NULL,表示原始链表的末尾。
} //在循环内部,更新next指向原始链表的下一个节点。
//将当前节点的next指针更改为指向前一个节点(prev),从而反转链接
*L = prev; // 将头指针指向反转后的链表的头节点
}
int main() {
SLinkNode* L;
init(&L); // 初始化链表
int n;
printf("输入元素个数: ");
scanf_s("%d", &n); // 输入要插入的节点个数
for (int i = 0; i < n; i++) {
insert(&L); // 插入节点
}
printf("原列表: ");
printList(L); // 打印原始链表
int x;
printf("输入想要删除的数: ");
scanf_s("%d", &x); // 输入要删除的整数
DelElem(&L, x); // 删除链表中所有指定的整数
printf("现列表为: ");
printList(L); // 打印更新后的链表
InversionElem(&L); // 反转链表
printf("倒置的列表为: ");
printList(L); // 打印反转后的链表
return 0;
}
链表的初始化、插入、删除和反转等基本操作
最新推荐文章于 2024-09-03 21:34:10 发布