C - 包含链表的数组
C - Array containing Linked Lists
我认为这个问题现在已经以多种方式得到了解答,但我仍然很困惑,我正在用指针做一些奇怪的事情,所以我非常感谢你的帮助。
我想创建一个包含链接列表的数组(未知大小)。
我认为主要问题是我在这种情况下使用指针。
请看:
int x_format;
int y_format;
typedef struct{
int id;
struct item_node *next;
union{
struct{
int freq
} Sound;
struct{
float reduce;
} Obstacle;
} data;
}item_node;
item_node *buffer;
item_node **room;
item_node **room_new;
void createRoom(int x, int y)
{
buffer = malloc(sizeof(item_node)*x*y);
room = malloc(sizeof(item_node *)*y);
for(int i = 0; i<y; i++)
room[i] = &buffer[i*x];
for(int j = 0; j<x; ++j)
{
for(int k = 0; k<y; ++k)
{
room[j][k].next = NULL;
}
}
}
item_node createItem (int x, int y, int id)
{
item_node selected = room[x][y];
//Error
if(selected == NULL)
selected = malloc(sizeof(item_node));
else{
while(selected->next != NULL)
selected = selected->next;
selected->next = malloc(sizeof(item_node));
selected = selected->next;
}
selected->id = id;
selected->next = NULL;
return selected;
}
int main (int argc, char *argv[])
{
x_format = 100;
y_format = 100;
createRoom(x_format,y_format);
item_node itemtest = createItem(1,1,0);
free(room);
free(buffer);
}
所以出现的问题是:
error: invalid operands to binary expression ('item_node' and 'void *') if(selected == NULL)
我明白这个错误,但我现在不知道如何解决这个问题。
抱歉,如果这个问题太琐碎了,我感谢您的帮助!
谢谢。
我很确定您的 item_node 数据类型不是指针,而是结构。但是,在突出显示的行中,您将这种结构的范例与 void 指针进行了比较(稍后再做其他事情),这是一个错误。显然,意图如下:
1) item_node* createItem (int x, int y, int id)
2) item_node* selected = room[x][y];
正题,问题就在这里:
item_node createItem (int x, int y, int id){
item_node selected = room[x][y];
//Error
if(selected == NULL)
selected = malloc(sizeof(item_node));
在你的例子中 item_node selected 是一个变量,而不是指针。您将 selected 声明为 item_node 的变量,这是一个结构。这里没有指针。
然后您将某种类型的变量与 NULL 进行比较(在普通 C 中定义为 (void*) 0)。
题外话:
不过,整个程序乍一看似乎存在缺陷。请修改算法和数据结构,在我看来你有点随意混合指针和数组。
我认为这个问题现在已经以多种方式得到了解答,但我仍然很困惑,我正在用指针做一些奇怪的事情,所以我非常感谢你的帮助。 我想创建一个包含链接列表的数组(未知大小)。 我认为主要问题是我在这种情况下使用指针。 请看:
int x_format;
int y_format;
typedef struct{
int id;
struct item_node *next;
union{
struct{
int freq
} Sound;
struct{
float reduce;
} Obstacle;
} data;
}item_node;
item_node *buffer;
item_node **room;
item_node **room_new;
void createRoom(int x, int y)
{
buffer = malloc(sizeof(item_node)*x*y);
room = malloc(sizeof(item_node *)*y);
for(int i = 0; i<y; i++)
room[i] = &buffer[i*x];
for(int j = 0; j<x; ++j)
{
for(int k = 0; k<y; ++k)
{
room[j][k].next = NULL;
}
}
}
item_node createItem (int x, int y, int id)
{
item_node selected = room[x][y];
//Error
if(selected == NULL)
selected = malloc(sizeof(item_node));
else{
while(selected->next != NULL)
selected = selected->next;
selected->next = malloc(sizeof(item_node));
selected = selected->next;
}
selected->id = id;
selected->next = NULL;
return selected;
}
int main (int argc, char *argv[])
{
x_format = 100;
y_format = 100;
createRoom(x_format,y_format);
item_node itemtest = createItem(1,1,0);
free(room);
free(buffer);
}
所以出现的问题是:
error: invalid operands to binary expression ('item_node' and 'void *') if(selected == NULL)
我明白这个错误,但我现在不知道如何解决这个问题。 抱歉,如果这个问题太琐碎了,我感谢您的帮助! 谢谢。
我很确定您的 item_node 数据类型不是指针,而是结构。但是,在突出显示的行中,您将这种结构的范例与 void 指针进行了比较(稍后再做其他事情),这是一个错误。显然,意图如下:
1) item_node* createItem (int x, int y, int id)
2) item_node* selected = room[x][y];
正题,问题就在这里:
item_node createItem (int x, int y, int id){
item_node selected = room[x][y];
//Error
if(selected == NULL)
selected = malloc(sizeof(item_node));
在你的例子中 item_node selected 是一个变量,而不是指针。您将 selected 声明为 item_node 的变量,这是一个结构。这里没有指针。 然后您将某种类型的变量与 NULL 进行比较(在普通 C 中定义为 (void*) 0)。
题外话: 不过,整个程序乍一看似乎存在缺陷。请修改算法和数据结构,在我看来你有点随意混合指针和数组。