C编程:链表



我试图实现一个程序使用链接列表的二维数组,存储产品及其数量的列表。现在,我只做了函数来添加和显示第一个数组元素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("%st%dn",
               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 memoryn");
    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));

}

您至少需要这样的内容:

#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("%st%dn",
                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 memoryn");
        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]中namequantity的所有存储空间。你可以通过修改

来解决这个问题
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组织成一个二维链表。(编辑:卡拉在评论中解释过)

show_all()错误

show_all()

中有两个差1的错误
void show_all()
{
    int i,j;
    for(i=0;i<=3;i++){
        for(j=0;j<=2;j++){
            printf("C:%dA:%dn",i,j);
            show_info(t[i][j]);
        }
    }
}

您已经将t的尺寸更改为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:%dn",i,j);
            show_info(t[i][j]);
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新