gpt4 book ai didi

c - 访问存储在链表中的结构的属性

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:28 26 4
gpt4 key购买 nike

我正在尝试在链表中查找特定位置,然后能够访问其属性。我知道如何对链接列表进行排序,但我不知道如何访问 Locations 的名称属性。

我将 Location * 结构定义为(这些位置稍后存储到列表中):

#ifndef NESW_STRUCT
#define NESW_STRUCT
typedef struct location{
char *name;
char *longer;
char *shorter;
char *tip;
char *north;
char *south;
char *east;
char *west;
char *logic;
int visited;
char *items[20];
} Location;
#endif

我的导师为我们提供了一个模块来创建链表以及各种操作列表的函数。链表由 Node * 组成,我相信它包含 Locations 并指向列表中的下一个节点。

typedef struct node
{
Location *loc;
struct node *next;
} Node;

所以在我的游戏循环中,我创建了一个全局变量“world”,这是我的(我认为)位置的链接列表:

Node *world;

extern Node* world;

在其他也访问它的模块中。

然后我在我的 main 中运行一个简单的 while 循环,创建一个 Location 结构,然后将它连接到链接列表(从这篇文章中排除),world,使用 join(location,world) 和我的讲师提供的以下功能,由我修改以使用 Locations 而不是 void 对象。在加入第一个位置之前我没有将世界初始化为任何东西,我想我可能需要这样做,但是由于它是一个核心转储并且无论哪种方式都会崩溃,我无法判断它是否有所作为/是否有必要:

Node *
newNode(Location *place,Node *next)
{
Node *n = malloc(sizeof(Node));
if (n == 0)
{
fprintf(stderr,"newNode: out of memory!\n");
exit(1);
}
n->loc = place;
n->next = next;
return n;
}

Node *
join(Location *s,Node *rest)
{
return newNode(s,rest);
}

到目前为止一切正常,我成功创建了列表。然而,在我的程序的其他地方,我创建了一个函数,该函数通过世界列表进行映射,并找到与我传递给该函数的任何名称具有匹配名称的位置,从逻辑上讲,它可以正常工作。我创建了一个等于“world”的临时列表,然后将列表头部的名称属性与我正在寻找的位置的名称进行比较,使用 strcmp,如果匹配则返回该位置,并设置列表= 到列表的尾部,如果没有。

Head 和 Tail 在这里定义,在我的讲师的模块中再次提供:

Location *
head(Node *items)
{
return items->loc;
}

Node *
tail(Node *items)
{
return items->next;
}

如果我正确理解这些函数,使用 head(list) 应该返回一个 Location 吧,而不是一个指针?那么我应该可以只使用“location->name”来访问名称吗?显然不是……

为了节省运行所有游戏逻辑的时间,只需到达需要比较名称的部分,我尝试编写一些类似于映射函数中的临时代码,以测试从列出然后访问属性。

我用来尝试和测试访问列表的可能错误的代码是:

Location *test = 0; //creating an empty location, (not sure if it needs to be initialized to 0 before assigning the desired value but I think I remember a mention of that during class)
test = head(world); //I would like to believe this sets test equal to the location of the head of the list world, but I am fairly certain this is where my error occurs because what is getting assigned to test really isn't a location
printf("%s",test->name); //basic print of the name attribute, I know this works logically because I use it elsewhere when dealing with locations not accessed through world, however this is what causes the core dump because I think I'm trying to access a garbage value so to speak

程序编译没有错误,并根据我添加的调试打印语句成功读取了所有位置。非常欢迎任何帮助、建议或提示。我知道人们讨厌在这里发帖的 child ,因为他们认为他们正在努力免费完成他们的工作,但这只是沉浸式项目的一小部分,一旦我弄清楚这一点,游戏基本上就完成了,而不是内容。我正处于一个小障碍,这是一个主要的抑制因素,我已经尝试了我 friend 和我能想到的一切,甚至刚刚开始更改 Node 结构和 join/newNode 函数以及 Location 结构中的随机数据类型,希望要么走运或通过出现的不同错误消息找出解决方案,但正如您所猜到的,运气不佳。

最佳答案

OP 的解决方案。

因为每个新项目都加入到列表的前面,所以读入的最后一个节点(这是遍历列表时读取的第一个节点,因为列表是向后填充的)是空指针。

例子:因为使用的join函数存储了一个指向Location的指针,然后指向链表中的下一个Node,所以读入后链表反转。

假设您想将 alpha、bravo、charlie、delta epsilon 读取到列表中,并按此顺序读取它们,内存中的列表看起来像这样,null 是列表中的头部:

null<-epsilon<-delta<-charlie<-bravo<-alpha

因此,当我尝试使用

进行打印时
Node *spot = world;
Location *loc = 0;
loc = head(spot);
printf("%s",loc->name);

我正在尝试打印位置的名称,它实际上只是一个空指针并且显然不存在......所以一个非常简单的解决方法是在实际使用任何节点之前将 spot 设置为等于尾部在列表中。

Node *spot = world;
Location *loc = 0;
spot = tail(spot);
loc = head(spot);
printf("%s",loc->name);

关于c - 访问存储在链表中的结构的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29729013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com