單鏈表的基本操作(一)
阿新 • • 發佈:2019-07-21
一、單鏈表的初始化:
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