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