數據結構 鏈表(靜態鏈表)

#include "stdio.h"
#define MAXSIZE 100

/**
	靜態鏈表:
		在C語言之前,如Basics、Fortran等早期的編程高級語言,由於沒有指針,鏈表沒法是實現
		有人想出用數組來代替鏈表

		首先讓數組的元素怒都是由兩個數據與組成   data 和 cur
		數據域data 用來存放數據元素
		遊標 cur等同於單鏈表的next指針,存放鈣元素的後繼在數組中的下標

		這種用數組描述的鏈表叫做: 靜態鏈表

**/
typedef struct 
{
	int data;
	int cur;//遊標,爲0是表示無指向
}StaticLinkList[MAXSIZE];


void InitList(StaticLinkList space);
int Malloc_SLL(StaticLinkList space);
int  ListInsert(StaticLinkList L,int i,int e);
int ListDelete (StaticLinkList L,int i,int *pVal);
void Free_SSL(StaticLinkList space,int j);
int ListLength(StaticLinkList L);
void Show(StaticLinkList L);

/*初始化*/
/*將一位數組space中個分量鏈成以備用鏈表*/
/*space[0].cur爲頭指針,"0"表示空指針 */
void InitList(StaticLinkList space)
{
	int i;
	for (i=0;i<MAXSIZE - 1 ;++i )
	{
		space[i].cur = i+1;
	}
	space[MAXSIZE-1].cur = 0;//目前靜態鏈表爲空,最後一個元素的cur爲空
	return ;
}


/*分配空間*/
//若備用空間鏈表非空,則返回分配的節點下標,否則返回0

//注:space[0]不保存數據,保存數據是從space[1]開始,space[0]保存下一個空的位置
int Malloc_SLL(StaticLinkList space)
{
	int i = space[0].cur;//當前數組的第一個元素的cur村的值,就是要返回的第一個備用空閒的下標
	if(space[0].cur)
		space[0].cur = space[i].cur;//拿出一個分量使用,把space[i]的下一個分量(即下一個空位置)作爲備用

	return i;//返回分配的結點下標
}


/*插入數據*/
//在L中的第i個位置插入新的數據元素
int  ListInsert(StaticLinkList L,int i,int e)
{
	int j,k,l;
	k  = MAXSIZE - 1;
	if(i<1||i>ListLength(L)+1)
		return 0;//插入位置出錯
	j= Malloc_SLL(L);//獲取空閒分量下標

	if(j)
	{
		L[j].data  = e;
		for(l=1;l<=i-1;l++)
			k= L[k].cur;//不斷循環得到第i-1個數據的下標
		L[j].cur = L[k].cur;//先把當前第i-1數據遊標的所指向的位置的下標(即第i個位置)保存到當前插入數據的L[j].cur上
		L[k].cur = j;  //然後改變L[k].cur
		return 1;
	}
	return 0;
}
/*刪除在L中第I個數據元素e*/
int ListDelete (StaticLinkList L,int i,int *pVal)
{
	int j,k;
	if (i<1||i>ListLength(L))
	{
		return 0;
	}
	k = MAXSIZE -1;
	for(j=1;j<=i-1;j++)
	{
		k = L[k].cur;//得到第i-1個元素的下標
	}
	j= L[k].cur;//得到第i個元素的下表保存到j
	*pVal =L[j].data;//保存第i個元素的值 
	L[k].cur = L[j].cur;//把第i+1的下標賦給第i的下標
	Free_SSL(L,j);
	return 1;
}
//將下標爲j的空閒結點回收到備用鏈表中
void Free_SSL(StaticLinkList space,int j)
{
	space[j].cur = space[0].cur;
	space[0].cur = j;
}
//保存的元素個數,即爲靜態鏈表的長度
int ListLength(StaticLinkList L)
{
	int j = 0;
	int i = L[MAXSIZE-1].cur;
	while(i)
	{
		i = L[i].cur;
		j++;
	}
	return j;
}
//打印所有元素的數據
void Show(StaticLinkList L)
{
	int k = MAXSIZE -1;
	int i=L[k].cur;
	while(i!=0)
	{
		printf("%d\n",L[i].data);
		i = L[i].cur;
	}
	
}
void main()
{
	StaticLinkList L;
	InitList(L);
	int val;
	ListInsert(L,1,1);
	ListInsert(L,1,2);
	ListInsert(L,1,3);
	ListInsert(L,1,4);
    ListInsert(L,1,5);
	printf("刪除前:靜態鏈表中所有元素的值:\n");
	Show(L);
	ListDelete(L,1,&val);
	printf("刪除第1個位置的元素:%d\n",val);
	printf("刪除之後:靜態鏈表中的所有值:\n");

	Show(L);
	

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章