#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);
}
數據結構 鏈表(靜態鏈表)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.