4 鍊錶(三) 插入,刪除

2021-08-16 22:15:47 字數 1475 閱讀 6074

1)插入

先大致理一下思路,完成插入,必須的先明確插入的值,然後再明確往鍊錶的**插,也就是插入的位置。對了,還得明確往哪個煉表裡插。這樣就需要三個引數,val,pos,phead

示例**如下:

bool insert_list(pnode phead,int pos,int val)

/* if(i>pos - 1|| null == p)

return false;*/

pnode pnew = (pnode)malloc(sizeof(node));//記憶體溢位,沒解決

if (null == pnew)

pnew->data = val;

pnode q = p->pnext;

p->pnext = pnew; //掛到後面

pnew->pnext = q; //再將指標指到後面的數

return true;

}

**分析:

首先,第乙個while迴圈,其判斷條件為:當其指標域不為空時,且位置計數器在插入位置前面時為真。

這裡pos從1開始。

接下來,鍊錶下移,計數器加一。

這裡有一點要注意的地方。就是這裡將p指向phead,而不是指向phead->pnext。之前在遍歷時,將p指向的是phead->pnext。我理解的原因如下:遍歷時需要判斷指標是否移到了尾節點。而這裡是需要判斷鍊錶是否為有效鍊錶,也就是是否有空間。這是個輔助判斷條件。主要判斷條件在後面,經過我試驗。刪掉這句也是可以得。但是程式健壯性,會有削弱。

接下來,定義乙個pnew;

將插入值放入資料域中;

再定義乙個q,將其指向p的指標域,換句話說就是將p的指標域賦給q。別把原位置節點的位址丟了,先找個地方放好。

接下來的套路就和建立差不多了,將pnew掛到後面。換句話就是將p指向pnew;

再將pnew指向下個節點,也就是之前位置的節點;

這裡想通了,好開森。。

2)刪除

思路也差不多。就是要把要刪除的值,放到乙個地方,別丟了。**如下:

bool delete_list(pnode phead,int pos,int *val)

printf("i=%d %d\n", i, pos);

/*if (i>pos - 1 || null == p->pnext);

return false; */

pnode q = p->pnext;

*val=q->data;

p->pnext = p->pnext->pnext;

free(q);

q = null;

return true;

}

這裡要注意的是:

這裡操作的元素p是刪除元素的前乙個元素。先將其位址域安排好,然後再將其原本指向位置的元素儲存帶val。再直接指向刪除元素的後乙個元素。再將刪除元素的指標釋放,清空。防止洩露。

鍊錶插入刪除

include include typedef struct node node,linklist void createlist linklist head 建立鍊錶 s node malloc sizeof node s next null s data data p next s p s in...

鍊錶插入刪除操作

include using namespace std 定義單向鍊錶節點 struct listnode end of listnode 將新節點插入煉表頭 void insertlist listnode head,int insertdata listnode pnode new listnod...

鍊錶的插入 刪除

include include include define true 1 define false 0 define ok 1 typedef struct l list list,plist plist create list int len 建立乙個單鏈表 bool show list pli...