作者anoymouse (沒有暱稱)
看板C_and_CPP
標題[問題] link list 加節點在開頭
時間Thu Dec 3 17:29:11 2015
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data ;
struct node *next;
} NODE;
void addend(NODE*,int);
void addbeg(NODE*,int);
void display(NODE*);
NODE* _getnode();
int main(int argc, char *argv[])
{
int item=100;
NODE* a = _getnode();
NODE* b = _getnode();
NODE* c=_getnode();
a->next=NULL;
b->next=NULL;
c->next=NULL;
printf("a's data:");
scanf("%d",&(a->data));
printf("\nb's data:");
scanf("%d",&(b->data));
printf("\nc's data:");
scanf("%d",&(c->data));
a->next=b;
b->next=c;
display(a);
printf("\n");
addbeg(a,7889);
/*NODE* newnode= _getnode();
newnode->data=7889;
newnode->next=a;
a=newnode;*/
display(a);
//addend(a,500);
//display(a);
system("pause");
return 0;
}
void display(NODE* head)
{
NODE* ptr;
ptr=head;
if(head==NULL)
{
printf("its empty");
return;
}
while(ptr!=NULL)
{
printf("%d\n",ptr->data);
ptr=ptr->next;
}
}
NODE* _getnode()
{
return((NODE*)malloc(sizeof(NODE)) ) ;
}
void addend (NODE* head,int item )
{
NODE* ptr;
ptr=head;
while(ptr->next!=NULL)
{
ptr=ptr->next;
}
NODE* newnode=_getnode();
newnode->data=item;
newnode->next=NULL;
ptr->next=newnode;
}
void addbeg (NODE* head,int item )
{
NODE* newnode= _getnode();
newnode->data=item;
newnode->next=head;
head=newnode;
}
用函式addend 把新節點加到list的尾端可以
但是不能用函式addbeg把新節點加入到list的開頭 執行時跑不出7899
請問哪裡有錯誤? 但如果直接在主程式把新節點放到list開頭就可以 執行時有7899
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.169.176.162
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1449134954.A.06B.html
→ james1022jk: void addbeg(NODE*& head, int item) 12/03 18:17
→ anoymouse: & 不是c++參考嗎 12/03 18:27
→ james1022jk: 你是c的話...就要再改一下了 12/03 18:27
→ anoymouse: 摁 我這是看youtube的印度人寫的 可是不知道為啥錯 12/03 18:29
→ anoymouse: 他的start是我的head 只不過他的start是全域的 12/03 18:30
→ anoymouse: 所以他每次都不用把start傳進函式 12/03 18:31
→ anoymouse: 我把要傳進去函式的地方通通改成不用了 就可以 12/03 18:44
→ anoymouse: 難到指標不能在函式裡面重新指定? 12/03 19:25
推 overhead: C的話此情況要用雙重指標* 12/03 20:09
→ stupid0319: 個人認為typedef struct node *NODE 這樣寫比較合適 12/03 20:10
→ james1022jk: youtube裡頭的跟樓上的宣告是一樣的,剛忘記講= = 12/03 20:13
推 overhead: 以你目前寫法,你等於是以傳值方式將指標複製進addbeg, 12/03 20:14
→ overhead: 這跟傳個int結果在func裡改不了的原理一樣 12/03 20:14
→ stupid0319: link要雙向的話,應當加一個 node* pre;指向上一個的 12/03 20:15
→ overhead: 舉例: 將int a用&a傳入func可改a值,但int *b用b傳入是 12/03 20:20
→ overhead: 改不了b值,因為邏輯上跟int c用c傳入改不了c值一樣 12/03 20:20
→ overhead: 如果是int *d,你要用func(int **pd)把d用&d的方式傳入 12/03 20:22
→ overhead: 才能改d值 12/03 20:23
→ anoymouse: 了解 謝謝! 12/03 22:04
推 IhateOGC: malloc 12/04 00:42