好久没来了,公司不让上网,太不爽了,赶着这次机会,把以前弄的静态链表的实现写上吧,希望对大家有帮助(只是做了简单的实现,其中的出错处理没有完善,请见谅!)
#include <stdio.h>
#define MAXSIZE 21
struct Node
{
int key;
int link; //存储下一结点的下标
};
struct List
{
struct Node r[MAXSIZE];
int len;
};
void print(List *l)
{
int next = l->r[0].link;
printf("List nodes key as this:/n");
while (next != 0)
{
printf("%4d", l->r[next].key);
next = l->r[next].link;
}
printf("/n");
}
//静态链表的初始化
void initList(List *l)
{
//r[0]作为头结点
l->len = 0;
l->r[0].link = 0;
}
//头插法
void insertNodeAtHead(List *l, int n)
{
int next = l->r[0].link;
l->len = l->len + 1;
l->r[l->len].key = n;
l->r[l->len].link = next;
l->r[0].link = l->len;
}
//尾插法
void insertNodeAtTail(List *l, int n)
{
int pre = l->r[0].link;
int next = pre;
l->len = l->len + 1;
while (next != 0)
{
pre = next;
next = l->r[next].link;
}
l->r[l->len].key = n;
l->r[l->len].link = 0;
l->r[pre].link = l->len;
}
/************************************************************************/
/* 删除链表中值为n的结点,这里假设n是一定存在的,没有作异常处理 */
/************************************************************************/
void deleteNodeByN(List *l, int n)
{
int pre = l->r[0].link;
int next = l->r[pre].link;
int key = l->r[next].key;
while (n != key)
{
pre = next;
next = l->r[next].link;
key = l->r[next].key;
}
l->r[pre].link = l->r[next].link;
l->len = l->len - 1;
}
//删除第index个结点
void deleteNodeAtIndex(List *l, int index)
{
if (index > l->len || index < 1)
{
printf("'index' is not legal/n");
return;
}
int i = 1;
int pre = 0;
int next = l->r[pre].link;
while (i < index)
{
pre = next;
next = l->r[next].link;
}
l->r[pre].link = l->r[next].link;
l->len = l->len - 1;
}
void main()
{
int i;
List list;
initList(&list);
for (i = 0; i < 9; i++)
{
insertNodeAtHead(&list, i+1);
}
for (;i < 18; i++)
{
insertNodeAtTail(&list, i+1);
}
print(&list);
printf("after delete a numeric:/n");
deleteNodeByN(&list, 1);
print(&list);
printf("after delete No.1 numeric:/n");
deleteNodeAtIndex(&list, 1);
print(&list);
}
链表在初始化的时候,先用头插法到9,再用尾插法到18。
删除的结果: