1、定义链表节点结构
定义一个链表节点结构,每个节点包含一个数据域和一个指向下一个节点的指针。
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构
struct Node {
int data;
struct Node* next;
};
int main() {
printf("Hello, World!");
return 0;
}
2、创建新节点
定义一个函数来创建一个新节点。
#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));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
int main() {
printf("Hello, World!");
return 0;
}
3、插入节点
定义一个函数来在链表的头部插入一个节点,再定义一个函数来在链表的末尾插入一个节点。
#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));
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 appendNode(struct Node** head, int data) {
struct Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
return;
}
struct Node* last = *head;
while (last->next != NULL) {
last = last->next;
}
last->next = newNode;
}
int main() {
printf("Hello, World!");
return 0;
}
4、删除节点
定义一个函数来删除一个给定数据的节点。
#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));
newNode->data = data;
newNode->next = NULL;
return 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);
}
int main() {
printf("Hello, World!");
return 0;
}
5、遍历链表
定义一个函数来遍历链表并打印每个节点的数据。
#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));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 遍历链表
void traverseList(struct Node* head) {
struct Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
printf("Hello, World!");
return 0;
}
6、使用示例
在主函数中,可以将创建一个链表,并进行插入、删除和遍历操作。
#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));
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 appendNode(struct Node** head, int data) {
struct Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
return;
}
struct Node* last = *head;
while (last->next != NULL) {
last = last->next;
}
last->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 traverseList(struct Node* head) {
struct Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
struct Node* head = NULL;
// 插入一些节点
insertAtHead(&head, 1);
insertAtHead(&head, 2);
insertAtHead(&head, 3);
// 链表现在是 3 -> 2 -> 1
printf("插入节点后的链表:\n");
traverseList(head);
// 在末尾附加节点
appendNode(&head, 4);
appendNode(&head, 5);
// 链表现在是 3 -> 2 -> 1 -> 4 -> 5
printf("附加节点后的链表:\n");
traverseList(head);
// 删除一个节点
deleteNode(&head, 3);
// 链表现在是 2 -> 1 -> 4 -> 5
printf("删除节点后的链表:\n");
traverseList(head);
return 0;
}