在C中的链表的末尾插入节点

inserting node at the end of a linked list in C

我正在编写将节点插入链表末尾的代码,但它根本不起作用。它给了我和以前一样的链表,没有附加任何节点。

结果

the old list is :
9 8 7 6 5 4 3 2 1 0 
the new list is :
9 8 7 6 5 4 3 2 1 0 

代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//make a new type structure called node
typedef struct nodes{
    int n;
    struct nodes* next;
}node;
//assigning the first node of the linked list
node* head=NULL;
//append function
void append(int number){
    node* tail=malloc(sizeof(node));
    if(tail==NULL){
        printf("unable to allocate");
        exit(1);
    }
    tail->n=number;
    tail->next=NULL;
    if(head->next==NULL){
        tail->next=head;
        printf("added successfully");
    }
    else{
        for(node* current=head;current->next==NULL;current=current->next){
            current->next=tail;
            printf("Added successfully");
            break;
        }
    }
}
//main function
int main(int argc,char* argv[]){
    //checking that the commmand is correct
    if(argc!=2){
        printf("Please type ./append and then type the number you want to add to the list");
    }
    //accept numbers in second argument
    int newnumber=atoi(argv[1]);
    //make the list
    for(int i=0;i<10;i++){
        node* newnode=malloc(sizeof(node));
        //checking
        if(new==NULL){
            exit(1);
        }
        newnode->n=i;
        newnode->next=head;
        head=newnode;
    }
    //printing the old list
    printf("the old list is :\n");
    for(node* conductor=head;conductor!=NULL;conductor=conductor->next){
        printf("%i ",conductor->n);
    }
    //append the number given to the start of the linked list 
    append(newnumber);
    //printing the new list
    printf("\nthe new list is :\n");
    for(node* conductor=head;conductor!=NULL;conductor=conductor->next){
        printf("%i ",conductor->n);
    }
    printf("\n");
    return 0;
}   

所以这个功能似乎完全没有影响。我看不到错误在哪里。

node* tail=malloc(sizeof(node));

您创建了一个名为 tail 的新节点*。它还没有链接到任何东西。

首先,如评论中所述,如果列表为空,您的代码可能会取消引用 NULL 指针。例如,您可以在开头添加以下检查:

if(head==NULL) {
    head=tail;
    printf("Added successfully\n");
    return;
}

现在让我们看看您的代码:

if(head->next==NULL){
        tail->next=head;
        printf("added successfully");
    }

这里你分配了tail->next而不是head->next,所以你的尾巴仍然不在列表中,这是一个错误。

else{
        for(node* current=head;current->next==NULL;current=current->next){
            current->next=tail;
            printf("Added successfully");
            break;
        }
    }

这里你的循环条件是错误的。对于初学者来说,== 可能应该是 !=。现在你的循环根本没有执行。

那么你还需要把那个循环体从循环中取出来:

else {
    node* current=head;
    while (current->next!=NULL)
        current=current->next;
    current->next=tail;
    printf("Added successfully");
}

其实这些都是很简单的错误,仔细看应该能发现。

您的 append 函数中的逻辑在这两种情况下都是伪造的:如果列表为空,则您的测试不正确,您只修改 tail->next 而不是 head 并且如果列表不为空,您完全无法执行任何操作,因为在 for 循环开始时 current->next 不是 NULL

看看这个更正后的版本:

void append(int number) {
    node *tail = malloc(sizeof(node));
    if (tail == NULL) {
        printf("unable to allocate");
        exit(1);
    }
    tail->n = number;
    tail->next = NULL;
    if (head == NULL) {
        head = tail;
    } else {
        node *current = head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = tail;
    }
    printf("Added successfully");
}