您的位置:首页 > 理论基础 > 数据结构算法

学习笔记------数据结构(C语言版) 静态链表

2016-01-11 15:09 423 查看
//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;
}


//main.cpp
#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");
}


//StaticLinkedList.h
#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错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: