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