2017-11-16 12 views
0

文字列をスタックに挿入すると、それが追加されますが、前の要素も変更されます。新しいノードをリンクリストスタックに追加すると、すべての古いノードが新しいノードに更新されます

void push(linkedList *ll,char *item) { 
node *newNode = malloc(sizeof(node)); 
if (ll->size == 0) { 
    newNode->value = item; 
    newNode->next = NULL; 
    ll->head = newNode; 
    ll->tail = newNode; 
    ll->size++; 
} 
else { 
    newNode->value = item; 
    newNode->next = ll->head; 
    ll->head = newNode; 
    ll->size++; 
} 
} 


int main() { 
linkedList* stack = init(); 
int scan = 1; 
char * p = malloc(sizeof(char) * 5); 
while (scan = 1) { 
    scanf("%1s", p); 
    if (*p >= '0' && *p <= '9') { 
     push(stack, p); 
     print(stack); 
    } 
} 

WINPAUSE; 
} 

出力は次のようなものになります。

挿入を5

インサート7

7 - > 7

、インサート8

8 - > 8 - > 8

答えて

0

あなたは同じポインタたびに追加されます。あなたはそのメモリを一度割り当て、その内容を継続的に置き換えました。リスト内の各ノードには同じポインタ値が保持されているため、リストをトラバースすると、データが有効範囲内にない場合を含め、最新の入力データが返されます。

(多くのオプションの)最も適切な解決策は、これらのもののいずれかを実行するために、おそらくです:あなたのようにアイテム

  • ストアデータをプッシュするとき

    • はそれのために新しいメモリを割り当てることで、データをコピーします(これはあなたの仕事のために適切である場合)char値の代わりに、ポインタ、あなたは一度に1つの文字を保持しているので、
  • +0

    お返事ありがとうございます。私はこれを理解したら、複数の値を格納する予定でした。まだ文字列を渡しながらこれを修正する簡単な方法はありますか? –

    +0

    うん。私が言ったように、データをコピーします。それは 'malloc'が十分なメモリを持っていることを意味し、' memcpy'や 'strcpy'を使って新しい場所にコピーします。 – paddy

    0

    は、それはあなたのノードで同じメモリ位置に常にポインタを格納するため、newNode->value = item、ですppushの外部に予約されており、何度も新しいコンテンツで上書きされます。これを克服するには、コンテンツをコピーするためにnewNode->value = strdup(item)と書いてください。後でそれを解放することを忘れないでください。 strdupが利用できない場合は、newNode->value = malloc(strlen(item)+1);strcpy(newNode->value, item)に簡単に置き換えることができます。

    +0

    ありがとう、これは大きな助けとなりました。 –

    関連する問題