C 列表段错误

C List Segmentation Fault

我试图在 C 中实现链表。但是,当我想打印链表时出现段错误。这可能是因为我在调试模式下发现列表仍然是空的。我哪里搞砸了(当然,AppendLast() 和 AppendFirst() 都不起作用。)?我没有任何编译器错误或警告。这是我的代码:

main.c:

#include "listops.h"

int main(){
    list L, M;
    L = initList(L);
    M = initList(M);

    nodeData myNumbers[5] = {{1},{2},{3},{4},{5}};

    int i;
    ndp myNumbersPtr;

    for(i=0;i<5;i++){
        myNumbersPtr = &myNumbers[i];
        AppendLast(L, myNumbersPtr);
    }

    printList(L);


    return 0;
}

listops.h:

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

#ifndef LISTOPS_H
#define LISTOPS_H

typedef struct NodeData{
    int myInt;
}nodeData, *ndp;

typedef struct Node{
    ndp data;
    struct Node* next;
} node, *nodeptr;

typedef struct List{
    nodeptr first;
    nodeptr last;
} list, *listptr;

list initList(list L){
    L.first = NULL;
    L.last = NULL;
    return L;
}

int isListEmpty(list L){
    return (L.first == NULL && L.last == NULL);
}

nodeptr createNode(ndp item){
    nodeptr np;
    np = (nodeptr)malloc(sizeof(node));
    np->data = item;
    np->next = NULL;
    return np;
}  

void AppendFirst(list L, ndp item){
    /* node erstellen */
    nodeptr np = createNode(item);
    /* Checken, ob Liste leer */
    if(isListEmpty(L)){
        L.first = np;
        L.last = np;
    }
    else{
        np->next = L.first;
        L.first = np;
    }
}

void AppendLast(list L, ndp item){
    nodeptr np = createNode(item);
    if(isListEmpty(L)){
        L.first = np;
        L.last = np;
    }
    else{
       L.last->next = np;
       np->next = NULL;
    }
}

void printList(list L){
    nodeptr np = L.first;
    int nodeCount = 1;
    while(np->next!=NULL){
        printf("data #%d: %d\n", nodeCount, np->data->myInt);
        nodeCount++;
        np = np->next;
    }
}

#endif // LISTOPS_H

为了让它工作,除了现在通过引用调用结构之外,我对 listops.h 做了两处更改。

首先,我将 AppendLast() 的 else 分支中的 np->next = NULL 替换为 L->last = np.

其次,我将 while 循环的条件从 np->next!=NULL 更改为 到 np!=NULL.

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

#ifndef LISTOPS_H
#define LISTOPS_H

typedef struct NodeData{
    int myInt;
}nodeData, *ndp;

typedef struct Node{
    ndp data;
    struct Node* next;
} node, *nodeptr;

typedef struct List{
    nodeptr first;
    nodeptr last;
} list, *listptr;

list initList(list L){
    L.first = NULL;
    L.last = NULL;
    return L;
}

int isListEmpty(listptr L){
    return (L->first == NULL && L->last == NULL);
}

void AppendFirst(listptr L, ndp item){
    /* node erstellen */
    nodeptr np = createNode(item);
    /* Checken, ob Liste leer */
    if(isListEmpty(L)){
        L->first = np;
        L->last = np;
    }
    else{
        np->next = L->first;
        L->first = np;
    }
}

void AppendLast(listptr L, ndp item){
    nodeptr np = createNode(item);
    if(isListEmpty(L)){
        L->first = np;
        L->last = np;
    }
    else{
       L->last->next = np;
       L->last = np;
    }
}

   void printList(list L){
    nodeptr np = L.first;
    int nodeCount = 1;
    while(np!=NULL){
        printf("data #%d: %d\n", nodeCount, np->data->myInt);
        nodeCount++;
        np = np->next;
    }
}

#endif // LISTOPS_H