数据结构-静态链表的实现

来源:互联网 发布:java list filter 编辑:程序博客网 时间:2024/05/22 10:58

好久没来了,公司不让上网,太不爽了,赶着这次机会,把以前弄的静态链表的实现写上吧,希望对大家有帮助(只是做了简单的实现,其中的出错处理没有完善,请见谅!)

 

#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。

删除的结果: