2017-04-21 16 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

機能挿入時に編集するには、ヘッドポインタの参照を渡す必要があります。 は多分のような:それは多分仕事

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; 
    } 
} 

に挿入(&ヘッド、V)と機能のインサートが変化!ここ

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は整数へのポインタです。 私は整数に十分なメモリを割り当てます。 iのメモリアドレスが0XAAAAにあるとします。 メモリ割り当てアドレスは0XBBBBです。 iの値は0XBBBBです。 ここで覚えておくべき重要なことがあります。 変数iはローカル変数です。したがって、スタックメモリに常駐します。 この機能が終了すると、スタックメモリが消去されるはずです。 ただし、0XBBBBはヒープメモリにあります。したがって、関数の終わりには一掃されません。

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

ライン#5 この行はアドレス0XBBBB 10000の値を格納するために0XBBBBを間接参照します。

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

ライン#6 次に、フィナーレ、*(0XFFFF)= 0XBBBB。 0XFFFFの値がNULLでした。 しかし今は0XBBBBです。

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

再び、0XBBBBに格納された値は10000です。

行#7 ここで、pi1の値はもはやNULLではなく、intのメモリアドレスを持ちます。 これは、このメモリアドレスの値を10000という値で参照している*(0XBBBB)と同じです。

もう一度、ソリューションのBing Nguyenに感謝します。 この説明が少し良い理解を与えることを願っています。

関連する問題