c-意外遍历链表



我很难弄清楚为什么我的链表不是"访问节点";正确地我的代码似乎落后了一步。访问的节点只有在添加第三个节点后才开始堆叠,而应该在添加第二个节点后堆叠。对我来说,这种逻辑应该起作用是有道理的,因为当第一个节点被创建,第二个节点被初始化为NULL时,while不会命中,也不会打印任何内容。然后创建第二个节点并将其添加到列表的末尾,第三个节点现在为NULL。当我们在这个迭代上循环时,它应该打印自temp->next在第一个节点处不为NULL。

不确定我在这里没有看到什么。我的逻辑哪里错了?


void addToList(waitList** head, char *name, int numBurgers, int numSalads)
{
waitList *new = (waitList*) malloc (sizeof(waitList));
new->name = name;
new->numBurgers = numBurgers;
new-> numSalads = numSalads;
new-> next = NULL;
if(*head == NULL)
{
*head = new;
}
else
{
waitList *temp = *head;
while(temp->next != NULL )
{


printf("Visiting node %s with values %d and %dn", temp->name, temp->numBurgers, temp->numSalads);

temp = temp-> next;
}
temp->next = new;
}
}

我得到的输出:

Enter command: a 3 3 nick
Adding In-restaurant order for "nick": 3 burgers and 3 salads
Enter command: a 4 4 bob
Adding In-restaurant order for "bob": 4 burgers and 4 salads
Enter command: a 6 6 kevin
Adding In-restaurant order for "kevin": 6 burgers and 6 salads
Visiting node nick with values 3 and 3
Enter command: a 9 9 max
Adding In-restaurant order for "max": 9 burgers and 9 salads
Visiting node nick with values 3 and 3
Visiting node bob with values 4 and 4

预期输出:

Enter command: a 3 3 nick
Adding In-restaurant order for "nick": 3 burgers and 3 salads
Enter command: a 4 4 bob
Adding In-restaurant order for "bob": 4 burgers and 4 salads
Visiting node nick with values 3 and 3
Enter command: a 6 6 kevin
Adding In-restaurant order for "kevin": 6 burgers and 6 salads
Visiting node nick with values 3 and 3
Visiting node bob with values 4 and 4
Enter command: a 9 9 max
Adding In-restaurant order for "max": 9 burgers and 9 salads
Visiting node nick with values 3 and 3
Visiting node bob with values 4 and 4
Visiting node kevin with values 6 and 6
waitList *temp = *head;
while(temp->next != NULL )
{


printf("Visiting node %s with values %d and %dn", temp->name, temp->numBurgers, temp->numSalads);

temp = temp-> next;
}

您获取列表中的第一个元素(*head(,然后检查其next是否为null。

将第一个元素添加到列表中后,您就有了一个元素(头(,而第二个元素尚未添加。

waitList *temp = *head;
while(1)
{            
printf("Visiting node %s with values %d and %dn", temp->name, temp->numBurgers, temp->numSalads);

if (temp->next == NULL) {
break;
}
temp = temp-> next;
}

我的逻辑哪里错了?

添加节点的逻辑很好。添加新节点时打印现有节点的逻辑会省略列表中的最后一个节点,因为它只打印满足while条件temp->next != NULL的节点。

有很多方法可以修复它。下面是我喜欢的一种:

waitList dummy = { .next = *head };
waitList *last = &dummy;
for (waitList *temp = last->next; temp; last = temp, temp = last->next) {
printf("Visiting node %s with values %d and %dn", temp->name,
temp->numBurgers, temp->numSalads);
}
last->next = new;

这样,当您遍历列表时,temp指针比当前last指针领先一个节点,last开始指向实头之前的一个伪节点。这样就可以避免将last提前到真正的最后一个节点之后,并且temp依次获取指向每个现有节点的值,包括最后一个。

还要注意,如果添加。。。

*head = dummy.next;

那么您就不再需要第一个节点的特殊情况。

相关内容

  • 没有找到相关文章

最新更新