int ListDelete(LinkList *L,int i,ElemType *e)
{
int j;
LinkList p,q;
p = *L;
j = 1;
while (p->next && j < i)
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
return 0;
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return 1;
}
假設鏈表的長度為5,要洗掉位置i=3上的結點
在上述代碼中,p = *L 可以理解為p指向鏈表L的首結點,這樣在后續的while部分:
第一次回圈(j=1),p->next不為空,且j < i,此時執行p=p->next,此時p指向的應該是鏈表L的第一個有效結點,j自增1。
第二次回圈(j=2),p->next不為空,且j < i,此時執行p=p->next,此時p指向的應該是鏈表L的第二個有效節點,j自增1。
第三次回圈(j=3),p->next不為空,但j = i,不符合while的判定條件,直接退出while回圈執行后續操作,此時j = 3,p指向的為鏈表L中第i-1個位置上的節點,在此例子中為鏈表L的第二個節點。
之后,使用q臨時保存p節點的后繼節點p->next,再將p節點的指標域更改為q節點的后繼節點的地址,從而完成了從鏈表L中將i=3位置上的節點移除的操作。
上面的內容,看上去沒什么問題,不過總是感覺有點怪,說不上來哪里怪,有大佬幫忙看下呢
uj5u.com熱心網友回復:
這個沒問題:int ListDelete(LinkList *L,int i,ElemType *e)
{
int j;
LinkList p,q;
p = *L;
j = 1;
while (p->next && j < i)
{
p = p->next;
++j;
}
if (!(p->next) || j > i) return 0;
q = p->next; //q指向i=3結點的頭部
p->next = q->next; // p->next 指向i=3結點的尾部,即i=4結點的頭部,
//等同于 p->next = p->next->next,把i=2結點的尾部指標指向i=4結點的頭部
*e = q->data;
free(q); //釋放q
return 1;
}
uj5u.com熱心網友回復:
這個代碼洗掉除頭結點外的節點是沒問題的。但是如果洗掉頭結點,這個就會有問題,需要額外處理一下~uj5u.com熱心網友回復:
這里面有, 希望對您有幫助:https://blog.csdn.net/it_xiangqiang/category_10768339.html。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/283633.html
標籤:C語言
下一篇:求幫助
