单链表带头结点不带头结点
生活随笔
收集整理的這篇文章主要介紹了
单链表带头结点不带头结点
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)自:http://blog.csdn.net/xlf13872135090/article/details/8857632
?
Node *head; ?//聲明頭結(jié)點(diǎn) 帶頭結(jié)點(diǎn)初始化void InitList(Node **head){
*head=(Node *)malloc( sizeof(Node)); (*head)->next=NULL; } 帶頭結(jié)點(diǎn)尾插入,統(tǒng)一操作 方式一: void CreatList(Node **head){???? Node *r=*head,*s;
???? int a;
???? while(scanf("%d",&a)){
????????? if(a!=0){
?????????????? s=(Node *)malloc(sizeof(Node));
?????????????? s->value=a;
?????????????? r->next=s;
?????????????? r=s;????
????????? }
????????? else{????
?????????????? r->next=NULL;
?????????????? break;????
????????? }
???? }
} 調(diào)用CreatList(&head); 方式二: void CreatList(Node *head){
???? Node *r=head,*s;
? ? ?... //下面的都一樣
} 調(diào)用CreatList(head); ------------------------------------------------------------------------------------------------------ 不帶頭結(jié)點(diǎn)初始化 方式一: void InitList(Node **head){ *head=NULL; } 調(diào)用InitList(&head); 方式二: void InitList(Node *head){ head=NULL; } 調(diào)用InitList(head); 不帶頭結(jié)點(diǎn)尾插入,第一個(gè)節(jié)點(diǎn)與其他節(jié)點(diǎn)分開操作 void CreatList(Node ?**head){
???? Node *p,*t; ? ? ? ? /*p工作指針,t臨時(shí)指針*/
???? int a,i=1;
???? while(scanf("%d",&a)){
????????? if(a!=0){
?????????????? t=(Node *)malloc(sizeof(Node));
?????????????? t->value=a;
?????????????? if(i==1){
??????????????????? *head=t;????
?????????????? }
?????????????? else{
??????????????????? p->next=t;
?????????????? }
?????????????? p=t;
????????? }
????????? else{????
?????????????? p->next=NULL;
?????????????? break;????
????????? }
????????? i++;
???? }
} 調(diào)用CreatList(&head); 一、兩者區(qū)別: 1、不帶頭結(jié)點(diǎn)的單鏈表對(duì)于第一個(gè)節(jié)點(diǎn)的操作與其他節(jié)點(diǎn)不一樣,需要特殊處理,這增加了程序的復(fù)雜性和出現(xiàn)bug的機(jī)會(huì),因此,通常 在單鏈表的開始結(jié)點(diǎn)之前附設(shè)一個(gè)頭結(jié)點(diǎn)。 2、帶頭結(jié)點(diǎn)的單鏈表,初始時(shí)一定返回的是指向頭結(jié)點(diǎn)的地址,所以一定要用二維指針,否則將導(dǎo)致內(nèi)存訪問失敗或異常。 3、帶頭結(jié)點(diǎn)與不帶頭結(jié)點(diǎn)初始化、插入、刪除、輸出操作都不樣,在遍歷輸出鏈表數(shù)據(jù)時(shí),帶頭結(jié)點(diǎn)的判斷條件是while(head->next!=NULL), 而不帶頭結(jié)點(diǎn)是while(head!=NULL),雖然頭指針可以在初始時(shí)設(shè)定,但是如1所述,對(duì)于特殊情況如只有一個(gè)節(jié)點(diǎn)會(huì)出現(xiàn)問題。 二、為什么不帶頭結(jié)點(diǎn)初始化有2種方式,而帶頭結(jié)點(diǎn)只有1種方式呢? 因?yàn)椴粠ь^結(jié)點(diǎn)聲明Node *head 時(shí);C編譯器將其自動(dòng)初始化為NULL,于是根本不需要調(diào)用InitList(head);也即不帶頭結(jié)點(diǎn)的初始化 是個(gè)偽操作。而帶頭結(jié)點(diǎn)的初始化在堆開辟了一段內(nèi)存,需要修改head指針變量指向的地址(即head的值),所以要修改head的值,必須傳保 存head變量的地址(即二維指針)。而直接調(diào)用CreatList(head);相當(dāng)于傳head變量的值,函數(shù)修改的是head的副本,無法真正改變head的值。? 注:這里可以將head指針看成一個(gè)變量(不管它保存的是地址),就比較好理解了。 三(key)、其實(shí)本質(zhì)上還是傳值,傳址的問題,只不過指針本身保存的地址,讓這個(gè)過程變得有點(diǎn)糾結(jié)。在函數(shù)調(diào)用需要修改指針變量的指向(value)時(shí), 應(yīng)該傳遞指針變量的地址(address)。 另外,對(duì)于函數(shù)的形參是指針時(shí),只要該參數(shù)不在左邊(即都是右值操作),二維指針(形參)就可以簡(jiǎn)化為一維指針。如上面帶頭結(jié)點(diǎn)的尾插 簡(jiǎn)化版本。 與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的单链表带头结点不带头结点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS表单设置值
- 下一篇: 硅谷最有名的帮派:如果你不知道PayPa