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