鏈式存儲結構通過使用指針將分散的存儲單元鏈接起來,每個元素由數據部分和指針部分組成。
鏈式表的定義和特點
鏈式表的每個節點包含兩個部分:
- 數據域:存儲數據元素。
- 指針域:存儲下一個節點的內存地址。
鏈式表的頭指針指向第一個節點,最后一個節點的指針域為NULL,表示鏈表結束。鏈式表的特點是插入和刪除操作比較方便,不需要移動大量元素,但隨機訪問效率較低。
示例代碼:鏈式表的實現及取值操作(C語言)
#include <stdio.h>
#include <stdlib.h>// 定義鏈式表節點結構
typedef struct Node {int data; // 數據域struct Node *next; // 指針域,指向下一個節點
} Node;// 創建新節點
Node* create_node(int value) {Node *new_node = (Node*)malloc(sizeof(Node)); // 分配內存if (new_node == NULL) {printf("內存分配失敗\n");exit(1); // 分配失敗則退出程序}new_node->data = value; // 設置節點數據new_node->next = NULL; // 初始化指針為NULLreturn new_node; // 返回新節點的指針
}// 在鏈表尾部插入節點
void append(Node **head, int value) {Node *new_node = create_node(value); // 創建新節點if (*head == NULL) { // 如果鏈表為空*head = new_node; // 新節點成為頭節點return;}Node *current = *head; // 從頭節點開始遍歷while (current->next != NULL) { // 找到鏈表的最后一個節點current = current->next;}current->next = new_node; // 將新節點鏈接到鏈表末尾
}// 獲取指定位置的元素值
int get_value(Node *head, int pos, int *value) {if (head == NULL) { // 如果鏈表為空printf("鏈表為空\n");return 0; // 返回0表示失敗}Node *current = head;int index = 0;while (current != NULL) { // 遍歷鏈表if (index == pos) { // 找到指定位置*value = current->data; // 獲取節點數據return 1; // 返回1表示成功}current = current->next; // 移動到下一個節點index++;}printf("位置超出范圍\n"); // 如果遍歷完鏈表也沒找到指定位置return 0; // 返回0表示失敗
}// 打印鏈表
void print_list(Node *head) {Node *current = head;printf("鏈表內容:");while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}// 釋放鏈表內存
void free_list(Node *head) {Node *current = head;while (current != NULL) {Node *temp = current;current = current->next;free(temp);}
}int main() {Node *head = NULL; // 初始化鏈表為空append(&head, 10); // 向鏈表尾部添加元素10append(&head, 20); // 向鏈表尾部添加元素20append(&head, 30); // 向鏈表尾部添加元素30print_list(head); // 打印鏈表內容int value;if (get_value(head, 1, &value)) { // 獲取索引1的元素值printf("索引1的元素值:%d\n", value);}free_list(head); // 釋放鏈表內存return 0;
}
代碼各模塊注釋
定義鏈式表節點結構
typedef struct Node {int data; // 數據域struct Node *next; // 指針域,指向下一個節點
} Node;
- 定義了一個名為
Node
的結構體類型,表示鏈式表的節點。 int data;
用于存儲節點的數據。struct Node *next;
是一個指向Node
類型的指針,用于存儲下一個節點的內存地址。
創建新節點
Node* create_node(int value) {Node *new_node = (Node*)malloc(sizeof(Node)); // 分配內存if (new_node == NULL) {printf("內存分配失敗\n");exit(1); // 分配失敗則退出程序}new_node->data = value; // 設置節點數據new_node->next = NULL; // 初始化指針為NULLreturn new_node; // 返回新節點的指針
}
Node *new_node = (Node*)malloc(sizeof(Node));
使用malloc
函數動態分配內存,為新節點分配大小為sizeof(Node)
的內存空間。if (new_node == NULL) { ... }
檢查內存分配是否成功。如果失敗,打印錯誤信息并退出程序。new_node->data = value;
將傳入的value
值賦給新節點的數據域。new_node->next = NULL;
將新節點的指針域初始化為NULL
,表示該節點目前沒有指向下一個節點。return new_node;
返回新創建的節點的指針。
在鏈表尾部插入節點
void append(Node **head, int value) {Node *new_node = create_node(value); // 創建新節點if (*head == NULL) { // 如果鏈表為空*head = new_node; // 新節點成為頭節點return;}Node *current = *head; // 從頭節點開始遍歷while (current->next != NULL) { // 找到鏈表的最后一個節點current = current->next;}current->next = new_node; // 將新節點鏈接到鏈表末尾
}
Node *new_node = create_node(value);
調用create_node
函數創建一個新節點。if (*head == NULL) { ... }
檢查鏈表是否為空。如果鏈表為空(頭指針為NULL
),將新節點設置為頭節點。Node *current = *head;
定義一個指針current
,初始化為鏈表的頭節點,用于遍歷鏈表。while (current->next != NULL) { ... }
遍歷鏈表,直到找到最后一個節點(其next
指針為NULL
)。current->next = new_node;
將最后一個節點的next
指針指向新節點,將新節點添加到鏈表末尾。
獲取指定位置的元素值
int get_value(Node *head, int pos, int *value) {if (head == NULL) { // 如果鏈表為空printf("鏈表為空\n");return 0; // 返回0表示失敗}Node *current = head;int index = 0;while (current != NULL) { // 遍歷鏈表if (index == pos) { // 找到指定位置*value = current->data; // 獲取節點數據return 1; // 返回1表示成功}current = current->next; // 移動到下一個節點index++;}printf("位置超出范圍\n"); // 如果遍歷完鏈表也沒找到指定位置return 0; // 返回0表示失敗
}
if (head == NULL) { ... }
檢查鏈表是否為空。如果為空,打印錯誤信息并返回0表示失敗。Node *current = head;
定義一個指針current
,初始化為鏈表的頭節點,用于遍歷鏈表。int index = 0;
用于記錄當前遍歷到的節點位置。while (current != NULL) { ... }
遍歷鏈表,直到current
為NULL
(鏈表結束)。if (index == pos) { ... }
檢查當前節點的位置是否為目標位置pos
。如果是,將當前節點的數據賦值給*value
,并返回1表示成功。current = current->next;
移動current
指針到下一個節點。index++;
增加位置計數器。- 如果遍歷完整個鏈表都沒有找到目標位置,打印錯誤信息并返回0表示失敗。
打印鏈表
void print_list(Node *head) {Node *current = head;printf("鏈表內容:");while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}
Node *current = head;
定義一個指針current
,初始化為鏈表的頭節點,用于遍歷鏈表。printf("鏈表內容:");
打印提示信息。while (current != NULL) { ... }
遍歷鏈表,直到current
為NULL
。printf("%d ", current->data);
打印當前節點的數據。current = current->next;
移動current
指針到下一個節點。printf("\n");
打印換行符,換行。
釋放鏈表內存
void free_list(Node *head) {Node *current = head;while (current != NULL) {Node *temp = current;current = current->next;free(temp);}
}
Node *current = head;
定義一個指針current
,初始化為鏈表的頭節點,用于遍歷鏈表。while (current != NULL) { ... }
遍歷鏈表,直到current
為NULL
。Node *temp = current;
保存當前節點的指針到temp
。current = current->next;
移動current
指針到下一個節點。free(temp);
釋放temp
指向的節點內存。
主函數
int main() {Node *head = NULL; // 初始化鏈表為空append(&head, 10); // 向鏈表尾部添加元素10append(&head, 20); // 向鏈表尾部添加元素20append(&head, 30); // 向鏈表尾部添加元素30print_list(head); // 打印鏈表內容int value;if (get_value(head, 1, &value)) { // 獲取索引1的元素值printf("索引1的元素值:%d\n", value);}free_list(head); // 釋放鏈表內存return 0;
}
Node *head = NULL;
聲明一個指向Node
的指針head
,并初始化為NULL
,表示鏈表為空。append(&head, 10);
調用append
函數向鏈表尾部添加元素10。append(&head, 20);
向鏈表尾部添加元素20。append(&head, 30);
向鏈表尾部添加元素30。print_list(head);
調用print_list
函數打印鏈表的內容。int value;
聲明一個整型變量value
,用于存儲獲取的元素值。if (get_value(head, 1, &value)) { ... }
調用get_value
函數嘗試獲取索引1處的元素值。如果成功,打印該值。free_list(head);
調用free_list
函數釋放鏈表占用的內存。return 0;
返回0,表示程序正常結束。