//
// created by pengxiangzhou on 2021/1/24.
//#include
#ifndef c_ds_linear_list_h
#define c_ds_linear_list_h
#endif
//c_ds_linear_list_h
/*線性表-順序儲存結構
* 順序儲存結構的三個屬性:陣列data,儲存位置為儲存空間的位置;陣列儲存資料元素的最大值;線性表當前長度
* 陣列的長度是存放線性表的儲存空間的長度,儲存分配後這個量一般不會變,線性表的長度等於線性表中資料元素的個數,線性表的長度<=陣列的長度
* */
#define maximize 20
typedef
int elemtype;
typedef
struct
sqlist;
/*順序表儲存結構的插入與刪除*/
#define ok 1
#define error 0
#define true 1
#define false 0
typedef
int status;
/*獲得元素操作
* status是函式的型別,其值是函式結果狀態**,如ok等
* 初始條件:順序線性表l已存在,1<= i <= listlength(l)
* 操作結果:用e返回l中第i個資料元素的值
* */
status sequence_list_getelem
(sqlist l,
int i ,elemtype *e)
/*插入操作
*如果插入位置不合理,丟擲異常;如果線性表長度大於等於陣列長度,則丟擲異常或動態增加容量;表長+1;
* 從最後乙個元素開始向前遍歷到第i個位置,分別將他們都向後移動乙個位置;將要插入的元素填入位置i處;
* 這裡的 "l->"代表"l."
* */
status sequence_listinsert
(sqlist *l,
int i, elemtype *e)
l->length--
;return ok;
}/*線性表-鏈式儲存結構
* 每個資料元素除了儲存本身的資訊外,還要儲存乙個指示其直接後繼的資訊。
* 儲存資料元素資訊的域稱為資料域,把儲存直接後繼位置的域稱為指標域。指標域中儲存的資訊稱作指標或鏈
* 資料域和指標域的兩部分資訊組成資料元素的儲存映像,稱為結點。
* 鍊錶中的第乙個結點的儲存位置叫做頭指標,頭結點的資料域可不儲存任何資訊,也可以儲存如線性表的長度等附加資訊;線性鍊錶的最後乙個結點指標為空,用null表示
* */
/*p->data表示結點的資料域,p->next表示結點的i+1指標*/
typedef
struct nodenode;
typedef
struct node *linklist;
/*定義linklist*/
/* 獲得元素操作
* 初始條件:順序線性表l已存在,1<=i<=listlength(l)
* 操作結果:用e返回l中第i個資料元素的值
* 缺點:必須從頭開始找,直到第i個元素為止*/
status linked_structure_getelem
(linklist l,
int i ,elemtype *e)
//?為什麼不是linklist *lif(
!p || j>i)
return error;
*e = p->data;
return ok;
}/*插入操作:在第i個資料中插入結點的演算法思路
*宣告一結點p指向鍊錶第乙個結點,初始化j從1開始
* 當j/*初始條件:順序線性表l已存在,1<=i<=listlength(l)*/
/*操作結果:在l中第i個位置之前插入新的資料元素e,l的長度加1*/
#include
status linked_structure_listinsert
(linklist *l,
int i ,elemtype e)if(
!p || j>i)
return error;
/*第i個元素不存在*/
s =(linklist)
malloc
(sizeof
(node));
/*生成新的結點,malloc在stdlib.h*/
s->data = e;
s->next = p->next;
p->next = s;
}/*刪除操作:將該結點的前繼結點的指標繞過,指向後繼結點,並釋放該結點
* */
status linked_structure_listdelete
(linklist *l,
int i ,elemtype *e)if(
!(p->next)
|| j>i)
return error;
/*第i個元素不存在*/
q = p->next;
p->next = q->next;
/*將q的後繼賦值給p的後繼*/
*e = q->data;
/*將q結點中的資料給e*/
free
(q);
/*讓系統**此結點,釋放記憶體*/
return ok;
}/*單鏈表的整表建立是個動態生成鍊錶的過程,即從"空表"的初始狀態起,其次建立各元素結點,並逐個插入鍊錶
*隨機產生n個元素的值,建立帶表頭結點的單鏈線性表l(頭插法)
* */
#include
void
linked_structure_createlisthead
(linklist *l,
int n )
}void
createlisthead
(linklist *l,
int n)
}void
creatlisttail
(linklist *l,
int n)
r->next =
null
;/*將尾結點的指標域置空*/
}status clearlist
(linklist *l)
(*l)
->next =
null
;/*頭結點指標域為空*/
return ok;
}/*靜態鍊錶;使用陣列代替指標,來描述單鏈表
* 陣列的元素由兩個資料域組成,data和cur;陣列的每個下表都對應乙個data(資料域,存放資料元素)和乙個cur(相當於單鏈表的next指標,存放該元素的後繼在陣列中的下標)
* */
/*線性表的靜態鍊錶儲存結構*/
#define maxsize 1000
typedef
struct
component,staticlinklist[maxsize]
;/*將一維陣列space中各分量鏈成一備用鍊錶,space[0].cur為頭指標,"0"表示空指標*/
status initlist
(staticlinklist space)
/* 靜態鍊錶的插入操作
* 需要解決的問題:靜態模擬動態鍊錶結構的儲存空間的分配,需要時申請,無用時釋放
* 在動態鍊錶中,結點的申請和釋放分別借用malloc()和free()來實現,靜態鍊錶不存在該函式,需要自行實現
* 解決方法:將所有未被使用過的及已被刪除的分量用游標鏈成乙個備用的鍊錶,每當進行插入時,從備用鍊錶上取得第乙個結點作為待插入的新結點
* */
/*若備用空間鍊錶非空,則返回分配的結點下標,否則返回0
*陣列第乙個元素的cur用來存放備用鍊錶第乙個結點的下標
* */
intlistlength
(staticlinklist l)
return j;
}int
malloc_sll
(staticlinklist space)
/*?在l中第i個元素之前插入新的資料元素e*/
status listinsert
(staticlinklist l,
int i, elemtype e)
return error;
}/*?刪除在l中第i個資料元素e*/
void
free_ssl
(staticlinklist space,
int k)
status listdelete
(staticlinklist l,
int i )
/*迴圈鍊錶:將單鏈表中終端結點的指標端由空指標改為指向頭結點,就使整個單鏈表形成乙個環
* 迴圈鍊錶和單鏈表的主要差異在於迴圈的判斷條件:單鏈表判斷p->next是否為空,迴圈鍊錶判斷p->next是否等於頭結點*/
/*雙向鍊錶:在單鏈表的每個結點中,再設定乙個指向其前驅結點的指標域,雙向鍊錶中的結點都有兩個指標域,乙個指向直接後繼,乙個指向直接前驅
* 優點:可以反向遍歷查詢等資料結構,但是在插入和刪除時,需要更改兩個指標變數
* */
/*線性表的雙向鍊錶儲存結構*/
typedef
struct dulnode
dulnode,
*dulinklist;
大話資料結構 線性表
線性表是零個或多個資料元素的有限序列。線性表的抽象資料型別定義如下 adt 線性表 list data 線性表的資料物件集合為,每個元素的型別均為datatype。其中,除第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素,除了最後乙個元素an外,每乙個元素有且只有乙個直接後繼元素。資料元素之間的...
大話資料結構 線性表 2
線性表的順序儲存結構最大的缺點是插入和刪除時需要移動大量資料,這顯然就需要消耗時間。本節討論的鏈式儲存結構可以很好滴解決這個問題。線性表的鏈式儲存結構的特點是用一組任意的儲存單元儲存線性表的資料元素,這些儲存單元可以使連續的,也可以是不連續的。這就意味著,這些資料元素可以存在記憶體未被占用的任意位置...
大話資料結構 線性表 3
順序儲存結構的建立,其實就是乙個陣列的初始化,即宣告乙個型別和大小的陣列並賦值的過程。而單鏈表和順序儲存結構就不一樣,他不像順序儲存結構那麼集中,他可以很分散,是一種動態結構。對於每個鍊錶來說,它所占用空間的大小和位置是不需要預先分配劃定的,可以根據系統的情況和實際的需求即時生成。所以,建立單鏈表的...