我尝试使用链接列表的二维数组来实现程序,以存储产品列表及其数量。现在,我只完成了函数添加并显示第一个数组元素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));
}
答案 0 :(得分: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 组织为二维链表。 (编辑:卡拉在评论中解释说)
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
的尺寸更改为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]);
}
}
}