單鏈表的插入
假設存儲元素e的結點爲s,要實現結點p、p->next和s之間的邏輯關係變化,只需將結點s插入到結點p和p->next之間即可。
s->next=p->next;
p->next=s;
算法思路(單鏈表第i個數據插入結點):
- 聲明一指針p指向鏈表頭結點,初始化j從1開始;
- 當 j < i 時,就遍歷鏈表,讓p的指針向後移動,不斷指向下一結點,j累加1;
- 若到鏈表末尾p爲空,則說明第i個結點不存在;
- 否則查找成功,在系統中生成一個空結點s;
- 將數據元素e賦值給s->data;
- 單鏈表的插入標準語句s->next=p->next; p->next=s;
- 返回成功。
Status ListInsert (LinkList *L, int i, ElemType e)
{
int j=1;
Linklist p,s;
p=*L;
while (p && j<i)
{
p=p->next;
++j;
}
if (!p || j>i)
return ERROR; /*第i個結點不存在*/
s= (LinkList) malloc (sizeof(Node));/*生成新結點*/
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
單鏈表的刪除
算法思路(單鏈表第i個數據刪除結點的算法思路):
- 聲明一指針p指向鏈表頭結點,初始化j從1開始;
- 當 j < i 時,就遍歷鏈表,讓p的指針向後移動,不斷指向下一結點,j累加1;
- 若到鏈表末尾p爲空,則說明第i個結點不存在;
- 否則查找成功,將欲刪除的結點p->next賦給q;
- 單鏈表的刪除標準語句p->next=q->next;
- 將q結點中的數據賦值給e,作爲返回;
- 釋放結點q;
- 返回成功。
Status ListDelete (LinkList *L, int i, ElemType *e)
{
int j=1;
Linklist p,q;
p=*L;
while (p->next && j<i) /*遍歷尋找第i-1個結點*/
{
p=p->next;
++j;
}
if (!(p->next)|| j>i)
return ERROR; /*第i個結點不存在*/
q=p->next;
p->next=q->next;
*e=q->data;
free(q); /*讓系統回收此結點,釋放內存*/
return OK;
}
插入和刪除操作時間複雜度都爲O(n)。對於插入刪除數據越頻繁的操作,單鏈表的效率就越是明顯。