0

リンクされたリストを試していましたが、何らかの理由で本来の動作をしていません。1 を選択した後に数量を入力すると、ノードが既存のリストに追加されるまでは問題ありません。その後、数量は奇妙な数字の文字列になります。また、寄付リストに複数のノードを追加しようとすると、プログラムがクラッシュします。

編集: 上記の問題は解決されましたが、言及するのを忘れていた別の問題があります。リストを印刷しようとすると、何も印刷されません。4を選ぶとこうなります。

EDIT2: 印刷機能は最初のノードのみを印刷し、その後は何も印刷しません。助けてください。

これがコードです。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct donation{
    char name[50];
    int quant;
    struct donation* next;
}donate;


donate* addItem(donate *mylist,donate *temp){
    donate *front=(donate*)malloc(sizeof(donate*));

    if(mylist==NULL)
    return temp;

    front=mylist;
    while(mylist->next!=NULL)
        mylist=mylist->next;
    mylist->next=temp;

    return front;
}    
void print(donate* donList){

    printf("Printing the Donations Table\n\n");
    if(donList!=NULL){
        while(donList->next!=NULL){
            printf("%s %d\n",donList->name,donList->quant);
            donList=donList->next;
        }
    }
}

main(){

    donate *list=NULL;

    while(1){
        int choice;
        printf("1. Add a donation\n);
        printf("Enter your choice: ");
        scanf("%d",&choice);

        if(choice==1){
            donate* temp=(donate*)malloc(sizeof(donate*));
            printf("\nEnter inventory type: ");
            scanf("%s",temp->name);
            printf("Enter the amount: ");
            scanf("%d",&temp->quant);
            temp->next=NULL;
            list=addItem(list,temp);
            printf("\nDonation Added!\n");
            printf("%s %d\n",list->name,list->quant);
        }
    else if(choice==4){
        print(list);
    }
}

    system("pause");
    return 0;
}

ありがとう!

4

4 に答える 4

2

1つの問題は、寄付ポインター用のスペースを割り当てていることです。構造体自体にスペースを割り当てる必要があります。

donate* temp=(donate*)malloc(sizeof(donate*));

する必要があります

donate* temp= malloc(sizeof(donate));

あなたはmallocを行っているので、アイテムを追加する前に、addItemは次のようにする必要があると思います。

donate* addItem(donate *mylist,donate *temp)
{
    if (mylist != NULL)
       temp->next = mylist;

    return temp;
}

1つのアイテムリストを印刷しないようです。

   printf("Printing the Donations Table\n\n");
    if(donList!=NULL){
        printf("Not NULL!!!!\n");
        while(donList->next!=NULL){
            printf("%s %d\n",donList->name,donList->quant);
            donList=donList->next;
        }
    }

私はそれがすべきだと思います:

printf("Printing the Donations Table\n\n");
if (donList!=NULL)
{
    printf("Not NULL!!!!\n");
    do 
    {
        printf("%s %d\n",donList->name,donList->quant)
        donList=donList->next;
    }
    while(donList != NULL);
}
于 2012-09-24T01:27:19.757 に答える
1

私が見る2つの問題があります。1つ目はScooterさんから指摘された問題です。2 つ目は、 の最初の行でメモリ リークが発生していることですaddItem()

編集2 番目の質問に答えるには、ビルド エラーを修正する必要があります。参照reqListしますmain()が、宣言しないでください。

コードの修正版は次のとおりです。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct donation{
    char name[50];
    int quant;
    struct donation* next;
}donate;


donate* addItem(donate *mylist,donate *temp){
    if(mylist==NULL)
    return temp;

    donate *front=mylist;
    while(mylist->next!=NULL)
        mylist=mylist->next;
    mylist->next=temp;

    return front;
}    

main(){

    donate *list=NULL;

    while(1){
        int choice;
        printf("1. Add a donation\n);
        printf("Enter your choice: ");
        scanf("%d",&choice);

        if(choice==1){
            donate* temp=(donate*)malloc(sizeof(donate));
            printf("\nEnter inventory type: ");
            scanf("%s",temp->name);
            printf("Enter the amount: ");
            scanf("%d",&temp->quant);
            temp->next=NULL;
            list=addItem(list,temp);
            printf("\nDonation Added!\n");
            printf("%s %d\n",list->name,list->quant);
        }
    }
    system("pause");
    return 0;
}
于 2012-09-24T01:36:45.597 に答える
1

efenceまたはvalgrindにリンクされたプログラムを実行してみてください。どちらも、いつどこで問題が発生し始めるかを教えてくれます。

于 2012-09-24T01:22:42.870 に答える
0

ここで修正し donate *front=(donate*)malloc(sizeof(donate*))
てください

donate *front=(donate*)malloc(sizeof(donate))
于 2012-09-24T02:40:25.610 に答える