C++學習筆記(六)單鏈表(C風格)

鏈式存儲結構:

結構:             

數據域

指針域

Data

Next

結點定義:

Typedef struct LNode

{

         ElemType data;

         Struct LNode *next;

}LNode,*LinkList;

頭指針:LinkList即爲頭指針。本身一般不存儲信息(也可存儲長度等相關信息),指向第一個元素結點

頭結點≠頭指針   鏈表必須要頭指針,但是不一定有頭結點

頭結點的好處:①方便操作和處理(對於第一個元素而言)。②空表和非空表操作統一

 

操作:

  • 建表
  1. 頭插法:將新結點插入到當前表頭

頭插法建立的數據順序與讀取的數據順序相反。

LinkListCreat_Head(LinkList &L)

{

            L=(LinkList) new LNode;            //創建頭結點

            L->next=NULL;                            //初始化空鏈表

 

            Int x;

            Cin>>x;

           

While(x!=9999)                           //終止條件

{

         S=(LinkList) new LNode;  //創立新結點

         S->data=x;                           //結點數據賦值

        

         S->next=L->next;               //新結點的後繼指向尾部(NULL)

         L->next=S;                           //頭結點的後繼指向新節點

         Cin>>x;                                 //獲取下一個數據的值

}

Return L;

}

  1. 尾插法

LinkListCreat_Rear(LinkList &L)

{

            L=(LinkList) new LNode;            //創建頭結點

            LNode *s,*r=L;                            //r爲表尾指針,指向表尾

            Int x;

            Cin>>x;

           

While(x!=9999)                           //終止條件

{

         S=(LinkList) new LNode;  //創立新結點

         S->data=x;                           //結點數據賦值

        

         r->next=s;                           //

         r=s;                                       //r指向新的表尾

         Cin>>x;                                 //獲取下一個數據的值

}

r->next=NULL;                             //尾結點指針置空

Return L;

}

尾插法建立的數據順序與讀取的數據順序一致。

         ②查找結點

                   1. 按序號

                   從第一個結點出發,順指針next域逐個往下搜索,知道找到第i個結點,否則返回最後一個結點的指針域NULL。

                   LNode *GetElem_Loc(LinkList L, int i)

                   {

                            If(i==0) return L;       //查找第0個節點(頭結點),直接返回

                           

                            LNode *P=L->next;           //第一個結點賦給P

                            Int j=1;                                 //用於計數

                            While(P&&j<i)                    //從第一個結點開始查找第i個結點(同時保證指向當前結點的指針不爲空)

                            {

                                     P=P-next;

                                     J++;

}

Return P;

}

2.按值

LNode *GetElem_Data(LinkList, ElemType e)

{

                            LNode *P=L->nextg;

                            While(P!=NULL&&P->data!=e)

                                     P=P->next;                 //遍歷鏈表

                            Return P;                             //返回結果(沒找到就是空)

}

         ③插入(按位置)

                   P=GetElem_Loc (L,i-1);             //獲取前驅指針

                   S->next = P->next;             //將*S的指針域指向*P的後繼結點

                   P->next=S;                           //令結點*S的指針域指向新插入的結點*S

         ④刪除操作

                   P=GetElem_Loc(L,i-1);              //獲取被刪除位置的前驅指針

                   Q=P->next;                                   //輔助指針(指向被刪除結點)

                   P->next=Q->next;                       //P指向結點的後繼指向被刪除節點的後繼

                   Delete Q;                                      //釋放內存

        

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