單鏈表的整表創建、刪除
單鏈表的整表創建
思路:
-聲明一個結點p和計數器變量i
-初始化一個空鏈表L
-讓L的頭結點的指針指向NULL,即建立一個帶頭結點的單鏈表;
-循環實現賦值和插入
頭插法建表
從一個空表開始,生成新結點,讀取數據存放到新節點的數據域中,然後將新節點插入到當前鏈表的表頭上,直到結束爲止。
如,我們將hello插入鏈表中
代碼:
void CreateListHead(LinkList *L,int e)
{
LinkList p;
int i;
srand(time(0));//隨機種子,與time結合模擬隨機數的效果
*L = (LinkList)malloc(sizeof(Node));//malloc生成一個結點
(*L)->next = NULL;
for(i = 0;i<n;i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand()%100+1;//rand產生隨機數,%100生成0~99的數
p->next = (*L)->next;
(*L)->next = p;
}
}
尾插法
與頭插法相反
void CreateListHead(LinkList *L,int e)
{
LinkList p,r;
int i;
srand(time(0));//隨機種子,與time結合模擬隨機數的效果
*L = (LinkList)malloc(sizeof(Node));//malloc生成一個結點
r = *L;
for(i = 0;i<n;i++)
{
p = (Node *)malloc(sizeof(Node));
p->data = rand()%100+1;//rand產生隨機數,%100生成0~99的數
p->next = p;
r = p; //更改節點名的過程
}
p->next = NULL;
}
單鏈表的整表刪除
思路:
-聲明結點p和q
-將第一個結點賦值給p,下一個結點賦值給q
-循環執行釋放p和q賦值給p的操作
代碼:
status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next;
while(p)
{
q = p->next;
free(p);
p =q;
}
(*L)->next = NULL;
return OK;
}
單鏈表與順序表存儲結構優缺點
存儲方式 | 時間性能 | 空間性能 | |
順序存儲 | 連續存儲單元依次存儲 線性表的數據元素 | 插入:O(1) 插入和刪除:平均移動 表長的一半元素,時間 爲O(n) | 容易溢出 |
單鏈表 | 用一組任意的存儲單元 存放元素 | 插入:O(n) 插入和刪除:計算位置 指針,時間僅爲O(1) | 不需要分配存儲空間 |
若線性表需要頻繁查找,很少插入和刪除,宜採用順序存儲結構
若線性表頻繁插入和刪除時,宜採用單鏈表結構