靜態鏈表
在沒有指針或對象引用機制的編程語言中,鏈表結構也可以用數組來描述,這種用數組描述的鏈表就叫“靜態鏈表”,也叫“遊標實現法”。
結構說明如下圖(圖是盜的,莫怪):
結構和基本操作
接下來就用C語言來描述靜態鏈表的結構和基本操作:
頭文件 StaticLinkList.h
#ifndef STATICLINKLIST_H
#define STATICLINKLIST_H
/*定義狀態碼*/
#define ERROR -1
#define TRUE 1
#define FALSE 0
typedef int Status;
/*定義結構體*/
#define MAXSIZE 5
typedef int ElemType;
typedef struct
{
ElemType data;
int cur;
}Node , StaticLinkList[MAXSIZE];
/*函數原型說明*/
void InitList(StaticLinkList list);
int GetListLength(StaticLinkList list);
int Malloc_SSL(StaticLinkList list);
void Free_SLL(StaticLinkList list , int i);
Status InsertList(StaticLinkList list , int i , ElemType e);
Status DeleteList(StaticLinkList list , int i);
void Print(StaticLinkList list);
#endif
靜態鏈表基本操作的實現:
#include "StaticLinkList.h"
#include<stdio.h>
/*初始化靜態數組*/
void InitList(StaticLinkList list)
{
int i;
for(i=0 ; i < MAXSIZE - 1 ; i++)
{
list[i].cur=i+1;
}
list[MAXSIZE-1].cur=0;
}
/*返回靜態鏈表中數據元素的個數*/
int GetListLength (StaticLinkList list)
{
int count = 0;
int cur = list[MAXSIZE - 1].cur;
while(cur)
{
cur = list[cur].cur;
count++;
}
return count;
}
/*返回備用數組下標,無備用空間則返回0*/
int Malloc_SLL(StaticLinkList list)
{
int i = list[0].cur;
if (i)
{
if ((GetListLength(list) + 1) >= MAXSIZE - 2)
{
list[0].cur = 0;
}
else
{
list[0].cur = list[i].cur;
}
}
return i;
}
/*將下標爲 i 的節點回收到備用鏈表*/
void Free_SLL (StaticLinkList list , int i)
{
list[i].cur = list[0].cur;
list[0].cur = i;
}
/*靜態鏈表的插入操作*/
Status InsertList (StaticLinkList list , int i , ElemType e)
{
int j , k;
if (i < 1 || i > GetListLength(list)+1)
{
return ERROR;
}
j = Malloc_SLL(list);
k = MAXSIZE - 1;
if (j)
{
int l;
for(l = 0 ; l < i - 1 ; l++)
{
k = list[k].cur;
}
list[j].data = e;
list[j].cur = list[k].cur;
list[k].cur = j;
return TRUE;
}
return FALSE;
}
/*靜態鏈表的刪除操作*/
Status DeleteList(StaticLinkList list , int i)
{
int j , k , l;
if(i < 1 || i > GetListLength(list))
{
return ERROR;
}
k = MAXSIZE - 1;
for(l = 0 ; l < i - 1 ; l++)
{
k = list[k].cur;
}
j = list[k].cur;
list[k].cur = list[j].cur;
Free_SLL(list , j);
return TRUE;
}
void Print(StaticLinkList list)
{
int k = MAXSIZE - 1;
int j = 0;
while(list[k].cur)
{
j = list[k].cur;
printf("%d\n" , list[j].data);
k = j;
}
}
main函數,簡單測試:
#include "StaticLinkList.h"
#include<stdio.h>
int main ()
{
int status;
StaticLinkList list;
InitList(list);
status = InsertList(list , 1 , 1);
status = InsertList(list , 2 , 2);
status = InsertList(list , 3 , 3);
status = DeleteList(list , 2);
Print(list);
}
結束 :)