意外遍历链表

时间:2020-10-30 20:06:01

标签: c linked-list

我在弄清楚为什么链表未正确“访问节点”时遇到麻烦。看来我的代码比我想要的要落后一步。被访问的节点仅在添加第三个节点后才开始堆叠,而在第二个节点添加后应被堆叠时才开始堆叠。对我来说,这种逻辑应该起作用,因为当创建第一个节点并将第二个节点初始化为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 %d\n", 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

2 个答案:

答案 0 :(得分:1)

        waitList *temp = *head;

        while(temp->next != NULL )
        {
            
            
            printf("Visiting node %s with values %d and %d\n", temp->name, temp->numBurgers, temp->numSalads);
            
            temp = temp-> next;
        }

您将列表中的第一个元素(* head)作为元素,然后检查其next是否为空。

将第一个元素添加到列表后,您将拥有一个元素(标题),而第二个元素尚未添加。

        waitList *temp = *head;

        while(1)
        {            
            printf("Visiting node %s with values %d and %d\n", temp->name, temp->numBurgers, temp->numSalads);
            
            if (temp->next == NULL) {
                break;
            }
            temp = temp-> next;
        }

答案 1 :(得分:0)

我的逻辑错在哪里?

您添加节点的逻辑很好。添加新节点时,用于打印现有节点的逻辑将省略列表中的最后一个节点,因为它仅打印满足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 %d\n", temp->name,
            temp->numBurgers, temp->numSalads);
}

last->next = new;

这样,在遍历列表时,temp指针会在当前last指针之前运行一个节点,last会开始指向真实头之前的虚拟节点。这样一来,您就可以避免将last推进到真正的最后一个节点之后,而temp会依次获取指向每个现有节点(包括最后一个节点)的值。

还请注意,如果您添加...

*head = dummy.next;

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