c-我的双链接列表中的所有内容都变为0

  • 本文关键字:链接 列表 c linked-list
  • 更新时间 :
  • 英文 :


我有一个在unix平台上创建的双链表程序,它只适用于find。我只是把代码复制粘贴到我的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上运行得很好,所以我不认为它的方法,但我不知道是怎么回事

准备方法:

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;
}
}

首先,您似乎有点不一致。如果列表中已经有内容,则将temp->prev设置为l->rear,这样就形成了一个循环的双链接列表。但是,如果列表为空,则添加新元素并将其next/prev设置为NULL,从而使列表成为非圆形的双链表。我假设你想列出一份循环清单。

问题是您没有更新旧的l->前部的prev字段和l->后部的next字段。这应该是你的准备函数:

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位的),那么你会遇到问题。。。将只打印指针的一半。

2个问题:

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

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

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

相关内容

  • 没有找到相关文章

最新更新