C中链表的逻辑错误

时间:2012-09-07 05:04:46

标签: c list linked-list

#include <stdio.h>
#include <stdlib.h>
#define UINT unsigned int

struct item
{
UINT   time ;           // time in tics which is used to order the list.
UINT   id ;             // penguin id number.
UINT   event ;          // event this item describes.
struct item  *next ;    // pointer to next item in list.
};

struct item *head=NULL;
struct item *trail=NULL;


void link_list(UINT time, UINT id, UINT event)
{
struct item *t=NULL;
static int i=0;
if(i==0)
{
    head->time=time;
    head->id=id;
    head->event=event;
    trail=head;
    trail->next=NULL;
    i++;
    printf("Hello Word\n");
}
t=malloc(sizeof(struct item));
trail->next=t;
trail->time=time;
trail->id=id;
trail->event=event;
trail=t;
trail->next=NULL;
if(i!=0)
    printf("I am \n");

}

int main(int argc, char *argv[])
{
UINT x[3]={4,5,7}, y[3]={40,50,60}, z[3]={100,900,500};
int i=0;
head=malloc(sizeof(struct item));

trail=head;
link_list(x[0], y[0], z[0]);
link_list(x[1], y[1], z[1]);
link_list(x[2], y[2], z[2]);


struct item *f=NULL;
f=head;
do
{
    printf("trail: %d %d %d\n", f->time, f->id, f->event);
    f=f->next;
}
while(f!=NULL);

return 0;
}  

美好的一天,

我目前在逻辑上对链接列表的代码实现存在逻辑问题。这段代码是我用来将它集成到一个更大的程序中的框架,它将使用链表,所以我需要做到这一点。

基本上发生的事情是当我最终到达do while循环时,我将其用作调试行来查看链表的内容,我将在命令行中获得此输出:

追踪:4 40 100

追踪:5 50 900

追踪:7 60 500

trail:0 0 0

我期待输出如下:

追踪:4 40 100

追踪:5 50 900

追踪:7 60 500

我已经在我的代码中排除了其他printf,因为它们只是用于检查我是否确实正确地完成了我的功能。这也许是无关的,但在linux下是否有更好的c调试器?因为内置调试器在进入malloc命令时会发疯,所以我必须调试我脑子里的所有程序。 :(

2 个答案:

答案 0 :(得分:1)

如果内置调试器是指gdb,你可以告诉它跳过malloc();但是,如果您的程序在malloc中崩溃,则会遇到内存分配或在程序中使用错误。

一个明显的错误是你没有在link_list()中正确初始化“t”,特别是t-&gt;接下来是垃圾,你的程序在尝试跟随它时可能会崩溃。我认为你的意思是设置t-&gt; time,t-&gt; id等,而不是trail-&gt; time。

附加到链表的最佳方法通常是使用一个单独的函数返回一个新的列表项,其中所有字段都已初始化,然后在例程中追加,只需操作指针即可。如果您的列表头只是一个指针而不是结构,它也会有所帮助,但这是一个样式问题。

最重要的是使用为您提供链接列表的库,但如果您正在了解链接列表,那就没有用了!

答案 1 :(得分:1)

您将新节点附加到尾部,然后将您的数据写入尾节点,然后将尾指针移动到新节点:

t=malloc(sizeof(struct item));
trail->next=t;
trail->time=time;
trail->id=id;
trail->event=event;
trail=t;
trail->next=NULL;

t设置为新节点。 当前列表尾部的下一个指针设置为指向t 写入尾部指向的节点的时间,id和事件字段。 尾部引用现在移动到t,它仍然不包含任何数据。

有很多东西可以改进这个代码,从使用模块化设计开始“列表”管理开始,但这是你的直接问题。