2017-04-21 34 views
-4
#include <stdio.h> 
#include <stdlib.h> 

typedef struct lista { 
    int val; 
    struct lista *next; 
} lista; 

void print(lista *head){ 
    printf("List:"); 
    while(head != NULL){ 
    printf("%d; ", head->val); 
    head = head->next;} 
} 

void insert(lista *p,int v){  
    lista *novo; 
    if(p == NULL){ 
    novo = malloc(sizeof(lista)); 
    novo->val = v; 
    novo->next = NULL; 
    p = novo;} 
    else{ 
    novo =malloc(sizeof(lista)); 
    novo->val = v; 
    novo->next = NULL; 
    p->next = novo; 
    } 
} 

int main() 
{ 
    lista *head=NULL; 
    int v; 
    printf("Write the values u want to put in your list.(write 0 to exit)\n"); 
    while (v != 0){ 
    scanf("%d",&v); 
    insert(head,v);} 
    print(head); 
} 
+0

如果發生錯誤,輸出記錄中將出現一條錯誤消息,請查看。 –

+0

問題是我無法打印列表。我不認爲這是保存價值。 –

+1

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現它所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。 – DyZ

回答

1

您必須通過頭指針的引用來編輯它在函數插入。 也許就像:插入(&頭,V)和功能插入變化

void insert(lista **p,int v){ 
    lista *novo; 
    if(*p == NULL){ 
    novo = malloc(sizeof(lista)); 
    novo->val = v; 
    novo->next = NULL; 
    *p = novo;} 
    else{ 
    lista *head = *p; 
    while(head->next != NULL){ 
     head = head->next; 
    } 
    novo =malloc(sizeof(lista)); 
    novo->val = v; 
    novo->next = NULL; 
    head->next = novo; 
    } 
} 

它也許工作!

0

下面是一個簡單的程序可以解釋其平Ngyuyen提供的代碼:

void 
set_sp1(int **x) //line #3 
{ 
    int *i = malloc(sizeof(int)); //line #4 

    *i = 10000; //line #5 

    *x = i; //line #6 
} 

int 
main(void) 
{ 
    int *pi1 = NULL; //line #1 

    set_sp1(&pi1); //line #2 
    printf("%d\n", *pi1); //line #7 

    return 0; 
} 

這裏是說明:

線#1

PI1是指向整數是初始化爲NULL。 這個說法是什麼意思? 可以說pi1變量佔用0XFFFF的內存地址。 pi1的值當前是一個NULL值。

因爲它是一個指向整數的指針,所以pi1最終需要有一個值,它是一個整數的內存地址。

pi1 
------------ 
| NULL | 
------------ 
0XFFFF 

線#2

該參數被髮送PI1的地址。 所以。在這個例子中,它就像set_sp1(0XFFFF);

線路#3

在收到此參數,類型變爲雙指針,因爲單個指針的地址爲int發送。 x的值是0XFFFF。

 x 
     ------------ 
     | 0XFFFF | 
     ------------ 

線#4

變量i是一個指針,指向一個整數。 我分配一個足夠的內存整數。 可以說我的內存地址在0XAAAA。 內存分配地址是0XBBBB。 i的值是0XBBBB。 這是一件值得記住的重要事情。 變量i是局部變量。所以它將駐留在堆棧內存中。 在此函數結束時,堆棧內存應該被清除。 但是,0XBBBB在堆內存中。所以在函數結束時不會被消除。

  i       a memory for int 
      ------------    ------------ 
      | 0XBBBB |    |   | 
      ------------    ------------ 
      0XAAAA      0XBBBB 

線#5 這一行解引用0XBBBB以存儲在地址0XBBBB值10000。現在

 -------- 
     |10000 | 
     -------- 
     0XBBBB 

線#6 ,壓軸,*(0xFFFF)時= 0XBBBB。 0XFFFF的值爲NULL。 但現在它有0XBBBB。

------------ 
| 0XBBBB | 
------------ 
0XFFFF 

再次,存儲在0XBBBB的值是10000。

line#7 現在pi1的值不再是NULL,它有一個int的內存地址。 這與*(0XBBBB)是相同的,該值是在此存儲器地址處具有值10000的值。

再次感謝Bing Nguyen提供的解決方案。 希望這個解釋能讓人更好的理解。

相關問題