在C語言中,靜態鏈表是使用數組來實現的。插入操作需要考慮在鏈表頭部、尾部和中間位置插入節點。以下是一個簡單的靜態鏈表插入操作示例:
#include<stdio.h>
#define MAX_SIZE 100
typedef struct Node {
int data;
int next;
} Node;
Node list[MAX_SIZE];
int free_list[MAX_SIZE];
int free_count = MAX_SIZE;
int head = -1;
void init() {
for (int i = 0; i < MAX_SIZE; i++) {
free_list[i] = i;
}
}
int get_free_node() {
if (free_count == 0) {
return -1;
}
int node_index = free_list[free_count - 1];
free_count--;
return node_index;
}
void insert_begin(int value) {
int new_node = get_free_node();
if (new_node == -1) {
printf("No free nodes available.\n");
return;
}
list[new_node].data = value;
list[new_node].next = head;
head = new_node;
}
void insert_end(int value) {
int new_node = get_free_node();
if (new_node == -1) {
printf("No free nodes available.\n");
return;
}
list[new_node].data = value;
list[new_node].next = -1;
if (head == -1) {
head = new_node;
} else {
int current = head;
while (list[current].next != -1) {
current = list[current].next;
}
list[current].next = new_node;
}
}
void insert_middle(int value, int position) {
if (position <= 0) {
insert_begin(value);
return;
}
int new_node = get_free_node();
if (new_node == -1) {
printf("No free nodes available.\n");
return;
}
list[new_node].data = value;
int current = head;
int prev = -1;
int index = 0;
while (current != -1 && index< position) {
prev = current;
current = list[current].next;
index++;
}
if (prev == -1) {
list[new_node].next = head;
head = new_node;
} else {
list[new_node].next = list[prev].next;
list[prev].next = new_node;
}
}
void print_list() {
int current = head;
while (current != -1) {
printf("%d -> ", list[current].data);
current = list[current].next;
}
printf("NULL\n");
}
int main() {
init();
insert_begin(1);
insert_end(3);
insert_middle(2, 1);
print_list();
return 0;
}
這個示例中,我們定義了一個靜態鏈表結構體Node
,并使用數組list
來存儲鏈表節點。free_list
數組用于存儲空閑節點的索引,free_count
變量用于記錄空閑節點的數量。head
變量用于存儲鏈表的頭節點索引。
init
函數用于初始化鏈表,將所有節點添加到空閑節點列表中。get_free_node
函數用于獲取一個空閑節點的索引。insert_begin
、insert_end
和insert_middle
函數分別用于在鏈表頭部、尾部和指定位置插入新節點。print_list
函數用于打印鏈表。
在main
函數中,我們調用這些函數來插入節點并打印鏈表。