0、宏定义以及静态链表结点结构体
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAXSIZE 1000
#define OK 0
#define error 1
typedef int Status;
typedef int ElemType;
//静态链表结构体
typedef struct component
{
ElemType data;//数据
int cur; //游标(cursor)
}component,StaticList[MAXSIZE];
1、静态链表的初始化
Status InitList(StaticList space)
{
int i;
for(i=0;i<MAXSIZE;i++)
space[i].cur=i+1;
space[MAXSIZE-1].cur=0;//逻辑上最后一个节点的游标是0
return OK;
}
2、定位元素
//在静态链表中定位元素位序
//元素存在则返回元素的位序,不存在则返回0
Status LocateElem (StaticList S,ElemType e)
{
i=S[MAXSIZE-1].cur;
while(i&&S[i].data!=e)
i=S[i].cur;
return i;
}
3、向备用链表中申请空间
//跳过一个空闲分量并获取它的下标,头游标获得下一个空闲分量的下标(头游标永远是下一个空闲分量的位置)
//当游标指向下一个空闲位置时,先前头游标标出的位置已经可以使用
Status Malloc_SLL(StaticList space)
{
int i=space[0].cur;
if(i)//总会有一个时刻space[0].cur会为0
{
space[0].cur=space[i].cur;
}
return i;
}
4、获取静态链表中元素个数
int ListLength(StaticList L)
{
int k=MAXSIZE-1;
k=L[k].cur;
int i=0;
while(k!=0)
{
i++;
k=L[k].cur;
}
return i;
}
5、插入一个元素
Status ListInsert(StaticList L, int i,ElemType e)
{
int j,k,i;//待使用的整型变量
k=MAXSIZE-1;//最后一个元素的下标指向逻辑顺序上第一个有元素的结点的下标
if(i)(i<1||i>ListLenth(L)+1)
{
return error;
}
j=malloc(L);
if(j)
{
L[j].data=e;
for(i=1;i<1;i++)
{
k=L[k].cur;
}//循环结束后k的值即为插入位置前驱的下标
L[j].cur=L[k].cur;
L[k].cur=j;//实现在逻辑顺序上的插入
//注意:当n为1时会引起L[MAX-1]的游标发生变化
return OK;
}
return error;
}
6、删除一个元素
void free_SL(StaticList &L, int k)
{
//将下标为k的空闲结点回收到备用链表
L[k].cur=L[0].cur;//保持备用链表的逻辑结构
L[0].cur=k;
}
Status delete_SL(StaticList &L,int n)
{
int i,j,k;
if(n<1||n>ListLength(L)+1)
return error;
k=MAXSIZE-1;
for(i=0;i<n-1;i++)
k=L[k].cur;//循环结束后k的值为要删除元素逻辑上的前驱的下标
j=L[k].cur;//要回收的结点的下标
L[k].cur=L[j].cur;//先把要回收的结点跳过去
free_SL(L,j);
return OK;
}
7、遍历线性表
int visit(ElemType e);
Status Taverse(StaticList L,int(*f)(ElemType e))
{
int k=MAXSIZE-1;
k=L[k].cur;
while(k)
{
f(L[k].data);
k=L[k].cur;
}
return 0;
}
int visit(ElemType e)
{
printf("%d\n",e);
return 0;
}