2012-03-28 14 views
0

リンクリストの最後にノードを追加しようとしています。私はvoid関数を使用し、それに私の構造体を渡しますが、一度それはadd関数を実行した後、私の構造体はまだ空です。ここにコードがあります。リンクリストの最後にノードを追加する

struct part { 
    char* name; 
    float price; 
    int quantity; 
    struct part *next; 
}; 

typedef struct part partType; 

void addEnd(partType *item) 
{ 
    partType *temp1=NULL, *temp2=NULL; 
    char temp[100]; 

    temp1=(struct part *)malloc(sizeof(partType)); 

    if (!temp1) 
    printf("malloc failed\n"); 

    temp1->name = malloc(sizeof(char)*100); 

    printf("Please enter item name: \n"); 
    fgets(temp, 100, stdin);  
    strcpy(temp1->name, temp);  


    printf("Please enter item price: \n"); 
    fgets(temp, 100, stdin); 
    sscanf(temp, "%f", &temp1->price);  


    printf("Please enter item quantity: \n"); 
    fgets(temp, 100, stdin); 
    sscanf(temp, "%d", &temp1->quantity); 

    // Copying the Head location into another node. 
    temp2=item; 

    if(item == NULL) 
    { 
    // If List is empty we create First Node. 
    item=temp1; 
    item->next=NULL; 
    printf("%s%.2f\n%d\n", item->name, item->price, item->quantity); 
    } 
    else 
    { 
    // Traverse down to end of the list. 
    while(temp2->next != NULL) 
     temp2=temp2->next; 

    // Append at the end of the list. 
    temp1->next=NULL; 
    temp2->next=temp1; 
    printf("%s%.2f\n%d\n", item->name, item->price, item->quantity); 
    } 

} 

項目は、それが最初に関数に渡されたときはnullですが、いくつかの理由のために私がTEMP1に等しい項目を設定し、if文を持っているにもかかわらず、ヌル出てきます。

+0

としてこれを呼ぶだろうデバッガ?これは、変数がどのように変化しているのか、プログラムがコントロール構造(if文とループif)をどのように流れるのかを確認するのに最適な方法です。 IDEのビルトインビジュアルデバッグツールを使用するか、コマンドラインからGDBを使用してください。 – Cam

答えて

2

あなたはポインタの値を変更する必要があるので、あなたは余分な間接レベル必要があります:あなたがこのステップスルーしようとしている

void addEnd(partType **item) 
{ 
    ... 
    temp2 = *item; 
    ... 
    if (*item == NULL) 
    { 
    *item = temp1; 
    (*item)->next = NULL; 
    printf("%s%.2f\n%d\n", (*item)->name, (*item)->price, (*item)->quantity); 
    ... 
} 

を、あなたが

partType *newItem; 
... 
addEnd(&newItem); 
+0

ok私はそれが問題かもしれないと思った。私はそれを試み、報告する。 –

+0

エラーが発生しました "構造体ではないもののメンバーnext 'の要求" * item-> next = NULL; –

+0

'* item-> next'または'(* item) - > next'?これらのカッコはオプションではありません。 –

2

itemNULLある場合は、関数を呼び出すとき、また関数の後NULLことにバインドされています。 Cは参照パラメータを知らないので、ポインタによって "シミュレート"されます。関数内のポインタを変更したい場合は、ポインタへのポインタが必要です。

0

この機能の呼び出し方法を実際には示していないので、これは推測に過ぎません。私はあなたがNULLに設定された型の部分の項目の項目と呼ばれるポインタを持っていると仮定しています。その変数でこの関数を呼び出します。これは実際にその型のポインタへのポインタを意味するものではありません。現在NULLを指しているその関数呼び出しを実行すると、そのポインタ変数のローカルコピーが作成されます。そのアイテムポインタのローカルコピーをtempに設定すると、そのローカルコピーは関数の最後に失われます。

関連する問題