C语言 为什么下面的代码没有打印链表?


#include<stdio.h>
#include<stdlib.h>
typedef struct list {
    int data;
    struct list *next;
} node;
void add(node **head, node **tail, int data) {
    node *temp1, *temp2;
    temp1 = (node*) malloc(sizeof(struct list));
    temp1->data = data;
    temp1->next = NULL;
    if (*head == NULL) {
        *head = temp1;
        *tail = temp1;
    } else {
        for (temp2 = *head; temp2->next != NULL; temp2 = temp2->next)
            temp2->next = temp1;
        *tail = temp1;
    }
}
int main() {
    node *temp, *head, *tail;
    head = NULL;
    add(&head, &tail, 1);
    add(&head, &tail, 2);
    add(&head, &tail, 3);
    add(&head, &tail, 4);
    for (temp = head; temp != (node *) 0; temp = temp->next) {
        printf("[%d]->", (temp->next));
    }
    printf("[NULL]nn");
}

错误是什么,为什么不打印?错误是什么,为什么它只打印[0]->NULL?我尝试了各种形式,但我做不到。有什么问题吗?指针有问题吗?或者没有分配足够的内存?

for循环中缺少一条语句:

for(temp2=*head; temp2->next!=NULL; temp2=temp2->next)
temp2->next=temp1;
*tail=temp1;

这将作为

执行
for(temp2=*head; temp2->next!=NULL; temp2=temp2->next) {
    temp2->next=temp1;
}
*tail=temp1;

你可以修复它只是添加一个空块for ({})或;

for(temp2=*head; temp2->next!=NULL; temp2=temp2->next) {}
temp2->next=temp1;
*tail=temp1;

也可能你想在你的printf语句是

printf("[%d]->",(temp->data));

我认为你不必使用for循环。如果我理解正确的话,你想在列表的末尾添加一个元素。所以就像这样做:

// if list is empty ...
if (*head == NULL) {
    // ... insert new node
    *head = temp1;
    *tail = temp1;
}
// ... otherwise ...
else {
    // ... insert new node at tail ...
    (*tail)->next = temp1;
    // ... then move tail to new node
    *tail = temp1;
}

它工作是因为你不需要找到列表的末尾,你已经知道它在哪里:它是*tail !所以你只要把你的元素添加到tail的下一个指针,然后你移动tail指针本身…

输出是:

[1]->[2]->[3]->[4]->[NULL]

正如Salem指出的,你应该修正你的printf:

printf("[%d]->", (temp->data));

相关内容

  • 没有找到相关文章

最新更新