在C中链接列表实现(仅打印最后两个节点)


#include <stdlib.h>
#include <stdio.h>
struct node {
    int data;
    struct node *next;
};
void addLast(struct node **head, int value);
void printAll(struct node *head);
struct node *head1 = NULL;
int main() {
    addLast(&head1, 10);
    addLast(&head1, 20);
    addLast(&head1, 30);
    addLast(&head1, 40);    
    printAll(head1);
    return 0;
}
void addLast(struct node **head, int value) {
    struct node *newNode = (struct node*)malloc(sizeof(struct node));
    newNode->data = value;
    if (*head == NULL) {
        *head = newNode;
        (*head)->next = NULL; 
    } else {
        struct node **temp = head;
        while ((*temp)->next != NULL) {
            *temp = (*temp)->next;
        }
        (*temp)->next = newNode;
        newNode->next = NULL;
   }
}
void printAll(struct node *head) {
    struct node *temp = head;
    while (temp != NULL) {
        printf("%d->", temp->data);
        temp = temp->next;
    }
    printf("n");
}

addLast()将在列表末尾附加新节点,并使用 printAll(),我打印整个列表。

每次打印列表时,我只能看到最后两个节点。

任何人都可以提供帮助,为什么循环不迭代整个列表?

函数 addLast太复杂了,因此由于此语句

而出现错误
*temp = (*temp)->next;

在段循环中。它总是更改头节点。

定义函数以下方式

int addLast( struct node **head, int value )
{
    struct node *newNode = malloc( sizeof( struct node ) );
    int success = newNode != NULL;
    if ( success )
    {
        newNode->data = value;
        newNode->next = NULL:
        while( *head ) head = &( *head )->next;
        *head = newNode;
    }
    return success;
}

考虑到无需将变量head1声明为全局。最好在函数main中声明它。

也应在退出程序之前释放所有分配的内存。

相关内容

  • 没有找到相关文章

最新更新