我有一个在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,这表示要打印的数据是一个指针。