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