單鏈表定義時要聲明一個頭結點,但是這個頭結點的data域是不使用的,只用其next域,那么這個頭結點和一個普通指針有何區別?浪費了一個data域的空間?我的想法是直接用一個指針作為頭結點,原先的頭結點作為存儲數據的第一個單元。頭結點定義:LinkList h;這個h所指向的是頭結點,按照書本和老師講的規定是不儲存數據,就用到一個next域,現在,我讓這個data域也起作用,儲存數據,h這個指針本身作為頭結點。當頭結點空時原:h->next=NULL;現:h=NULL;插入數據時,原:p=(LNode*)malloc(sizeof(LNode));
p->data=e;h->next=p;現:p=(LNode*)malloc(sizeof(LNode));
p->data=e;h=p;其他操作以此類推。我想問一下我這個想法有沒有問題,想搞清楚,問了老師也沒怎么說清楚,求解。
1 回答

慕神8447489
TA貢獻1780條經驗 獲得超1個贊
如果不用空的header節點的話,要修改頭節點,函數需要傳入header的地址而不是header本身(header此處已經是指針,也就是說要傳入指針的指針)。
比如,
LNode *h, *p;
/* 從第一個節點開始刪除 */
void del_front(Node** header)
{
...
}
p=(LNode*)malloc(sizeof(LNode));
p->data=e;
h=p;
del_front(&h);
在上面這個例子中,你刪除了老的頭結點,那么新的頭結點地址也就變了,也就是說h的值也應該跟著變。要改變指針的值,你只傳入指針h給函數的話是不能修改h的值的(這是值傳入),我們需要通過給函數傳入指向指針的指針才能修改h的值,因此這么做就比較麻煩。
如果是將頭結點作為特殊節點的話,我們即使從第一個節點開始刪除,我們只需要傳入頭結點h給刪除的函數,然后這個函數修改h->next就能解決問題了。所以這么做,維護性應該是要好些的。
添加回答
舉報
0/150
提交
取消