我甚至不知道如何标题这个问题,但它遵循以下内容:在我的代码中,我复制了一个队列(在这种情况下,它与链接列表几乎相同)并更改副本,但原来的变化也是如此。我不知道我在哪里改变它,我希望有人可以提供帮助。 printf是为了证明我的观点,他们应该一直有相同的输出。
int list(Queue list, int sort )
{
Queue temp = list ;
int s=temp->size ;
int i=0, j, p;
int *sender, *receiver ;
char **sorted ;
char* t ;
if ( list == NULL )
{
puts("NULL") ;
return 0;
}
t=(list->head->item->text);
printf("%s", t );
sorted = malloc((s + 1) * sizeof(char *));
sender = malloc( s * sizeof(int));
receiver = malloc( s * sizeof(int));
while ( i < s )
{
/* It's changing somewhere around here */
sorted[i] = malloc(strlen(temp->head->item->text) + 1);
strncpy( sorted[i] , temp->head->item->text, strlen(temp->head->item->text) + 1 ) ;
sender[i] = temp->head->item->sender ;
receiver[i] = temp->head->item->receiver ;
if (temp->head->next == NULL)
break;
temp->head = temp->head->next ;
i++ ;
}
t=(list->head->item->text);
printf("%s", t );
答案 0 :(得分:0)
Queue temp = list ;
不会重复您的队列。它复制Queue
结构,但该结构不保留队列。相反 - 它保留了指向队列的head
的指针(因为它是一个队列 - 可能也是它的tail
)。复制结构时,head
指针保持不变,这意味着您正在修改相同的节点。
如果要复制队列,则必须遍历所有元素并将其中的每个元素复制到新队列。
答案 1 :(得分:0)
Queue
实际上是struct RealQueue *
之类的typedef。也就是说,它是一个指针。
我们执行:
Queue temp = list;
此时,temp == list
因为它们都是指向同一对象的指针。
然后我们修改temp
:
temp->head = temp->head->next;
但是,也修改了list
。 temp
和list
都是指向指向同一对象的指针。
在while循环结束时,list->head
和temp->head
都指向队列中的最后一个对象。
您可能希望将变量存储到list->head
类型的任何类型。