#include <stdio.h> #include <stdlib.h>
/* 鍊表的結構體描述 */ typedef struct chain { int data; struct chain *next; } C;
/* 找到指定節點 */ C *find(C *head, int i) { C *node = head; if (node == NULL) return NULL; // 若頭節點為空則退出 while (i--) { node = node->next; if (node == NULL) return NULL; // 未找到 } return node; }
/* 鍊表節點的插入, 在i的後面插入 */ /* 不能在頭節點前插入節點 */ int insert(C *head, int i, int value) { C *node, *new; if (i < 0) return 0;
node = find(head, i); // 找到插入點 if (node == NULL) return 0;
// 創建新節點 new = (C *)malloc(sizeof(C)); if (new == NULL) return 0; new->data = value;
new->next = node->next; node->next = new; return 1; }
/* 鍊表節點的刪除 */ int delete(C* head, int i) { C *prev, *node; if (i <= 0) return 0; // 頭節點不可刪除 prev = find(head, i - 1); node = prev->next; // 要刪除的節點 if (prev == NULL || node == NULL) return 0; // 節點不存在
prev->next = node->next; free(node); return 1; }
/* 以下為測試代碼 */ void show(C *head) { C *node; for (node = head; node != NULL; node = node->next) printf("%d ", node->data); putchar('\n'); }
void destroy(C *head) { C *node = head->next; C *p; while (node != NULL) { p = node->next; free(node); node = p; } }
int main(void) { C c = {0}; c.data = 15; // 頭節點 insert(&c, 0, 73); insert(&c, 1, -48); insert(&c, 2, -264); show(&c);
insert(&c, 1, 185); show(&c); insert(&c, 3, 224); show(&c); insert(&c, 5, 1); show(&c); insert(&c, 6, 2); show(&c);
putchar('\n'); delete(&c, 7); show(&c); delete(&c, 3); show(&c); delete(&c, 4); show(&c); destroy(&c); return 0; }
|