C列表分段错误

时间:2015-02-18 21:29:29

标签: c list segmentation-fault

我尝试在C中实现链接列表。但是,当我想打印列表时,会出现段错误。这可能是因为我在调试模式下发现列表仍然是空的。我在哪里搞砸了(ofc,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

1 个答案:

答案 0 :(得分:1)

为了使它工作,我对listops.h进行了两处更改,除了现在通过引用调用结构。

首先,我用AppendLast()的else-branch替换了np-&gt; next = NULL L-> last = np。

其次,我从np-&gt; next改变了while循环的条件!= 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