C 在链表末尾插入

C 在链表末尾插入,c,struct,linked-list,singly-linked-list,C,Struct,Linked List,Singly Linked List,我正在编写一个程序来熟悉链表,当我试图在链表末尾插入一个新链接时,该值似乎没有被存储。我假设这与局部变量没有保存到传递到函数中的变量有关 有关职能: int insertAtTail(int intBeingAdded, List *userList){ while(userList->next != NULL){ userList = userList->next; } List *newLink = (List *)malloc(sizeo

我正在编写一个程序来熟悉链表,当我试图在链表末尾插入一个新链接时,该值似乎没有被存储。我假设这与局部变量没有保存到传递到函数中的变量有关

有关职能:

int insertAtTail(int intBeingAdded, List *userList){
    while(userList->next != NULL){
        userList = userList->next;
    }
    List *newLink = (List *)malloc(sizeof(List));
    userList->next = newLink;
    newLink->next = NULL;
    newLink->value = intBeingAdded;
    return 1;
}
整个文件:

#include "stdio.h"
#include "stdlib.h"

typedef struct list{
    int value;
    struct list * next;
} List;

List * initIntegerList(void);
int insertAtHead(int intBeingAdded, List *userList);
int insertAtTail(int intBeingAdded, List *userList);
void printList(List *userList);

int main(void){
    List *myList;
    myList = initIntegerList();
    insertAtHead(2, myList);
    insertAtHead(1, myList);
    insertAtTail(6, myList);
    printList(myList);
    freeList(myList);
}

List * initIntegerList(void){
    List * listPointer = (List *)malloc(sizeof(List));
    if(listPointer != NULL){
        listPointer->next = NULL;
        return listPointer;
    }else{
        printf("Memory not available for allocation\n");
        return listPointer;
    }
}

int insertAtHead(int intBeingAdded, List *userList){
    List *previousHead = (List *)malloc(sizeof(List));
    if(previousHead != NULL){
        previousHead->value = intBeingAdded;
        previousHead->next = userList->next;
        userList->next = previousHead;
        return 1;
    }
    return 0;
}

int insertAtTail(int intBeingAdded, List *userList){
    while(userList->next != NULL){
        userList = userList->next;
    }
    List *newLink = (List *)malloc(sizeof(List));
    userList->next = newLink;
    newLink->next = NULL;
    newLink->value = intBeingAdded;
    return 1;
}

void printList(List *userList){
    printf("Values in list: ");
    List *currentLink = userList;
    while(currentLink->next != NULL){
        printf(" %d", currentLink->value);
        currentLink = currentLink->next;
    }
    printf("\n");
}


我看到的输出仅存储了0,1,2,而6没有生成它。

打印列表时:

while(currentLink->next != NULL){
到达最后一个节点时停止,不打印其内容。相反,您希望:

while(currentLink != NULL){
此外,列表的开头有一个虚拟条目。打印列表时,您希望跳过该列表

List *currentLink = userList->next;

列表的构建方式使头部节点不包含值。它是一个虚拟节点。另一方面,最后一个节点总是包含下一个等于NULL的数据成员

所以这个条件在函数printList中

不输出最后一个节点的值

该函数可以编写为

void printList( const List *userList )
{
    printf("Values in list: ");

    if ( userList != NULL )
    {
        for ( const List *currentLink = userList->next; 
              currentLink != NULL;
              currentLink = currentLink->next )
        {
            printf( " %d", currentLink->value );
        }
    }

    printf("\n");
}

请注意,将虚拟节点作为头部节点是一个坏主意。头部节点应设置为空。

?我认为您正在列表中看到输出值:0 1 2,对吗?您似乎从未为列表中分配的initIntegerList中的第一个元素赋值。listPointer->value的值是多少?includes应该在中。在列表的开头使用一个虚拟条目是非常麻烦的,特别是因为您的一些代码没有考虑虚拟条目。最好用空指针表示空列表或至少是空的单链接列表。然后您的initIntegerList将是非常冗余的,因为它只需要返回一个空指针值。C只有passby值,但是您可以通过向对象传递指针并对其进行解引用来模拟passby引用的效果。因此,要模拟通过引用传递指针值,可以将指针传递给指针。
void printList( const List *userList )
{
    printf("Values in list: ");

    if ( userList != NULL )
    {
        for ( const List *currentLink = userList->next; 
              currentLink != NULL;
              currentLink = currentLink->next )
        {
            printf( " %d", currentLink->value );
        }
    }

    printf("\n");
}