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

时间:2015-04-19 11:08:46

标签: c data-structures linked-list attributes nodes

我试图在链接列表中找到特定位置,然后能够访问其属性。我知道如何对链表进行排序,但我无法弄清楚如何访问地点的名称属性。

我将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结构,然后将它连接到Linked列表(从这篇文章中排除),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'的临时列表,然后将列表头部的name属性与我正在寻找的位置名称strcmp进行比较,如果匹配则返回该位置,如果没有,则将list =设置为列表的尾部。

此处定义了头部和尾部,我的教师再次在模块中提供:

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

程序编译时没有错误,并根据我添加的调试打印语句成功读取所有位置。我们非常欢迎任何帮助,建议或提示。我知道人们讨厌发布在这里的孩子,因为他们认为他们试图免费完成他们的工作,但这只是沉浸式项目的一小部分,一旦我弄明白,游戏基本上不是内容。我是一个很小的障碍,是一个主要的抑制因素,并尝试了我的朋友和我能想到的一切,甚至刚开始改变Node结构中的随机数据类型和join / newNode函数以及Location struct hoping要么幸运,要么通过发生的不同错误消息找出解决方案,但你可以猜到,没有运气。

1 个答案:

答案 0 :(得分:0)

OP解决方案。

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

示例:因为使用的连接函数存储指向位置的指针,然后指向列表中的下一个节点,所以在读入后列表会反转。

假设您要将alpha,bravo,charlie,delta epsilon读入列表并按顺序读取它们,内存中的列表如下所示,其中null为列表中的头部:

空< -epsilon< -delta< -charlie< -bravo< -alpha

因此当我尝试使用

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

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

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