用数组描述的链表称为静态链表。
C语言中的静态链表的表现形式是结构体数组,结构体变量包括数据域data与游标cur。
这种存储结构,需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针,故仍具有链式存储结构的主要优点。
#ifndef _STATICLIST_H_
#define _STATICLIST_H_
#include<iostream>
using namespace std;
#include<assert.h>
#define MAX_SIZE 20
#define ElemType char
typedef struct ListNode
{
ElemType data;
int cur;
}ListNode;
typedef ListNode StaticList[MAX_SIZE];
int Malloc_SL(StaticList &space);
void Free_SL(StaticList &space,int k);
void InitSList(StaticList &space);
void Insert(StaticList &space, ElemType x);
void ShowList(StaticList &space);
void Delete(StaticList &space);
#endif
#include"StaticList.h"
void InitSList(StaticList &space)
{
for (int i = 1; i < (MAX_SIZE - 1); ++i)
{
space[i].cur = i+1;
}
space[MAX_SIZE - 1].cur = 0;
space[0].cur = -1;
}
int Malloc_SL(StaticList &space)
{
int i = space[1].cur;
if (space[1].cur != 0)
{
space[1].cur = space[i].cur;
}
return i;
}
void Insert(StaticList &space, ElemType x)
{
int i = Malloc_SL(space);
if (i == 0)
{
cout << "Failed" << endl;
return;
}
space[i].data = x;
if (space[0].cur == -1)
{
space[i].cur = -1;
}
else
{
space[i].cur = space[0].cur;
}
space[0].cur = i;
}
void ShowList(StaticList &space)
{
int i = space[0].cur;
while (i != -1)
{
cout << space[i].data << "->";
i = space[i].cur;
}
cout << "NULL" << endl;
}
void Delete(StaticList &space)
{
int i = space[0].cur;
space[0].cur = space[i].cur;
//space[i].cur = space[1].cur;
//space[1].cur = i;
Free_SL(space, i);
}
void Free_SL(StaticList &space, int k)
{
space[k].cur = space[1].cur;
space[1].cur = k;
}
#include"StaticList.h"
void main()
{
StaticList SL;
InitSList(SL);
for (int i = 0; i < 5; ++i)
{
Insert(SL, 'A'+i);
}
ShowList(SL);
Delete(SL);
ShowList(SL);
}