我正在尝试创建一个包含两个参数的节点的单链接列表。每当我使用尾指针将另一个节点排入队列时,头指针都会采用与新节点相同的值。
我确定指针指向相同的内存位置或类似的位置,但是我不确定如何解决此问题。
struct node
{
struct process *p;
struct node *next;
}
struct node* head;
struct node* tail;
void enqueue(struct process* newProcess)
{
struct node *newNode = malloc(sizeof(struct node));
newNode->p = malloc(sizeof(struct process));
newNode->p = newProcess);
if(tail==NULL)
{
head = tail = newNode;
return;
}
tail = tail->next;
tail = newNode;
}
我想使用此功能来创建一个单链表,其头节点指向列表中的第一个元素,尾节点指向列表中的最后一个元素。当前代码导致两个变量都代表最后添加的元素。
答案 0 :(得分:1)
设置tail = tail->next
会将tail设置为null,因为它不是第一次设置,然后在后续调用中立即覆盖tail和head。
答案 1 :(得分:1)
这里有一些问题。首先,要解决您的问题,请将最后两行替换为:
tail = tail->next = newNode;
另外,请考虑以下问题:
tail = tail->next;
tail = newNode;
如果在下一条语句中重新分配相同的变量,那么将变量分配给值有什么意义?您之前也有相同的错误:
newNode->p = malloc(sizeof(struct process));
newNode->p = newProcess;
由于第二行,第一行唯一实现的是内存泄漏。完全删除第一行。