1. 程式人生 > >單鏈表的基本操作(一)

單鏈表的基本操作(一)

一、單鏈表的初始化:

1、生成新結點作為頭結點,用頭指標L指向頭結點

2、頭結點的指標域置空

Status InitList(LinkList &L)
{ 
     //構造一個空的單鏈表L
   L=new LNode ;//生成新結點作為頭結點,用頭指標L指向頭結點
   L-next=NuLL;//頭結點的指標域置空
   return ok;
 
}

二、取值:

1、用指標p指向首元結點,用j做計數器初值賦為1

2、從首元結點開始依次順著鏈域next向下訪問,只要指向當前結點的指標p不為空(NULL),並且沒有到達序號為i的結點,則迴圈執行以下操作: a、p指向下一個結點   b、計數器j相應加1  c、退出迴圈時,如果指標p為空,或者計數器j大於i,說明指定的序號i值不合法(i大於表長n或i小於等於0),取值失敗返回ERROR;否則取值成功,此時j=i時,p所指的結點就是要找的第i個結點,用引數e儲存當前結點的資料域,返回ok。

Status GetElem(LinkList L,int i,ElemType &e)
{
     //在帶頭結點的單鏈表L中根據序號i獲取元素的值,用e返回L中第i個數據元素的值
     p=L->next;
      j=1;    //初始化,p指向首元結點,計數器j初值為1
      while(p&&j<i)  //順連結串列向後掃描,直到p為空或p指向第i個元素
      {
          p=p->next; //p指向下一個結點
          ++j;  //計數器j相應加1
      }
     if(!p || j>i) return  ERROR;//i值不合法i>n或i<=0
    e=p->data;   //取第i個結點的資料域
    return ok;
}

三、查詢:
1、用指標p指向首元結點

2、從首元結點開始依次順著鏈域next向下查詢,只要指向當前結點的指標p不為空,並且p所指結點的資料域不等於給定值e,則迴圈執行以下操作,:p指向下一個結點

3、返回p,若查詢成功,p此時即為結點的地址值,若查詢失敗,p的值即為NULL。

LNode *LocateElem(LinkList L,ElemType e)
{
    //在帶頭結點的單鏈表L中查詢值為e的元素
    p=L->next;//初始化,p指向首元結點
   while(p && p->data !=e)//順著連結串列向後掃描,直到p為空域或p所指結點的資料域等於e
  {
     p=p->next;//p指向下一個結點
     return p;//成功查詢返回值為e的結點地址為p,查詢失敗p為NULL

}


}

四、插入

a    -------指標域,且指向x b------指標域

 

 

   x------指標域,且指向b

 

 

說明:為插入資料元素x,首先要生成一個數據域為x的結點,然後插入到單鏈表中,根據插入操作的邏輯定義,還需要修改結點a中的指標域,令其指向 結點x,而結點x中的指標域應指向節點b,從而實現3個元素a、b、x之間邏輯關係的變化。

演算法步驟:

將值為e的新結點插入到表的第i個結點的位置上,即插入到結點a與b之間,具體插入過程如下:

1、查詢結點a,並由指標p指向該結點

2、生成一個新的結點*s

3、將新的結點*s的資料域設定為e

4、將新的結點*s 的指標域指向結點b

5、將結點*p的指標域指向新結點*s           

Status ListInsert(LinkList &L,int i,ElemType e)
{
    //在帶頭結點的單鏈表L中第i個位置插入值為e 的新結點
   p=L;
   j=0;
   while(p&& (j<i-1))
  {
      p=p->next;
      ++j;//查詢第i-1個結點,p指向該結點
   }
   if(!p ||j>i-1)
    return ERROR;
    s=new LNode;//生成一個新的結點*s
    s->data=e;//將結點*s的資料域設定為e
   s->next=p->next;//將結點*s的指標域指向結點b
    p->next=s;//將結點*p的指標域指向結點*s
    return ok;
}

&n