我大概看懂你的意思了。head是頭指標,p1是指向第一個結點的指標,p2是指向p1前一個結點的指標。如果你給出的程式的是這個意思的話,那下面我就可以解釋了。首先對單向連結串列的刪除要考慮以下4種情況:1.連結串列本身是空的2.刪除的是連結串列的首結點3.刪除的是連結串列的中間結點或是連結串列的尾結點4.要刪除的結點在原連結串列中找不到對你的程式的解釋:(每個結點包含兩個部分:資料和指向下一個結點的指標) if(p1==head) //首先要明白p1是待刪除的結點,如果要刪除的結點是首結點// head=head->next;//將首結點中指向下一結點的指標重新賦給head,這樣首結點就脫離原連結串列了// else { p2->next=p1->next;//這是什麼意思??? free(p1); (回答:這句話是用來刪除結點在連結串列的中部或尾部的情況的。p1是要刪除 的結點,p2是要刪除的結點p1的前一個結點,p1->next儲存的是下一個 結點(p1+1)地址。將結點p1中的成員p1.next記憶體儲的地址賦給p2->next 這樣也就相當於使得p2結點中的p2->next成員存放的也是(p1+1)結點的 地址,這樣p2就能指向連結串列中(p1+1)結點了,也就是相當於p1結點脫離了 連結串列,所以我們可以說p1結點被刪除了) }提問:為什麼不直接用p2=p1呢????回答:這樣是做不到刪除某個結點的。因為p1,p2都是結構體型別指標,p1,p2分別指向不同結點的地址,一旦執行p2=p1,是可以將p1結點中的p1.next成員儲存的地址賦給p2,但是,這樣做的同時,也會把p1所指向的結點的所有資料(包括指向下一個結點的地址)也同時賦給了p2指向的結點。這樣就會使得p2原先指向的結點的資料就會被覆蓋掉。直接用p2=p1就等於刪除結點的同時又改變了原連結串列結點的資料,所以這樣做是不合理的。
我大概看懂你的意思了。head是頭指標,p1是指向第一個結點的指標,p2是指向p1前一個結點的指標。如果你給出的程式的是這個意思的話,那下面我就可以解釋了。首先對單向連結串列的刪除要考慮以下4種情況:1.連結串列本身是空的2.刪除的是連結串列的首結點3.刪除的是連結串列的中間結點或是連結串列的尾結點4.要刪除的結點在原連結串列中找不到對你的程式的解釋:(每個結點包含兩個部分:資料和指向下一個結點的指標) if(p1==head) //首先要明白p1是待刪除的結點,如果要刪除的結點是首結點// head=head->next;//將首結點中指向下一結點的指標重新賦給head,這樣首結點就脫離原連結串列了// else { p2->next=p1->next;//這是什麼意思??? free(p1); (回答:這句話是用來刪除結點在連結串列的中部或尾部的情況的。p1是要刪除 的結點,p2是要刪除的結點p1的前一個結點,p1->next儲存的是下一個 結點(p1+1)地址。將結點p1中的成員p1.next記憶體儲的地址賦給p2->next 這樣也就相當於使得p2結點中的p2->next成員存放的也是(p1+1)結點的 地址,這樣p2就能指向連結串列中(p1+1)結點了,也就是相當於p1結點脫離了 連結串列,所以我們可以說p1結點被刪除了) }提問:為什麼不直接用p2=p1呢????回答:這樣是做不到刪除某個結點的。因為p1,p2都是結構體型別指標,p1,p2分別指向不同結點的地址,一旦執行p2=p1,是可以將p1結點中的p1.next成員儲存的地址賦給p2,但是,這樣做的同時,也會把p1所指向的結點的所有資料(包括指向下一個結點的地址)也同時賦給了p2指向的結點。這樣就會使得p2原先指向的結點的資料就會被覆蓋掉。直接用p2=p1就等於刪除結點的同時又改變了原連結串列結點的資料,所以這樣做是不合理的。