实现列表 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,以及为什么要以这种方式跟踪列表的长度。