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
我试图在 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