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...