1、概念
靜態鍊錶,也是線性儲存結構的一種,它兼顧了順序表和煉表的優點於一身,可以看做是順序表和煉表的公升級版。使用靜態鍊錶儲存資料,資料全部儲存在陣列中(和順序表一樣),但儲存位置是隨機的,資料之間"一對一"的邏輯關係通過乙個整形變數(稱為"游標",和指標功能類似)維持(和鍊錶類似)。
2、儲存結構
struct component
;typedef component staticlinklist[maxsize]
;//結構體陣列
3、初始化陣列中的第乙個元素和最後乙個元素作為特殊元素處理,不存放資料。通常把陣列中未存放資料的元素稱為備用鍊錶。而陣列的第乙個元素,即下表為0的元素的cur存放備用鍊錶的第乙個結點的下標;陣列中最後乙個元素,即下標為(maxsize - 1)的元素的cur存放第乙個有數值的元素的下標,相當於單鏈表中頭結點的作用。
/*初始化陣列線性表,也是將陣列鏈結成備用鍊錶,其中space[0].cur代表頭指標*/
status initlist
(staticlinklist &space)
4、靜態鍊錶插入操作1)插入前我們需要考慮,由於要多存入乙個元素,那麼就要考慮分配空間問題。即從鍊錶中備用空間裡拿出一空間,具體如下:
/*靜態鍊錶返回空閒空間下標,也是進行插入元素的準備操作(類似動態鍊錶的分配空間)*/
intmalloc_sl
(staticlinklist space)
//返回分配的結點下標,否則返回0
return i;
}
2)插入新元素,具體我們這裡舉例將在「乙」 「丁」中間插入「丙」
/*靜態鍊錶的插入操作*/
status listinsert
(staticlinklist &l,
int i, elemtype e)
return error;
}
5、靜態鍊錶刪除操作1)刪除時,需要考慮第一刪除位置合不合理?
2)刪除元素資料後,資料空間的**問題,即怎麼將它恢復到備用鍊錶中?
3)刪除元素的目標鍊錶實際元素資料長度?多長問題
4)就是刪除元素的前後元素游標怎麼變化?下面以刪除「甲」為例
//將刪除節點空間進行**,**為備用鍊錶中
void
free_sl
(staticlinklist &space,
int k)
//k表示刪除元素再鍊錶中的下標
/*返回靜態鍊錶中資料元素的個數*/
intlistlength
(staticlinklist l)
return count;
}/*刪除l中第i元素的資料e*/
status listdelete
(staticlinklist &l,
int i)
6、完整**
#include
"iostream"
using
namespace std;
/*線性表的操作包括如下幾種
(1) initlist(&l) 初始化,構造乙個空的線性表
(2) listempty(&l) 判斷線性表是否為空,true or flase
(3) clearlist(&l) 清空線性表中的內容
(4) getelem(&l,i,e) 返回線性表i位置上的元素值,通過e返回
(9) listinsert(&l,i,e) 如果線性表存在了,而且i符合條件,則在i位置插入乙個元素e
(10)listdelete(&l,i,) 刪除i位置上的元素
(5) listlength(l) 返回線性表的長度
*/#define maxsize 1000
#define ok 1
#define error 0
typedef
int status;
typedef
int elemtype;
struct component
;typedef component staticlinklist[maxsize]
;//typedef可以掩飾復合型別,如指標和陣列
/*初始化陣列線性表,也是將陣列鏈結成備用鍊錶,其中space[0].cur代表頭指標*/
status initlist
(staticlinklist &space)
/*靜態鍊錶返回空閒空間下標,也是進行插入元素的準備操作(類似動態鍊錶的分配空間)*/
intmalloc_sl
(staticlinklist space)
//返回分配的結點下標,否則返回0
return i;
}/*返回靜態鍊錶中資料元素的個數*/
intlistlength
(staticlinklist l)
return count;
}/*靜態鍊錶的插入操作*/
status listinsert
(staticlinklist &l,
int i, elemtype e)
return error;
}//將刪除節點空間進行**,**為備用鍊錶中
void
free_sl
(staticlinklist &space,
int k)
//k表示刪除元素再鍊錶中的下標
/*刪除l中第i元素的資料e*/
status listdelete
(staticlinklist &l,
int i)
intmain()
cout << endl;
cout <<
"please hello world!"
<< endl;
listdelete
(mylist,2)
;//刪除元素
//遍歷並輸出該鍊錶上的所有資料
cout <<
"遍歷並輸出該鍊錶上的所有資料:"
<< endl;
i = mylist[
999]
.cur;
while
(i) cout << endl;
system
("pause");
return0;
}}
輸出結果:
遍歷並輸出該鍊錶上的所有資料:13
250please hello world!
遍歷並輸出該鍊錶上的所有資料:12
50
C 資料結構之靜態鍊錶
struct node class slist 1.建構函式 new乙個很大的陣列,輸入n個元素,並把next賦值為下乙個元素的下標 陣列中的所有next都要初始化 在非空表的最後設定結束標誌,next不指向任何下標,賦值為 1,初始化非空表和空閒表的頭指標 slist slist int n fo...
C資料結構 靜態鍊錶
對於線性鍊錶可用一維陣列來進行描述,這種描述方法便於在沒有指標型別的高階程式語言中使用鍊錶結構,即使用陣列描述的鍊錶稱為靜態鍊錶。由於全域性陣列是儲存在靜態區也叫做靜態鍊錶。c語言具有指標能力使其非常容易地操作記憶體中的位址和資料,對於物件導向的語言雖然不使用指標,但因為啟用了物件引用機制,從某種角...
資料結構鍊錶 靜態鍊錶
1 在這裡我們首先要複習一下鍊錶c語言的定義 這看起來很簡單,但實際上至關重要!data域 存放結點值的資料域。next域 存放結點的直接後繼的位址 位置 的指標域 鏈域 也就是說next域儲存的是乙個位址,這個位址是下一節點的位址。注意 鍊錶通過每個結點的鏈域將線性表的n個結點按其邏輯順序鏈結在一...