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");
}
暂无思路
解决并明白其中的原理
上面两个是误导人了。
根本原因不在那里,楼主的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");
}