在C中创建链接的位置列表

时间:2015-04-19 02:23:00

标签: c dictionary linked-list nodes game-engine

FIX:我没有将这些位置保存回世界,所以我只是泄露了这些信息。感谢Skeeto。

while(!feof(fp)){
    loc = readLocation(fp);
    join(loc,world);
    }

实际应该是

while(!feof(fp)){
    loc = readLocation(fp);
    world = join(loc,world);
    }
编辑:正如评论中所提到的,是的,我是学生,但我并不是在寻找有人为我工作。我只是想找到可能的逻辑错误,因为如果我能正确填写这个列表,我可以很容易地完成我的项目。这只是一个非常沉浸式项目的一小部分,帮助这只会让我继续项目,而不是完成它并将其打开。我只提供了如此多的细节因为1)我以前从未在这里发布过所以没有更好的了解,2)希望读者理解这方面的工作,以帮助他们协助我。此外,对于skype的任何问题,如果最终得到成功的帮助,我会提供上面的修复'编辑'以及为stackoverflow用户提供帮助。

TLDR:是的,我是学生,不,我不想让别人做我的项目。这只是一小部分,只允许我继续,而不是完成。如果通过Skype提供帮助,我会用修复程序更新这篇文章,并记下帮助者。

您好,感谢您提前提供任何帮助。

我正在尝试创建一个包含Location *类型对象的链接列表。 我将位置定义为

typedef struct location{
char *name;
char *longer;
char *shorter;
char *north;
char *south;
char *east;
char *west;
char *logic;
int visited;
char *items[20];
} Location;

此外,我可以成功读取位置的所有值并显示所有属性,这不是问题。

在'引擎'在我的游戏(主要)中,我尝试将所有位置读入列表,如下所示(我确定readLocation正常工作,因为我将一个print语句放入循环中,使用以下方法打印位置名称loc变量)

world = 0;
FILE *fp = fopen("world.in","r");
char *garb = readToken(fp);
free(garb); //garbage token at begging of world.in just to check file exists
int count = 0; //used later, ignore for now
while(!feof(fp)){
    loc = readLocation(fp);
    join(loc,world);
    }

world是声明为Node *的全局变量,并初始化为0(我想我需要这样做但不确定)

在olist.h中,我将节点结构创建为

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

并且在olist.c中,这是我构建节点以及加入节点的方式

//place is the attribute of the Node that holds the location and next points to the next Node in the list
Node *newNode(Location *loc,Node *next)
    {
    Node *n = malloc(sizeof(Node));
    if (n == 0)
        {
        fprintf(stderr,"newNode: out of memory!\n");
        exit(1);
        }
    n->place = loc;
    n->next = next;
    return n;
    }

//s is the location i wish to join to the list and rest is list I'm joining to
Node *join(void *s,Node *rest)
    {
    return newNode(s,rest);
    }

不幸的是,在成功阅读所有地点后,世界仍然是一个空列表。感谢您的帮助,我很乐意通过此论坛或Skype提供更多信息:F3V3Rz_MoDz(这是一个非常古老的名字)

1 个答案:

答案 0 :(得分:0)

如果我没有弄错的话,您的问题出现在以下代码行中:

n->next = next;

您的链接列表的头部是world,但您的newNode()函数会将world发送到列表的后面(n->next = next位置next位于后面)。你想要的是在链表的末尾添加。

以下是可用于执行此操作的代码示例:

Node *lastNode = next;
while (lastNode->next != NULL)
    lastNode = lastNode->next;

lastNode->next = n;

基本上,您遍历链接列表直到结束,然后追加新创建的节点。

编辑: 您遇到的问题是world变量位于链接列表的末尾。每次拨打join()时,您都会在列表后面按world。这是您的列表的代表:

在加入()之前:

world -> null

加入()之后:

newnode -> world -> null

因此,每次尝试迭代列表时,world都不会看到他之前新创建的节点。

我的解决方案执行以下操作:

world -> newnode -> null

这基本上保留了您的world变量。所以你不必做world = join(loc, world)