我尝试在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
答案 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