//Function realization.cpp
#include"predefined.h"
#include"StaticLinkedList.h"
extern SLinkList space;
void InitSpace_SL()
//算法2.14:将一维数组space中各分量链成一个备用链表,(*space)[0].cur为头指针。
{
for(int i=0;i<MAXSIZE-1;i++) space[i].cur=i+1;
space[MAXSIZE-1].cur=0;
}
int Malloc_SL()
//算法2.15:若备用空间链表为非空,则返回分配的节点下标。
{
int i=space[0].cur;
if(i) space[0].cur=space[i].cur;
return i;
}
void Free_SL(int k)
//算法2.16:将下标为k的空闲节点收到备用链表。
{
space[k].cur=space[0].cur;
space[0].cur=k;
}
void difference(int *S)
//算法2.17:依次输入集合A和B的元素,在一维数组space中建立表示集合(A-B)∪(B-A)。
//的静态链表,S为其头指针。假设备用空间足够大,(*space)[0].cur为其头指针。
{
int r,m,n,i,j,b,k,p;
InitSpace_SL();
(*S)=Malloc_SL();
r=*S;
printf("▼请输入集合A的个数: ");
scanf("%d",&m);
for(j=1;j<=m;j++)
{
i=Malloc_SL();
printf("▼请输入集合A第%d个数: ",j);
scanf("%d",&space[i].data);
space[r].cur=i;
r=i;
}
space[r].cur=0;
printf("▼请输入集合B的个数: ");
scanf("%d",&n);
for(j=1;j<=n;j++)
{
k=space[*S].cur;
printf("▼请输入集合B第%d个数: ",j);
scanf("%d",&b);
p=*S;
while(space[k].data!=b&&k!=space[r].cur)
{
p=k;
k=space[k].cur;
}
if(k==space[r].cur)//若集合A中没有b,则插入。
{
i=Malloc_SL();
space[i].data=b;
space[r].cur=i;
r=i;
space[r].cur=0;
}
else//若集合A中已有b,则删除。
{
space[p].cur=space[k].cur;
Free_SL(k);
if(k==r) r=p;
}
}
}
int LocateElem_SL(int H,ElemType e)
//算法2.13:在静态单链线性表L中查找第1个值为e的元素。
//若找到,则返回它在L中的位序,否则返回0。
{
int i=space[H].cur;
int j=1;
while(i)
{
if(space[i].data==e) return j;
++j;
i=space[i].cur;
}
return FALSE;
}
Status InitList_SL(int *H)//初始化静态链表,建立头结点。
{
*H=Malloc_SL();
if(!(*H)) exit(OVERFLOW);
space[*H].cur=0;
return OK;
}
Status ClearList_SL(int H)//置空
{
int j,k;
j=space[H].cur;
while(j)
{
k=space[j].cur;
Free_SL(j);
j=k;
}
space[H].cur=0;
return OK;
}
Status DestroyList_SL(int *H)//销毁
{
int i;
i=*H;
while(i)
{
i=space[*H].cur;
Free_SL(*H);
*H=i;
}
return OK;
}
Status ListEmpty_SL(int H)//判空
{
if(space[H].cur==0) return TRUE;
else return FALSE;
}
int ListLength_SL(int H)//求长
{
int n=0;
int i=space[H].cur;
while(i)
{
i=space[i].cur;
n++;
}
return n;
}
Status GetElem_SL(int H,int i,ElemType *e)//取值
{
int j,k;
k=space[H].cur;
j=1;
while(k&&j<i)
{
k=space[k].cur;
j++;
}
if(!k||j>i) return ERROR;
*e=space[k].data;
return OK;
}
Status PriorElem_SL(int H,ElemType cur_e,ElemType *e)//前驱
{
int i;
i=LocateElem_SL(H,cur_e);
if(i<=1) return FALSE;
GetElem_SL(H,i-1,e);
return OK;
}
Status NextElem_SL(int H,ElemType cur_e,ElemType *e)//后继
{
int i,j;
i=LocateElem_SL(H,cur_e);
j=ListLength_SL(H);
if(!i||i>=j) return FALSE;
GetElem_SL(H,i+1,e);
return OK;
}
Status ListInsert_SL(int *H,int i,ElemType e)//插入
{
if(i<1||i>ListLength_SL(*H)+1) return FALSE;
int j,k;
k=1;
j=*H;
while(k<i)
{
j=space[j].cur;
k++;
}
k=Malloc_SL();
space[k].data=e;
space[k].cur=space[j].cur;
space[j].cur=k;
return OK;
}
Status ListDelete_SL(int *H,int i,ElemType *e)//删除
{
if(i<1||i>ListLength_SL(*H)) return FALSE;
int j,k;
k=1;
j=*H;
while(k<i)
{
j=space[j].cur;
k++;
}
k=space[j].cur;
space[j].cur=space[k].cur;
*e=space[k].data;
Free_SL(k);
return OK;
}
Status ListTraverse_SL(int H,void (*visit)(int i))//访问
{
int j,k;
j=space[H].cur;
k=0;
while(k<ListLength_SL(H))
{
visit(j);
j=space[j].cur;
k++;
}
return OK;
}
#include"predefined.h"
#include"StaticLinkedList.h"
SLinkList space;
void visit(int i)
{
printf("%d ",space[i].data);
}
int main()
{
int H,n,m,i;
ElemType e;
Status s;
printf("▼Function 1\n★函数InitSpace_SL()测试...\n");
printf("▲初始化静态链表的备用空间SPACE...\n\n");
InitSpace_SL();
printf("▼Function 2\n★函数Malloc_SL()、InitList_SL(int *H)测试...\n");
printf("▲初始化静态链表H,用Malloc_SL申请空间...\n\n");
InitList_SL(&H);
printf("▼Function 3\n★函数ListEmpty_SL(int H)测试...\n");
s=ListEmpty_SL(H);
s?printf("▲表H为空!!!\n\n"):printf("▲表H非空!!!\n\n");
printf("▼Function 4\n★函数ListInsert_SL(int *H,int i,ElemType e)测试...\n");
printf("▲请输入准备向H输入的个数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("▲请输入La第%d个数:",i);
scanf("%d",&m);
s=ListInsert_SL(&H,i,m);
printf("▲插入成功?:%d (1:成功 0:失败)\n",s);
}
printf("\n");
printf("▼Function 5\n★函数ListTraverse_SL(int H,void (*visit)(int i))测试...\n");
printf("▲表H的元素为:H={");
ListTraverse_SL(H,visit);
printf("}\n\n");
printf("▼Function 6\n★函数ListLength_SL(int H)测试...\n");
printf("▲表H的长度为:%d\n\n",ListLength_SL(H));
printf("▼Function 7\n★函数Free_SL(int k)、ListDelete_SL(int *H,int i,ElemType *e)测试...\n");
ListDelete_SL(&H,3,&e);
printf("▲删除表H的第3个元素\"%d\",用Free_SL释放空间...\n",e);
printf("▲表H的元素为:H={");
ListTraverse_SL(H,visit);
printf("}\n\n");
printf("▼Function 8\n★函数GetElem_SL(int H,int i,ElemType *e)测试...\n");
GetElem_SL(H,3,&e);
printf("▲表H的第3个元素是\"%d\"\n\n",e);
printf("▼Function 9\n★函数LocateElem_SL(int H,ElemType e)测试...\n");
printf("▲元素8在H中的位序:\"%d\"\n\n",LocateElem_SL(H,8));
printf("▼Function 10\n★函数PriorElem_SL(int H,ElemType cur_e,ElemType *e)测试...\n");
PriorElem_SL(H,5,&e);
printf("▲表H元素5的前驱为:%d\n\n",e);
printf("▼Function 11\n★函数NextElem_SL(int H,ElemType cur_e,ElemType *e)测试...\n");
NextElem_SL(H,5,&e);
printf("▲表H元素5的后继为:%d\n\n",e);
printf("▼Function 12\n★函数ClearList_SL(int H)测试...\n");
printf("▲置空前:");
ListEmpty_SL(H)?printf("表H为空!!!\n"):printf("表H非空!!!\n");
ClearList_SL(H);
printf("▲置空后:");
ListEmpty_SL(H)?printf("表H为空!!!\n\n"):printf("表H非空!!!\n\n");
printf("▼Function 13\n★函数DestroyList_SL(int *H)测试...\n");
printf("▲销毁前:");
H?printf("表H存 在!!!\n"):printf("表H不存在!!!\n");
DestroyList_SL(&H);
printf("▲销毁后:");
H?printf("表H存 在!!!\n\n"):printf("表H不存在!!!\n\n");
printf("▼Function 13\n★函数difference(int *S)测试...\n");
difference(&H);
printf("▲表H的元素为:H={");
ListTraverse_SL(H,visit);
printf("}\n\n");
}
#define MAXSIZE 1000
typedef struct
{
ElemType data;
int cur;
}component,SLinkList[MAXSIZE];
void InitSpace_SL();
int Malloc_SL();
void Free_SL(int k);
void difference(int *S);
int LocateElem_SL(int H,ElemType e);
Status InitList_SL(int *H);
Status ClearList_SL(int H);
Status DestroyList_SL(int *H);
Status ListEmpty_SL(int H);
int ListLength_SL(int H);
Status GetElem_SL(int H,int i,ElemType *e);
Status PriorElem_SL(int H,ElemType cur_e,ElemType *e);
Status NextElem_SL(int H,ElemType cur_e,ElemType *e);
Status ListInsert_SL(int *H,int i,ElemType e);
Status ListDelete_SL(int *H,int i,ElemType *e);
Status ListTraverse_SL(int H,void (*visit)(int i));
void visit(int i);
//predefined.h
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
注意:外部变量不要放在头文件中,否则容易出现重复定义外部变量,出现LNK2005错误。