1. 静态链表的定义
首先要定义一个链表结点类型,为一个结构体,
typedef struct spy {
char *name;
struct spy *next;
}spy, *p_spy;
然后定义每一个结点,
spy A = {"A", NULL};
spy B = {"B", NULL};
spy C = {"C", NULL};
最后建立结点之间的链接,访问一个链表只需要一个头指针。
p_spy head = NULL;
A.next = &B;
B.next = &C;
C.next = NULL;
head = &A;
2. 静态链表的插入
p_spy head = NULL;
void insert_spy(p_spy newspy)
{
p_spy last;
if (head == NULL)
{
head = newspy;
newspy->next = NULL;
}
else
{
/* 先找到链表的最后一项 last */
last = head;
while (last)
{
if (last->next == NULL) /* 找到了 */
break;
else
last = last->next;
}
/* */
last->next = newspy;
newspy->next = NULL;
}
}
有了上面的插入函数,就不需要手动建立链表的链接,而是直接调用这个函数实现链表的建立。注意这个函数虽然名字叫插入,但是实际上叫追加更加准确,真正的插入是可以在任意位置插入的,而不是只能在尾巴插入。
如果要在任意位置插入,需要增加一个参数用作插入位置,函数体可以参考另外一篇文章动态链表。
3. 静态链表的删除
void remove_spy(p_spy oldspy)
{
p_spy left;
if (head == oldspy)
{
head = oldspy->next;
}
else
{
/* 找出oldspy的上线 */
left = head;
while (left)
{
if (left->next == oldspy)
break;
else
left = left->next;
}
if (left)
{
left->next = oldspy->next;
}
}
}
上面函数就可以移除一个结点,但是这个函数还可以优化一下,比如里面增加判断是否为空链表,如果为空链表,就没有结点可以移除了。