模拟链表(链表动画演示)
## 模拟链表### 简介链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的优势在于动态分配内存,可以方便地插入和删除节点,不像数组那样需要预先分配固定大小的内存空间。由于某些语言(如 C 语言)没有内置链表数据结构,我们需要手动模拟实现链表。### 1. 节点定义首先,我们需要定义链表的节点结构体:```c struct Node {int data; // 节点数据struct Node
next; // 指向下一个节点的指针 }; ```这个结构体包含两个成员:
`data`: 存储节点的数据,可以是任意类型。
`next`: 指向下一个节点的指针,如果当前节点是最后一个节点,则 `next` 为 NULL。### 2. 链表操作接下来,我们实现一些常用的链表操作:#### 2.1 创建链表创建一个空链表,需要创建一个头节点,并将其 `next` 指针指向 NULL:```c struct Node
createLinkedList() {struct Node
head = NULL;return head; } ```#### 2.2 插入节点插入节点需要指定插入位置,并创建一个新节点,将新节点插入到指定位置。```c // 在头部插入节点 void insertAtHead(struct Node
head, int data) {struct Node
newNode = (struct Node
)malloc(sizeof(struct Node));newNode->data = data;newNode->next =
head;
head = newNode; }// 在指定位置插入节点 void insertAtIndex(struct Node
head, int index, int data) {if (index < 0) {return; }if (index == 0) {insertAtHead(&head, data);return;}struct Node
newNode = (struct Node
)malloc(sizeof(struct Node));newNode->data = data;struct Node
current = head;int count = 0;while (current != NULL && count < index - 1) {current = current->next;count++;}if (current == NULL) {return; // index 超出链表范围}newNode->next = current->next;current->next = newNode; }// 在尾部插入节点 void insertAtEnd(struct Node
head, int data) {struct Node
newNode = (struct Node
)malloc(sizeof(struct Node));newNode->data = data;newNode->next = NULL;if (
head == NULL) {
head = newNode;return;}struct Node
current =
head;while (current->next != NULL) {current = current->next;}current->next = newNode; } ```#### 2.3 删除节点删除节点需要指定要删除的节点,并将其从链表中移除。```c // 删除头节点 void deleteAtHead(struct Node
head) {if (
head == NULL) {return;}struct Node
temp =
head;
head = (
head)->next;free(temp); }// 删除指定位置的节点 void deleteAtIndex(struct Node
head, int index) {if (index < 0) {return;}if (index == 0) {deleteAtHead(head);return;}struct Node
current =
head;int count = 0;while (current != NULL && count < index - 1) {current = current->next;count++;}if (current == NULL || current->next == NULL) {return; // index 超出链表范围}struct Node
temp = current->next;current->next = current->next->next;free(temp); }// 删除最后一个节点 void deleteAtEnd(struct Node
head) {if (
head == NULL || (
head)->next == NULL) {deleteAtHead(head);return;}struct Node
current =
head;while (current->next->next != NULL) {current = current->next;}struct Node
temp = current->next;current->next = NULL;free(temp); } ```#### 2.4 查找节点查找节点需要指定要查找的值,并返回该节点的指针。```c // 查找节点 struct Node
searchNode(struct Node
head, int data) {struct Node
current = head;while (current != NULL) {if (current->data == data) {return current;}current = current->next;}return NULL; // 未找到 } ```#### 2.5 打印链表打印链表可以将链表中所有节点的数据依次输出。```c // 打印链表 void printLinkedList(struct Node
head) {struct Node
current = head;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}
```### 3. 示例以下是一段示例代码展示如何使用模拟的链表:```c
#include
next; };struct Node
createLinkedList() {struct Node
head = NULL;return head; }void insertAtHead(struct Node
head, int data) {// ... }void insertAtEnd(struct Node
head, int data) {// ... }void printLinkedList(struct Node
head) {// ... }int main() {struct Node
head = createLinkedList();insertAtEnd(&head, 1);insertAtEnd(&head, 2);insertAtEnd(&head, 3);insertAtHead(&head, 0);printf("链表:");printLinkedList(head);return 0; } ```输出结果为:``` 链表:0 1 2 3 ```### 总结通过模拟链表,我们可以用 C 语言或其他没有内置链表数据结构的语言实现灵活的数据存储和操作,为程序开发提供更多可能性。
模拟链表
简介链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的优势在于动态分配内存,可以方便地插入和删除节点,不像数组那样需要预先分配固定大小的内存空间。由于某些语言(如 C 语言)没有内置链表数据结构,我们需要手动模拟实现链表。
1. 节点定义首先,我们需要定义链表的节点结构体:```c struct Node {int data; // 节点数据struct Node *next; // 指向下一个节点的指针 }; ```这个结构体包含两个成员:* `data`: 存储节点的数据,可以是任意类型。 * `next`: 指向下一个节点的指针,如果当前节点是最后一个节点,则 `next` 为 NULL。
2. 链表操作接下来,我们实现一些常用的链表操作:
2.1 创建链表创建一个空链表,需要创建一个头节点,并将其 `next` 指针指向 NULL:```c struct Node *createLinkedList() {struct Node *head = NULL;return head; } ```
2.2 插入节点插入节点需要指定插入位置,并创建一个新节点,将新节点插入到指定位置。```c // 在头部插入节点 void insertAtHead(struct Node **head, int data) {struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));newNode->data = data;newNode->next = *head;*head = newNode; }// 在指定位置插入节点 void insertAtIndex(struct Node *head, int index, int data) {if (index < 0) {return; }if (index == 0) {insertAtHead(&head, data);return;}struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));newNode->data = data;struct Node *current = head;int count = 0;while (current != NULL && count < index - 1) {current = current->next;count++;}if (current == NULL) {return; // index 超出链表范围}newNode->next = current->next;current->next = newNode; }// 在尾部插入节点 void insertAtEnd(struct Node **head, int data) {struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));newNode->data = data;newNode->next = NULL;if (*head == NULL) {*head = newNode;return;}struct Node *current = *head;while (current->next != NULL) {current = current->next;}current->next = newNode; } ```
2.3 删除节点删除节点需要指定要删除的节点,并将其从链表中移除。```c // 删除头节点 void deleteAtHead(struct Node **head) {if (*head == NULL) {return;}struct Node *temp = *head;*head = (*head)->next;free(temp); }// 删除指定位置的节点 void deleteAtIndex(struct Node **head, int index) {if (index < 0) {return;}if (index == 0) {deleteAtHead(head);return;}struct Node *current = *head;int count = 0;while (current != NULL && count < index - 1) {current = current->next;count++;}if (current == NULL || current->next == NULL) {return; // index 超出链表范围}struct Node *temp = current->next;current->next = current->next->next;free(temp); }// 删除最后一个节点 void deleteAtEnd(struct Node **head) {if (*head == NULL || (*head)->next == NULL) {deleteAtHead(head);return;}struct Node *current = *head;while (current->next->next != NULL) {current = current->next;}struct Node *temp = current->next;current->next = NULL;free(temp); } ```
2.4 查找节点查找节点需要指定要查找的值,并返回该节点的指针。```c // 查找节点 struct Node *searchNode(struct Node *head, int data) {struct Node *current = head;while (current != NULL) {if (current->data == data) {return current;}current = current->next;}return NULL; // 未找到 } ```
2.5 打印链表打印链表可以将链表中所有节点的数据依次输出。```c // 打印链表 void printLinkedList(struct Node *head) {struct Node *current = head;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n"); } ```
3. 示例以下是一段示例代码展示如何使用模拟的链表:```c
include
include
总结通过模拟链表,我们可以用 C 语言或其他没有内置链表数据结构的语言实现灵活的数据存储和操作,为程序开发提供更多可能性。