我的双链表中的所有内容都变为0

时间:2015-11-21 14:21:04

标签: c linked-list

我有一个在unix平台上创建的双链表的程序,它只是找到了。我只是将代码粘贴到我的mac上的eclipse中。由于一些奇怪的原因,代码运行正常,但无论何时添加或删除或执行任何操作列表,它总是显示所有索引为0.

int main()
{
    list l = create_list();
    prepend (&l, (void*)1);
    prepend (&l, (void*)2);
    prepend (&l, (void*)55);
return 0;
}

void display_list(list l)
{
int i;
for(i=0;i<size(l);i++)
{
printf("Index [%d]: ",i);
printf("%d",get(l,i));
printf("\n");
}

}

它会打印出来

Index [0]: 0
Index [1]: 0
Index [2]: 0

它在unix上运行正常,所以我不认为它的方法,但我不知道它是怎么回事

prepend方法:

int prepend (list* l, void* item)
{
 int result = 0;
 if (l !=NULL)
 {
 node* temp = malloc(sizeof(node));
 if (temp != NULL)
 {
 result = 1;
 temp -> item = item;
 if (l-> front == NULL)
 {
 temp -> next = NULL;
 temp -> prev = NULL;
 l -> front = temp;
 l -> rear = temp;
 }
 else
 {
   temp -> next = l -> front;
   temp -> prev = l -> rear;
    l -> front= temp;
 }
 l -> size++;
 }
}
return result;
}

获取方法:

void* get (list l, int location)
{
void* item =NULL;
if(1<=location && location<+ size(l))
{
node* temp = l.front;
int i;
for(i=1;i<location; i++)
 temp = temp -> next;
 item= temp -> item;
}
}

2 个答案:

答案 0 :(得分:0)

首先,你似乎有些不一致。如果列表中已有某些内容,则将temp-&gt; prev设置为l-&gt;后面,这将形成一个循环的双向链表。但是如果列表为空,则添加新元素并将其下一个/ prev设置为NULL,从而使列表成为非循环的双向链表。我假设您想要制作一份循环清单。

问题是你没有更新旧l-&gt;前面的prev字段和l-&gt;后面的下一个字段。这应该是你的前置函数:

int prepend (list* l, void* item)
{
  int result = 0;
  if (l !=NULL)
  {
    node* temp = malloc(sizeof(node));
    if (temp != NULL)
    {
      result = 1;
      temp -> item = item;
      if (l-> front == NULL)
      {
        temp -> next = temp;
        temp -> prev = temp;
        l -> front = temp;
        l -> rear = temp;
      }
      else
      {
        l -> front -> prev = temp;
        l -> rear -> next = temp;
        temp -> next = l -> front;
        temp -> prev = l -> rear;
        l -> front= temp;
      }
      l -> size++;
    }
  }
  return result;
}

如果你想制作一个非循环列表,那么这就是你的代码:

int prepend (list* l, void* item)
{
  int result = 0;
  if (l !=NULL)
  {
    node* temp = malloc(sizeof(node));
    if (temp != NULL)
    {
      result = 1;
      temp -> item = item;
      if (l-> front == NULL)
      {
        temp -> next = NULL;
        temp -> prev = NULL;
        l -> front = temp;
        l -> rear = temp;
      }
      else
      {
        l -> front -> prev = temp;
        temp -> next = l -> front;
        temp -> prev = NULL;
        l -> front= temp;
      }
      l -> size++;
    }
  }
  return result;
}

此外,对您的问题的评论也适用:我认为get(l,i)将返回item字段,这是一个指针。如果您的平台是64位但您尝试将指针打印为int(可能是32位),那么您将遇到问题...只会打印一半指针。

答案 1 :(得分:0)

2个问题:

get()被定义为返回void *,但没有return语句,因此实际返回值是函数返回位置的堆栈中的任何数据。

您正在使用%d打印空格*。 %d假定为32位整数。 void *在x86上是32位,在x86-64上是64位,所以当你尝试在x86-64上打印它时,%d只查看上半部分,最重要的32位,我猜测它可能都是零。

所以要修复它,修复get的返回类型返回int(并实际返回一些东西),或者将printf更改为使用%p,这表示要打印的数据是指针。