3

製品とその数量のリストを保存するために、リンクされたリストの二次元配列を使用してプログラムを実装しようとしています。今のところ、最初の配列要素 t[0][0] のリストの内容を追加して表示する関数のみを実行しました。商品名と数量を追加するとエラーにはなりませんが、リストを表示しようとしても何も表示されません。間違いを犯しているかどうかを確認できますか?助けてくれてありがとう。

typedef struct object product, *pprod;
struct object{
    char name[100];
    int quantity;
    pprod next;
};

product t[4][3];


int is_empty(pprod p)
{
    if(p == NULL)
        return 1;
    else
        return 0;
}
void show_info(pprod p)
{
    while(p != NULL)
    {
        printf("%s\t%d\n",
               p->name, p->quantity);
        p = p->next;
    } }

void get_data(pprod p)
{
    printf("name: ");
    scanf("%s",p->name);
    printf("quantity: ");
    scanf("%d",&p->quantity);
    p->next = NULL;
}

pprod insert_beginning(pprod p)
{
    pprod new;
    if((new = malloc(sizeof(product))) == NULL)
        printf("Error allocating memory\n");
    else
    {
        get_data(new);
        new->next = p; } p = new;
    return p;
}


int main(int argc, char *argv[]){
    insert_beginning(t[0][0].next);
    show_info(t[0][0].next);
    printf("%d",is_empty(t[0][0].next));


}
4

1 に答える 1

1

少なくとも次のようなものが必要です。

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

typedef struct object product, *pprod;
struct object{
    char name[100];
    int quantity;
    pprod next;
};

product t[4][3];


int is_empty(pprod p)
{
    if(p == NULL)
        return 1;
    else
        return 0;
}
void show_info(pprod p)
{
    while(p != NULL) {
        printf("%s\t%d\n",
                p->name, p->quantity);
        p = p->next;
    }
}

void get_data(pprod p)
{
    printf("name: ");
    scanf("%s",p->name);
    printf("quantity: ");
    scanf("%d",&p->quantity);
    p->next = NULL;
}

pprod insert_beginning(pprod *p)
{
    pprod new;
    if ((new = malloc(sizeof(product))) == NULL) {
        printf("Error allocating memory\n");
        assert(0);
    } else {
        get_data(new);
        new->next = *p;
        *p = new;
    }
    return *p;
}


int main(int argc, char *argv[])
{
    insert_beginning(&t[0][0].next);
    show_info(t[0][0].next);
    printf("%d",is_empty(t[0][0].next));
    return 0;
}

しかし、これは明らかに t[0][0]の名前数量のすべてのストレージ スペースを浪費します。変更することで修正できます

product t[4][3];

pprod t[4][3];

int main(int argc, char *argv[])
{
        insert_beginning(&t[0][0].next);
        show_info(t[0][0].next);
        printf("%d",is_empty(t[0][0].next));
        return 0;
}

int main(int argc, char *argv[])
{
        insert_beginning(&t[0][0]);
        show_info(t[0][0]);
        printf("%d",is_empty(t[0][0]));
        return 0;
}

また、 tを 2 次元のリンク リストとして整理する理由もわかりません。(編集:カーラはコメントでそれを説明しました)

show_all() のエラー

で 2 オフ バイ 1 エラーがありましたshow_all()

void show_all()
{
    int i,j;
    for(i=0;i<=3;i++){
        for(j=0;j<=2;j++){
            printf("C:%dA:%d\n",i,j);
            show_info(t[i][j]);
        }
    }
}

の寸法を に変更したtので、代わりに and にt[3][2]する必要がi = 0; i < 3; i++ありj = 0; j < 2; j++ます。C プログラマーが通常これを処理する方法は次のとおりです。

#define ARRAY_SIZE(a) (sizeof((a))/sizeof((a)[0]))

void show_all()
{
    int i,j;
    for(i=0;i<ARRAY_SIZE(t);i++){
        for(j=0;j<ARRAY_SIZE(t[0]);j++){
            printf("C:%dA:%d\n",i,j);
            show_info(t[i][j]);
        }
    }
}
于 2013-05-24T20:50:51.407 に答える