1.線性表的鏈式儲存結構是用一組任意的儲存單元儲存線性表的資料元素,這組儲存單元可以存在記憶體中未被占用的任意位置。
線性表的連式儲存結構包括資料域和指標域;其中資料域存放資料元素資訊指標域存放指標,我們把這兩部分資訊組成的資料元素稱為結點(node)
2.adt linklist
data
資料結構包括兩部分,一部分用來存放資料,另一部分用來存放指向下乙個結構的指標。
operation
getelem(l,i,*e):單鏈表的讀取
獲得鍊錶第i個資料的演算法思路:
-宣告乙個結點p指向鍊錶第乙個結點,初始化j從1開始;
-當j
listinsert(*l,i,e):單鏈表的插入
只需讓s->next和p->next的指標做一點的改變。
-s->next=p->next;
-p->next=s;
listdelete(*l,i,*e):單鏈表的刪除
假設元素a2的結點為q,要實現結點q刪除單鏈表的操作,其實就是將它的前繼結點的指標繞過指向後繼結點即可
-p->next=p->next->next;
-或q=p->next;p->next=q->next;
單鏈表第i個資料刪除結點的演算法思路:
-宣告結點p指向鍊錶第乙個結點,初始化j=1;
-當j<1時,就遍歷鍊錶,讓p的指標向後移動,不斷指向下乙個結點,j累加1;
-若到鍊錶末尾p為空,則說明第i個元素不存在;
-否則查詢成功,將欲刪除結點p->next賦值給q;
-單鏈表的刪除標準語句p->next=q->next;
-將q結點中的資料賦值給e,作為返回;
-釋放q結點
createlisthead(*l,n):單鏈表的建立
乙個動態生成鍊錶的過程,從「空表」的初始狀態起,依次建立各元素結點並逐個插入鍊錶
-宣告乙個結點p和計數器變數i
-初始化一空鍊錶l;
-讓l的頭結點的指標指向null,即建立乙個帶頭結點的單鏈表;
-迴圈實現後繼結點的賦值和插入。
頭插法建立單鏈表:
頭插法從乙個空表開始,生成新結點,讀取資料存放到新結點的資料域中,然後將新結點插入到當期鍊錶的表頭上,直到結束為止。
簡單來說,就是包新加進的元素放在表頭後的第乙個位置:
-先讓新結點的next指向頭結點之後
-然後讓表頭的next指向新結點
createlisttail(*l,n)
尾插法建立單鏈表:
頭插法建立的鍊錶的結點的次序和輸入的順序相反。
單鏈表的尾插法思路如下:
-建立乙個鍊錶的頭指標
-用兩個指標變數依次迴圈向下插入結點
clearlist(*l):單鏈表的整表刪除
單鏈表整表刪除的演算法思路如下:
-宣告結點p和q
-將第乙個結點賦值給p,下乙個結點賦值給q;
-迴圈執行釋放p和q賦值給p的操作
3.實現
#include #include #include /**
線性表的鏈式儲存結構是用一組任意的儲存單元儲存線性表的資料元素
,這組儲存單元可以存在記憶體中未被占用的任意位置。
線性表的連式儲存結構包括資料域和指標域;其中資料域存放資料元素資訊
指標域存放指標,我們把這兩部分資訊組成的資料元素稱為結點(node)
*/#define ok 1
#define error 0
typedef int status;
typedef int elemtype;
typedef struct node
node;
typedef struct node* linklist;
/* 單鏈表的讀取
獲得鍊錶第i個資料的演算法思路:
-宣告乙個結點p指向鍊錶第乙個結點,初始化j從1開始;
-當jnext;
if(!p || j>i)
return error;
while(p && jnext;
++j;
}*e=p->data;
return ok;
} /*
單鏈表的插入:
只需讓s->next和p->next的指標做一點的改變。
-s->next=p->next;
-p->next=s;
*/ status listinsert(linklist *l,int i,elemtype e)
s=(linklist)malloc(sizeof(node));
s->data=e;
s->next=p->next;
p->next=s;
return ok;
} /*
單鏈表的刪除:
假設元素a2的結點為q,要實現結點q刪除單鏈表的操作,其實就是將它的前繼結點的指標繞過指向後繼結點即可
-p->next=p->next->next;
-或q=p->next;p->next=q->next;
單鏈表第i個資料刪除結點的演算法思路:
-宣告結點p指向鍊錶第乙個結點,初始化j=1;
-當j<1時,就遍歷鍊錶,讓p的指標向後移動,不斷指向下乙個結點,j累加1;
-若到鍊錶末尾p為空,則說明第i個元素不存在;
-否則查詢成功,將欲刪除結點p->next賦值給q;
-單鏈表的刪除標準語句p->next=q->next;
-將q結點中的資料賦值給e,作為返回;
-釋放q結點
*/ status listdelete(linklist *l,int i,elemtype *e)
q=p->next;
*e=q->data;
p->next=q->next;
free(q);
return ok;
} /*
單鏈表的建立:
乙個動態生成鍊錶的過程,從「空表」的初始狀態起,依次建立各元素結點並逐個插入鍊錶
-宣告乙個結點p和計數器變數i
-初始化一空鍊錶l;
-讓l的頭結點的指標指向null,即建立乙個帶頭結點的單鏈表;
-迴圈實現後繼結點的賦值和插入。
*//*
頭插法建立單鏈表:
頭插法從乙個空表開始,生成新結點,讀取資料存放到新結點的資料域中,然後將新結點插入到當期鍊錶的表頭上,直到結束為止。
簡單來說,就是包新加進的元素放在表頭後的第乙個位置:
-先讓新結點的next指向頭結點之後
-然後讓表頭的next指向新結點
*/void createlisthead(linklist *l,int n)}/*
尾插法建立單鏈表:
頭插法建立的鍊錶的結點的次序和輸入的順序相反。
單鏈表的尾插法思路如下:
-建立乙個鍊錶的頭指標
-用兩個指標變數依次迴圈向下插入結點
*/void createlisttail(linklist *l,int n)
r->next=null;}/*
單鏈表的整表刪除
單鏈表整表刪除的演算法思路如下:
-宣告結點p和q
-將第乙個結點賦值給p,下乙個結點賦值給q;
-迴圈執行釋放p和q賦值給p的操作
*/status clearlist(linklist *l)
(*l)->next=null;
return ok;}/*
單鏈表結構與順序儲存結構的優缺點
1.儲存分配方式
-順序儲存結構用一段連續的儲存單元依次儲存線性表的資料元素
-單鏈表採用鏈式儲存結構,用一組任意的儲存單元存放線性表的元素
2.時間效能
-查詢順序儲存結構o(1)
單鏈表o(n)
-插入和刪除
順序儲存結構需要平均移動表長一半的元素,時間為o(n)
單鏈表在計算出某位置的指標後,出入和刪除時間僅為o(1)
-空間性嫩
若線性表需要頻繁查詢,很少進行插入和刪除操作是,宜採用順序儲存結構。
若需要頻繁插入和刪除時,宜採用單鏈表結構
*/int main()
4.單鏈表結構與順序儲存結構的優缺點
1.儲存分配方式
-順序儲存結構用一段連續的儲存單元依次儲存線性表的資料元素
-單鏈表採用鏈式儲存結構,用一組任意的儲存單元存放線性表的元素
2.時間效能
-查詢順序儲存結構o(1)
單鏈表o(n)
-插入和刪除
順序儲存結構需要平均移動表長一半的元素,時間為o(n)
單鏈表在計算出某位置的指標後,出入和刪除時間僅為o(1)
-空間性嫩
若線性表需要頻繁查詢,很少進行插入和刪除操作是,宜採用順序儲存結構。
若需要頻繁插入和刪除時,宜採用單鏈表結構
資料結構與演算法(C語言)之線性表(順序儲存結構)
1.線性表的定義 由零個或多個資料元素組成的有限序列。用數學語言定義如下 若線性表記為 a1,ai 1,ai,ai 1,an 則表中ai 1領先於ai,ai領先於ai 1,稱ai 1是ai的直接前驅元素,ai 1是ai的直接後繼元素。線性表的個數n 0,n 0時為空表 2.adt線性表 list d...
資料結構C語言之線性表簡單實現
include stdafx.h include include include define list size 100 定義線性表結構 typedef structsqlist int tmain int argc,tchar argv void initlist sqlist l l.leng...
資料結構與演算法(C ) 線性表
資料元素之間的邏輯關係是線性關係 線性結構是資料元素間約束力最強的一種資料結構 非空集合中,除第乙個元素無前驅外,集合中每個元素有且只有乙個直接前驅 除最後乙個元素無後繼外,集合中每個元素有且只有乙個直接後繼。1 利用順序元素的儲存位置表示線性表中相鄰資料元素之間的前後關係,即線性表的邏輯結構與儲存...