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; }