【问题标题】:Creating Linked List of Locations in C在 C 中创建位置的链接列表
【发布时间】:2015-04-19 02:23:00
【问题描述】:

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

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

应该是

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

编辑:正如 cmets 中所述,是的,我是一名学生,但我不是在找人为我工作。我只是想找出可能的逻辑错误,因为如果我能正确填写这个列表,我可以很容易地完成我的项目。这只是一个非常身临其境的项目的一小部分,帮助这个项目只会让我继续这个项目,而不是完成它并把它上交。我只提供了这么多的细节,因为 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 工作正常,因为我将打印语句放入循环打印使用 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(这是一个非常古老的名称)

【问题讨论】:

  • 请避免使用 Skype,以便其他人可以从您在此过程中得到的任何答案中受益。
  • 他们提出这个问题的方式,听起来很像一个学生要求 StackOverflow 为他做作业。如果您的问题更具体,并且其答案可能对他人和您自己都有益,那么您可能会取得更大的成功。
  • 看起来newNode 有内存泄漏。
  • 编译器应该至少对if ( n == 0 ) 部分给出警告。在 C 语言中,您应该使用NULL; 0 在 C++ 中使用(无论出于何种原因,这已成为标准)。
  • @Cubia:那将是 C++。在 C 中,它是 (void *)0。 C++ 用户的常见错误。我总是想知道为什么在 C++ 中改变了这一点。我实际上更喜欢将指针与指针进行比较,而不是整数(是的,我知道 C++ 中是如何定义的)

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


【解决方案1】:

如果我没记错的话,你的问题出在以下代码行:

n->next = next;

你的链表的头是world,但是你的newNode()函数一直把world发送到链表的后面(n->next = nextnext放在后面)。您在这里想要的是附加在链接列表的末尾。

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

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)

【讨论】:

  • 我认为可能有些混乱(很可能是在我这边)。我打算让它发挥作用的方式是“世界”是我的链接列表,我可以在以后映射它以访问它正在存储的各个位置,因此列表与读取方式相反并不重要。我不要相信列表首先添加了任何位置,因为我试图通过访问头部并将列表重新分配给尾部来简单地读取列表,但即使循环成功运行,也没有任何反应。感谢您的帮助!
  • 抱歉发了两篇文章,我意识到程序甚至从未进入 while 循环:while(world != 0){
  • @iF3V3RzXD 头部是变量“世界”对吧?如果是这样,那么我的代码纠正了这个问题。在您当前的代码中,由于您在列表的后面发送“world”,因此当您尝试遍历您的链表时,world->next 将始终为空,因为您从未给它一个值。
  • @iF3V3RzXD 您找到解决问题的方法了吗?
  • world 是我的链表,包含所有位置的节点。对于我的特殊需要,它没有
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
相关资源
最近更新 更多