关于#链表#的问题,如何解决?

问题遇到的现象和发生背景

C语言单链表 出现异常Segmentation fault

问题相关代码,请勿粘贴截图
#include 
#include 

typedef struct Node
{
  int id;
  struct Node * next;
}Node, LinkList;

int InitList(LinkList * linkList)
{
  linkList = (Node *)malloc(sizeof(Node));
  if (linkList == NULL)
    return 0;
  linkList->next = NULL;
  return 1;
}

int InsertNode(LinkList * linkList, int pos, int elem)
{
  if (pos < 1)
    return 0;
  Node * p = linkList;
  int j = 0;
  while (j < pos - 1 && p != NULL)
  {
    j++;
    p = p->next;
  }
  Node * s = (Node *)malloc(sizeof(Node));
  if (s == NULL)
    return 0;
  s->id = elem;
  s->next = p->next;
  p->next = s;
  return 1;
}

void main()
{
  Node * head;
  InitList(head);
  // printf("初始化成功\n");
  InsertNode(head, 1, 10);
  // printf("插入成功\n");
}

运行结果及报错内容

img

我的解答思路和尝试过的方法

暂无思路

我想要达到的结果

解决并明白其中的原理

上面两个是误导人了。
根本原因不在那里,楼主的pos 是1,while 循环压根进不去


int InitList(LinkList **linkList)
{
  *linkList = (Node *)malloc(sizeof(Node));
  if (*linkList != NULL) {
    *linkList->next = NULL;
     return 1;
  }

  return 0;
}

这个函数这样改,然后main 里面传入 &head

代码修改完善如下,供参考:

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
    int id;
    struct Node* next;
}Node, LinkList; 

int InitList(LinkList** linkList) //修改
{
    (*linkList) = (Node*)malloc(sizeof(Node)); //修改
    if ((*linkList) == NULL)     //修改
        return 0;
    (*linkList)->next = NULL;    //修改
    return 1;
}

int InsertNode(LinkList* linkList, int pos, int elem) 
{
    if (pos < 1)
        return 0;
    Node* p = linkList;
    int j = 0;
    while (j < pos - 1 && p != NULL)
    {
        j++;
        p = p->next;
    }
    if (!p)   return 0;     //修改 当插入位置超出链表长度时
    Node* s = (Node*)malloc(sizeof(Node));
    if (s == NULL)
        return 0;
    s->id = elem;
    s->next = p->next;
    p->next = s;
    return 1;
}

void print(LinkList* linkList)
{
    Node* p = linkList;
    while (p->next) {
        printf("%d ", p->next->id);
        p = p->next;
    }
    printf("\n");
}

void main()
{
    Node* head;
    InitList(&head);  //修改
    // printf("初始化成功\n");
    InsertNode(head, 1, 10);
    InsertNode(head, 2, 8);
    InsertNode(head, 2, 9);
    InsertNode(head, 4, 5);
    InsertNode(head, 6, 6); //插入位置超出链表的长度
    // printf("插入成功\n");
    print(head);      //修改
}

25行的循环改变了p,不再是传入的链表头了。将34和35行的p改为参数linklist

#include 
#include 
 
typedef struct Node
{
  int id;
  struct Node * next;
}Node, LinkList;
 
int InitList(LinkList * linkList)
{
  linkList = (Node *)malloc(sizeof(Node));
  if (linkList == NULL)
    return 0;
  linkList->next = NULL;
  return 1;
}
 
int InsertNode(LinkList * linkList, int pos, int elem)
{
  if (pos < 1)
    return 0;
  Node * p = linkList;
  int j = 0;
  while (j < pos - 1 && p != NULL)
  {
    j++;
    p = p->next;
  }
  Node * s = (Node *)malloc(sizeof(Node));
  if (s == NULL)
    return 0;
  s->id = elem;
  s->next = linkList->next;
  linkList->next = s;
  return 1;
}
 
void main()
{
  Node * head;
  InitList(head);
  // printf("初始化成功\n");
  InsertNode(head, 1, 10);
  // printf("插入成功\n");
}