实现列表 ADT 时 C 中的分段错误(核心转储)错误
Segmentation fault (core dumped) error in C when Implementing list ADT
我试图在 C 中实现列表 ADT,但我不断收到错误“分段错误(核心已转储)”。我知道这是由于访问了无法使用的内存造成的,但我不知道如何解决它(我是数据结构的新手,如果有明显错误,请见谅)
这是 list.h 文件:
typedef struct node NodeType;
struct node {
int num;
NodeType *next;
};
typedef struct {
int length;
NodeType *head;
} List;
void init(int maxSize, List *L);
void print(List L);
这是 list.c 文件:
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
void init(int maxSize, List *L) {
(*L).length = maxSize;
(*L).head=NULL;
}
void print(List L) {
int i;
NodeType *p;
printf("List is: ");
for (i=0, p=L.head; i<L.length; i++, p=(*p).next) {
printf(" %d ", (*p).num);
}
putchar('\n');
}
这是主文件:
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
int main(void){
List L;
init(10, &L);
//add(&L, 20); add(&L, 41); add(&L, 63);
print(L);
return 0;
}
我该怎么办?哪一部分是完全错误的?
链表传统上不跟踪它们的长度。长度是通过迭代计算的,直到我们遇到空指针。
在您的代码中,您的 init
函数将列表的长度设置为 10
。然后在 print
中,你使用这个值迭代 10 次,尽管你的列表中只有 3 个元素。这导致了您的分段错误。
您可以在 print
中添加一个检查来避免这种情况:
for (i=0, p=L.head; i<L.length && p != NULL; i++, p=(*p).next) {
printf(" %d ", (*p).num);
}
但我认为您真的需要重新考虑为什么要将长度初始化为 10
,以及为什么要以这种方式跟踪列表的长度。
我试图在 C 中实现列表 ADT,但我不断收到错误“分段错误(核心已转储)”。我知道这是由于访问了无法使用的内存造成的,但我不知道如何解决它(我是数据结构的新手,如果有明显错误,请见谅)
这是 list.h 文件:
typedef struct node NodeType;
struct node {
int num;
NodeType *next;
};
typedef struct {
int length;
NodeType *head;
} List;
void init(int maxSize, List *L);
void print(List L);
这是 list.c 文件:
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
void init(int maxSize, List *L) {
(*L).length = maxSize;
(*L).head=NULL;
}
void print(List L) {
int i;
NodeType *p;
printf("List is: ");
for (i=0, p=L.head; i<L.length; i++, p=(*p).next) {
printf(" %d ", (*p).num);
}
putchar('\n');
}
这是主文件:
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
int main(void){
List L;
init(10, &L);
//add(&L, 20); add(&L, 41); add(&L, 63);
print(L);
return 0;
}
我该怎么办?哪一部分是完全错误的?
链表传统上不跟踪它们的长度。长度是通过迭代计算的,直到我们遇到空指针。
在您的代码中,您的 init
函数将列表的长度设置为 10
。然后在 print
中,你使用这个值迭代 10 次,尽管你的列表中只有 3 个元素。这导致了您的分段错误。
您可以在 print
中添加一个检查来避免这种情况:
for (i=0, p=L.head; i<L.length && p != NULL; i++, p=(*p).next) {
printf(" %d ", (*p).num);
}
但我认为您真的需要重新考虑为什么要将长度初始化为 10
,以及为什么要以这种方式跟踪列表的长度。