1、線性表的鏈式儲存結構
每個元素多用乙個位置來存放指向下乙個元素位置的指標,依次類推,可以找到所有的元素。鏈式儲存中,除了要儲存資料本身外,還要儲存它的後繼元素的儲存位址(指標)。
資料域:儲存資料資訊的域;
指標域:儲存直接後繼位置的域。
這兩部分資訊組成資料元素稱之為儲存映像,節點node。
鍊錶中每個結點中只包含乙個指標域,為單鏈表。鍊錶中的第乙個結點的儲存位置叫做頭指標,最後乙個結點指標為空。
2、頭節點和頭指標(頭節點不是必須的)
頭指標:
1頭節點:)頭指標是指鍊錶指向第乙個結點的指標,若煉表有頭節點,則是指向頭結點的指標。
2)頭指標具有標識作用,常用頭指標冠以鍊錶的名字(指標變數的名字)。
3)無論鍊錶是否為空,頭指標均不為空。
4)頭指標是鍊錶的必要元素。
1)放在第乙個元素的結點之前,其資料域一般無意義(可以用來存放鍊錶長度)
2)為了操作的統一方便設立(在第一元素結點前插入和刪除第一結點與其他結點操作統一)
3)頭節點不一定是鍊錶的必要元素。
3、帶頭結點的單鏈表實現
c語言中可以用結構指標來描述單鏈表:
typedef int單鏈表的插入:elemtype;
typedef
struct
node node, *linklist;
//結點由存放資料的資料域和存放後繼結點位址的指標域組成
//單鏈表的刪除單鏈表的插入
status listinsert(linklist* l, int i, elemtype e)//
l是指向頭節點的二級指標
int j=1
; linklist p = *l;
while (p && (j < i))//
找到要插入的位置
linklist n = (linklist)malloc(sizeof
(node));
n->data =e;
n->next = p->next;
p->next =n;
(*l)->data++; //頭節點的資料域,表示當前鍊錶的長度
return1;
}
//單鏈表的刪除
status listdelete(linklist* l, int i, elemtype*e)
linklist q = p->next; //
要刪除的結點
*e = q->data;
p->next = q->next;
free
(q);
(*l)->data--;
return1;
}
//四個基本操作,初始,清空,判斷是否為空,獲取長度
//初始化帶有頭結點的鍊錶
status initlist(linklist*l)
//清空鍊錶(不會清除頭結點)
status clearlist(linklist*l)
(*l)->next =null;
return
ok;}
//判斷鍊錶是否為空
status listempty(linklist l)
//獲取列表長度
intlistlength(linklist l)
#include #includeview codetypedef
intelemtype;
typedef
intstatus;
typedef
struct
node node, *linklist;
//結點由存放資料的資料域和存放後繼結點位址的指標域組成
//單鏈表的插入
status listinsert(linklist* l, int i, elemtype e)//
l是指向頭節點的二級指標
int j=1
; linklist p = *l;
while (p && (j < i))//
找到要插入的位置
linklist n = (linklist)malloc(sizeof
(node));
n->data =e;
n->next = p->next;
p->next =n;
(*l)->data++; //
頭節點的資料域,表示當前鍊錶的長度
return1;
}//單鏈表的刪除
status listdelete(linklist* l, int i, elemtype*e)
linklist q = p->next; //
要刪除的結點
*e = q->data;
p->next = q->next;
free
(q);
(*l)->data--;
return1;
}int
main()
linklist p = l->next;
while
(p)
printf_s("\n
");intj,e;
printf_s(
"請輸入要刪除第幾個結點\n");
scanf_s("%d
",&j);
listdelete(&l, j, &e);
printf_s(
"刪除的結點為:%d\n
", e);
printf_s(
"刪除後的鍊錶為:\n");
p = l->next;
while
(p)
return1;
}
對於插入或刪除資料越頻繁的操作,單鏈表的效率優勢越明顯。
4、建立鍊錶
頭插法:從乙個空表開始,生成新節點,讀取的資料放到新節點的資料域中,然後將新節點插入到當前鍊錶的表頭上。也就是說,把新加的元素放在表頭後的第乙個位置。
void creatlisthead(linklist* l, int尾插法:把新節點插入鍊錶的最後,需要增加乙個指向鍊錶最後乙個尾節點的指標r。n)}
void creatlistend(linklist* l, int5、單鏈表結構與順序儲存結構的優缺點:n)}
1)若線性表需要頻繁查詢,很少進行插入和刪除操作,採用順序儲存結構合適。 例如使用者註冊資訊,絕大多數都是讀取資料。優缺點2)若需要頻繁的插入和刪除,採用單鏈表合適。
順序儲存結構
單鏈表儲存分配方式:
一段連續的儲存單元依次儲存線性表的資料元素
鏈式儲存,用一組任意的儲存單元存放線性表的元素
時間效能:
查詢o(1),插入和刪除o(n)
查詢o(n),插入和刪除o(1)
空間效能:
需要預先分配儲存空間,較大浪費,較小溢位
利用零碎空間
線性表鏈式儲存結構
include include 線性表鏈式儲存結構 typedef struct lnodelnode,linklist int initlist linklist l 初始化 int endinsert linklist l,int e p next s return 1 末尾插入元素 int g...
線性表鏈式儲存結構
為了表示每個資料元素ai與其直接後繼資料元素ai 1之間的邏輯關係,對資料元素ai來說,除了儲存其本身的資訊之外,還需儲存乙個指示其直接後繼的資訊 即直接後繼的儲存位置 我們把儲存資料元素資訊的域稱為資料域,把儲存直接後繼位置的域稱為指標域。指標域中儲存的資訊稱做指標或鏈。這兩部分資訊組成資料元素a...
線性表鏈式儲存
線性表鏈式儲存結構的建立 刪除最小值結點 值唯一 刪除某個指定值 不唯一 就地逆置 反向輸出 遞增排序 刪除重複結點 根據奇偶序號劃分成兩個帶頭結點的單鏈表。include stdio.h include stdlib.h typedef struct lnode lnode,llist void ...