当我想要打印时,链接列表值已更改

时间:2014-03-11 19:18:02

标签: c pointers linked-list abstract-data-type

我想打印我的双链表。这是函数

void show(que *q) {
    que *temp;
    temp = q;

    if (q->cnt == 0)
        printf ("\nEmpty.\n");
    else {
        while (temp->cnt > 0) {
            printf("%d[prioriy=%d]  cnt:%d\n", temp->fr->dat, temp->fr->priority);
            temp->fr = temp->fr->prv;
            temp->cnt--;
        }
    }
}

我将struct element q分配给其他元素temp,只修改temp,但为什么q的值也会改变?例如,q->cnt变为等于零,尽管我没有修改它。

编辑:

typedef int kintyr;

typedef struct qElem {
    struct qElem *prv;          
    kintyr *dat;                    
    int *priority;
} qElem;


typedef struct que {
    qElem *fr, *bk;             
    int cnt;                    
} que;

3 个答案:

答案 0 :(得分:0)

qtemp都是指针,也就是说,它们将地址存储在内存中。通过修改其中一个指向的数据,通过另一个指针检索该数据将反映这些更改,因为它们都指向内存中的相同位置。数据本身只存储在一个地方。

如果要迭代列表,您将需要一个指向节点的临时指针,您将使用本地计数器(而不是修改列表中的计数器)遍历列表:

//Set a temporary node to point to the front of the queue
qElem *temp = q->fr;
//Create a local variable to track where in the queue we are
int cnt = q->cnt;
if(cnt==0)
    printf ("\nEmpty.\n");
else
{
    while(cnt>0)
    {
        printf( "%d[prioriy=%d]  cnt:%d\n", temp->dat, temp->priority );
        //Point to the next node in the queue
        temp = temp->prv;
        //Decrement our local counter
        cnt--;
    }

}

答案 1 :(得分:0)

  1. temp也指向q的记忆,temp-> cnt--的值的变化与q-> cnt相同 -
  2. 最好采用int count = q-> cnt,对计数变量进行操作

答案 2 :(得分:0)

q是内存的地址。你说temp也应该是记忆的地址。这是由于*。当您指定temp = q时,您说temp的地址将与内存中的q的地址相同。如果您希望新的que变更,请在*之前使用temp