1. 程式人生 > 其它 >java靜態連結串列_資料結構筆記:靜態連結串列(C語言)

java靜態連結串列_資料結構筆記:靜態連結串列(C語言)

void CreateList(StaticLinkList *P)//建立一個靜態連結串列

{

int i;

for(i=0;i此時並沒有已佔用空間,所以第一個節點中的指標(cur)的值為1,也就是說空閒空間的起始位置為1(下標為的1也是陣列的第二個元素);而最後一個節點的指標的值為0,因為此時並沒有以佔用的空間,最後一個節點類似於動態連結串列中的頭結點,當連結串列為空的時候就指向NULL(在這裡指向0),所以當頭結點中的指標等於0時代表連結串列為空。

\

可以在最初的時候給連結串列賦值。

void InitList(StaticLinkList *P)

{

int n,i;

printf("請輸入連結串列的長度:");

scanf("%d",&n);

for(i=1;i<=n;i++)//從下標1開始輸入內容

{

printf("請輸入資料:");

scanf("%d",&P[i].data);

P[0].cur = P[i].cur;//0位置記錄下一個空閒位置下標

}

P[i-1].cur = 0;

P[MAXSIZE-1].cur = 1;//記錄連結串列第一個元素的下標

}

最後一個存放資料的cur為0;

3.如何模擬申請空間,插入節點。

由於第一個節點中的指標用來儲存空閒空間的起始地址,所以只要修改第一個元素的cur即可。

int Malloc_List(StaticLinkList *P)//模擬建立節點,返回的是節點的下標

{

int i;

i = P[0].cur;

P[0].cur = P[i].cur;

return i;

}

先將空閒空間的位置賦值給i,然後再將i中儲存的下一個位置賦值給第一個元素。

\

例如圖中:想要申請到位置7的空間,先修改第一個的數值,將其改為位置7中記錄的數值(也就是8),那麼位置7就相當於不在空閒空間中了,而且因為第一個節點中儲存的是8,也就是說空閒空間的起始位置就是8了。

如果想將位置7插入到“乙”和“丁”之間的話,需要修改兩個地方。1.由於“乙”中儲存的是下一個元素的位置,那麼需要將“乙”中下一個元素的位置修改為7,這樣在“乙”結束後會找下一個元素時就會在位置7上面找。2.由於位置7中儲存的是下一個元素的位置,那麼需要將其修改為3(也就是“丁”的下標),這樣在找完位置7之後就是位置3了。

\

插入的方式可以如下:

void ListInsert(StaticLinkList *P)//插入連結串列

{

int k,n,i,j;

printf("請輸入插入的位置:");

scanf("%d",&n);

if(n<1 || n>P[0].cur)

{

printf("插入位置異常,插入失敗!\n");

return ;

}

if(ListLength(P) == MAXSIZE-1)//如果連結串列滿了

{

printf("靜態連結串列已滿,插入失敗!\n");

return ;

}

k = MAXSIZE-1;

j = Malloc_List(P);

for(i=1;i

4.如何模擬釋放空間,刪除節點。

同理,既然第一個節點儲存的是空閒空間的起始位置,那麼修改第一個節點中的cur值即可。

void FreeList(StaticLinkList *P,int k)//模擬釋放節點

{

P[k].cur = P[0].cur;

P[0].cur = k;

}

將需要釋放的位置k傳入進來,讓空閒空間的起始位置為該釋放的位置(也就是k),並且將k的下一個節點的值設定為剛才的起始位置,這樣就將空閒空間的位置連線起來,並且需要修改相應位置上的cur,讓其連線起來。

如下圖要釋放位置1上的空間。

修改前:\

修改後:

\

例如上圖,將位置1的空間釋放,先讓空閒空間的起始位置為1,並且讓位置1的下一個位置為8,所以空閒空間也就連起來了,1——8——9——10..,....(原先是:8——9——10........);而且需要修改刪除位置前的cur,使其能夠找到下一個元素,在這裡由於刪除的是第一個元素,所以需要修改頭結點(最後一個元素)的cur,原來是1,將其改為原先位置1中的cur(cur儲存的是下一個節點的位置,1中原先儲存的是2),那麼查詢順序就會是2——7——3——...(原先是1——2——7——3——...)。

刪除的方式可以如下:

void DeleteList(StaticLinkList *P)//刪除節點

{

int n,i,k,j;

printf("請輸入刪除的位置:");

scanf("%d",&n);

if(n<1 || n>ListLength(P))

{

printf("刪除的位置異常,刪除失敗!\n");

return ;

}

k = MAXSIZE-1;

for(i=1;i

5.如何遍歷連結串列。

因為最後一個元素相當於頭結點,並且其中儲存的是連結串列第一個元素的位置,所以應該從頭結點開始遍歷,然後根據每個節點中的cur的值找到下一個節點的位置。

遍歷程式碼可以如下:

void OutputList(const StaticLinkList *P)//輸出連結串列

{

int i,k;

k = MAXSIZE-1;

for(i=1;i<=ListLength(P);i++)

{

k = P[k].cur;

printf("%d\n",P[k].data);

}

}

例:如遍歷以下圖中的資料的話。

\

k最先等於999;連結串列長度為6(甲乙丁戊己庚)。

依次遍歷的話,i的值從1開始到6結束公六次迴圈。

k的值依次為;1 2 3 4 5 6.每次根據k的值將其資料輸出即可。

整體程式碼可以如下:

#include 

#define MAXSIZE 1000

typedef int Elem;

typedef struct

{

Elem data;

int cur;

}StaticLinkList;

void CreateList(StaticLinkList *P)//建立一個靜態連結串列

{

int i;

for(i=0;iP[0].cur-1)

{

printf("查詢位置異常,查詢失敗!\n");

return ;

}

k = P[MAXSIZE-1].cur;

for(i=1;iP[0].cur)

{

printf("插入位置異常,插入失敗!\n");

return ;

}

if(ListLength(P) == MAXSIZE-1)//如果連結串列滿了

{

printf("靜態連結串列已滿,插入失敗!\n");

return ;

}

k = MAXSIZE-1;

j = Malloc_List(P);

for(i=1;iListLength(P))

{

printf("刪除的位置異常,刪除失敗!\n");

return ;

}

k = MAXSIZE-1;

for(i=1;i