[問題] link list 加節點在開頭

看板C_and_CPP作者 (沒有暱稱)時間9年前 (2015/12/03 09:29), 編輯推噓3(3018)
留言21則, 5人參與, 最新討論串1/2 (看更多)
#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

12/03 18:17, , 1F
void addbeg(NODE*& head, int item)
12/03 18:17, 1F

12/03 18:27, , 2F
& 不是c++參考嗎
12/03 18:27, 2F

12/03 18:27, , 3F
你是c的話...就要再改一下了
12/03 18:27, 3F

12/03 18:29, , 4F
摁 我這是看youtube的印度人寫的 可是不知道為啥錯
12/03 18:29, 4F


12/03 18:30, , 6F
他的start是我的head 只不過他的start是全域的
12/03 18:30, 6F

12/03 18:31, , 7F
所以他每次都不用把start傳進函式
12/03 18:31, 7F

12/03 18:44, , 8F
我把要傳進去函式的地方通通改成不用了 就可以
12/03 18:44, 8F

12/03 19:25, , 9F
難到指標不能在函式裡面重新指定?
12/03 19:25, 9F

12/03 20:09, , 10F
C的話此情況要用雙重指標*
12/03 20:09, 10F

12/03 20:10, , 11F
個人認為typedef struct node *NODE 這樣寫比較合適
12/03 20:10, 11F

12/03 20:13, , 12F
youtube裡頭的跟樓上的宣告是一樣的,剛忘記講= =
12/03 20:13, 12F

12/03 20:14, , 13F
以你目前寫法,你等於是以傳值方式將指標複製進addbeg,
12/03 20:14, 13F

12/03 20:14, , 14F
這跟傳個int結果在func裡改不了的原理一樣
12/03 20:14, 14F

12/03 20:15, , 15F
link要雙向的話,應當加一個 node* pre;指向上一個的
12/03 20:15, 15F

12/03 20:20, , 16F
舉例: 將int a用&a傳入func可改a值,但int *b用b傳入是
12/03 20:20, 16F

12/03 20:20, , 17F
改不了b值,因為邏輯上跟int c用c傳入改不了c值一樣
12/03 20:20, 17F

12/03 20:22, , 18F
如果是int *d,你要用func(int **pd)把d用&d的方式傳入
12/03 20:22, 18F

12/03 20:23, , 19F
才能改d值
12/03 20:23, 19F

12/03 22:04, , 20F
了解 謝謝!
12/03 22:04, 20F

12/04 00:42, , 21F
malloc
12/04 00:42, 21F
文章代碼(AID): #1MO0jg1h (C_and_CPP)
文章代碼(AID): #1MO0jg1h (C_and_CPP)