<span style="font-family: Arial, Helvetica, sans-serif;"> #include <iostream></span>
using namespace std;
//线性表静态存储结构
#define MAXSIZE 1000 //假设链表的最大长度为1000
typedef int ElemType;
typedef struct
{
ElemType data;
int cur; //游标(Cursor),为0时表示无指向
}StaticLinkList[MAXSIZE];
//对数组第一个和最后一个元素作特殊处理,不存数据。我们
//通常把未被使用的数组元素称为备用链表。而数组第一个元素
//,即下标为0的元素的cur就存放备用链表的第一个结点的下标。
//而数组的最后一个元素的cur则存放第一个有数值的元素的下标。
//将一维数组space中各分量链成一个备用链表
void InitSLList( StaticLinkList space )
{
for ( int i = 0; i < MAXSIZE-1; ++i )
{
space[i].cur = i + 1;
}//space[0].cur = 1;指向备用链表的第一个结点,第0个与最后一个不存数据
space[MAXSIZE-1].cur = 0; //目前静态表为空,最后一个元素的cur为0,相当于头结点
}
//若备用空间非空,则返回分配的结点下标,否则返回0,分配失败
int Malloc_SLL( StaticLinkList space )
{
int i = space[0].cur;
if ( space[0].cur )
{
space[0].cur = space[i].cur;
}
return i;
}
//将下标为k的空闲结点回收到备用链表
void Free_SLL( StaticLinkList space, int k )
{
space[k].cur = space[0].cur;
space[0].cur = k;
}
//求长度
int ListLength( StaticLinkList L )
{
int len = 0;
int i = L[MAXSIZE-1].cur;
while ( i )
{
i = L[i].cur;
++len;
}
return len;
}
//在第i个元素之前插入新的数据元素e
void ListInsert( StaticLinkList L, int i, ElemType e )
{
int k = MAXSIZE - 1; //k首先是最后一个元素的下标,相当于指向头结点了
if ( i < 1 || i > ListLength( L ) + 1 )
return;
int j = Malloc_SLL( L ); //分配空间
if ( !j )
return;
L[j].data = e;
for ( int m = 1; m <= i-1; ++m )//找到第i个元素的之前的位置
{
k = L[k].cur;
}
L[j].cur = L[k].cur;
L[k].cur = j;
}
//删除在L第i个数据元素
void ListDelete( StaticLinkList L, int i )
{
int k = MAXSIZE - 1;
if ( i < 1 || i > ListLength( L ) )
return;
for ( int j = 1; j <= i-1; ++j )
{
k = L[k].cur;
}
int m = L[k].cur;
L[k].cur = L[m].cur;
Free_SLL( L, m );
}
//遍历静态表(打印其所有元素)
void ListTraverse( StaticLinkList L )
{
int k = MAXSIZE - 1;
int i = L[k].cur;
while ( i )
{
cout << L[i].data << " ";
i = L[i].cur;
}
cout << endl;
}
int main()
{
StaticLinkList L;
//初始化静态链表
InitSLList( L );
//插入5个数据(1~5)
cout << "插入5个数据(1~5)..." << endl;
system("pause");
for ( int i = 1; i <= 5; ++i )
{
ListInsert( L, i, i );
}
cout << endl;
//遍历静态表(打印其所有元素)
cout << "遍历静态表(打印其所有元素)..." << endl;
system("pause");
ListTraverse( L );
cout << endl;
//删除第3个元素
cout << "删除第3个元素..." << endl;
system("pause");
ListDelete( L, 3 );
cout << endl;
//遍历静态表(打印其所有元素)
cout << "遍历静态表(打印其所有元素)..." << endl;
system("pause");
ListTraverse( L );
cout << endl;
//在第3个元素之前插入数据19
cout << "在第3个元素之前插入数据19..." << endl;
system("pause");
ListInsert( L, 3,19 );
cout << endl;
//当前长度
cout << "当前长度:";
cout << ListLength( L ) << endl << endl;
//遍历静态表(打印其所有元素)
cout << "遍历静态表(打印其所有元素)..." << endl;
system("pause");
ListTraverse( L );
cout << endl;
return 0;
}