我想打印我的双链表。下面是函数
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:%dn", temp->fr->dat, temp->fr->priority);
temp->fr = temp->fr->prv;
temp->cnt--;
}
}
}
我把结构元素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;
q
和temp
都是指针,也就是说,它们在内存中存储地址。通过修改其中一个指针指向的数据,通过另一个指针检索该数据将反映这些更改,因为它们都指向内存中的相同位置。数据本身只存储在一个地方。
如果你想遍历列表,你需要一个指向节点的临时指针,你将使用一个本地计数器遍历列表(而不是修改列表中的计数器):
//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:%dn", temp->dat, temp->priority );
//Point to the next node in the queue
temp = temp->prv;
//Decrement our local counter
cnt--;
}
}
- temp也指向内存中的q,改变temp->cnt——的值与q->cnt—— 相同
- 最好使用int count = q->cnt,操作count变量
q
是一个内存地址。你说temp
也应该是内存地址。这是由于*
。当你给temp = q
赋值时,你说temp
的地址应该和q
在内存中的地址相同。如果你想要一个新的que
变量,不要在temp
之前使用*
。