列表被更改而没有命令这样做

时间:2014-05-13 00:58:18

标签: c

我甚至不知道如何标题这个问题,但它遵循以下内容:在我的代码中,我复制了一个队列(在这种情况下,它与链接列表几乎相同)并更改副本,但原来的变化也是如此。我不知道我在哪里改变它,我希望有人可以提供帮助。 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 );

2 个答案:

答案 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;

但是,修改了listtemplist都是指向指向同一对象的指针。

因此...

在while循环结束时,list->headtemp->head都指向队列中的最后一个对象。

要修复此问题......

您可能希望将变量存储到list->head类型的任何类型。