Data Structure(1-5)---單鏈表的插入與刪除

單鏈表的插入

假設存儲元素e的結點爲s,要實現結點p、p->next和s之間的邏輯關係變化,只需將結點s插入到結點p和p->next之間即可。

s->next=p->next;
p->next=s;

算法思路(單鏈表第i個數據插入結點):

  1. 聲明一指針p指向鏈表頭結點,初始化j從1開始;
  2. 當 j < i 時,就遍歷鏈表,讓p的指針向後移動,不斷指向下一結點,j累加1;
  3. 若到鏈表末尾p爲空,則說明第i個結點不存在;
  4. 否則查找成功,在系統中生成一個空結點s;
  5. 將數據元素e賦值給s->data;
  6. 單鏈表的插入標準語句s->next=p->next; p->next=s;
  7. 返回成功。
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個數據刪除結點的算法思路):

  1. 聲明一指針p指向鏈表頭結點,初始化j從1開始;
  2. 當 j < i 時,就遍歷鏈表,讓p的指針向後移動,不斷指向下一結點,j累加1;
  3. 若到鏈表末尾p爲空,則說明第i個結點不存在;
  4. 否則查找成功,將欲刪除的結點p->next賦給q;
  5. 單鏈表的刪除標準語句p->next=q->next;
  6. 將q結點中的數據賦值給e,作爲返回;
  7. 釋放結點q;
  8. 返回成功。
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)。對於插入刪除數據越頻繁的操作,單鏈表的效率就越是明顯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章