C语言单链表报错Program received signal SIGSEGV, Segmentation fault

部分代码,运行时报错,显示Program received signal SIGSEGV, Segmentation fault

//结构体
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;
//取值
int GetElem(LinkList L,int i,int *e1){
    int j = 1;
    LinkList p = (LNode*)malloc(sizeof(LNode));
    p = L->next;
    while(p && jnext;
        j++;
    }
    if(!p||j>i){
        printf("未找到"); 
        return 0;
    }
    e1 = p->data;
    printf("已找到");
    return 1;
}
//前插法
void CreateList_H(LinkList L,int n){
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    int i = 0;
    while(imalloc(sizeof(LNode));
        printf("请输入要插入的数据");
        scanf("%d",&e->data);
        e->next = L->next;
        L->next = e;
        i++;
    }
}

11,27行代码缺失
9行给p分配内存没必要。

不太清楚你的函数具体用途。但是问题实在比较多!
结点才需要分配内存空间的,指针本身用来指向分配出来的空间以及操纵链表用的。

大修改了,仅供参考!谢谢!

img


#include<stdlib.h>
#include<stdio.h>


// 结构体
typedef struct LNode
{
    int data;
    struct LNode *next;
} LNode, *LinkList;

// 创建头结点
LNode *head = NULL;

// 取值 取第i个结点的值传回给e所指的变量
int GetElem(LinkList L, int i, int *e);

void CreateList_H(LinkList L, int n);

// 初始化链表
void init_link(LNode ** head)
{
    *head = malloc(sizeof(LNode));
    if (!*head)
        return;
    (*head)->next = NULL;
}


int main()
{

    int n, m;
    int val=0;

    // 初始化链表
    init_link(&head);

    printf("输入插入结点个数:");
    scanf("%d", &n);

    // 创建链表
    CreateList_H(head, n);

    printf("输入要查找的第几个结点?");
    scanf("%d", &m);
    // 查找第5个结点值传回给val
    GetElem(head, m, &val);
    printf("取回的值是:%d\n", val);

    return 0;
}


// 取值 取第i个结点的值传回给e所指的变量
int GetElem(LinkList L, int i, int *e)
{
    LinkList p = L->next;
    int n = 0;
    int j = 0;
    while (p)
    {
        n++;
        p = p->next;
    }


    p = L->next;
    while (p)
    {
        j++;
        if (j == 1 + n - i)
            
        {
            *e = p->data;
            printf("已找到\n");
            return 0;
        }
        p = p->next;
    }



    printf("未找到!\n");
    return -1;
}



// 前插法
// 插入到结点L的前面,前提参数中L代表该结点已经在链表的最前面了
// 插入结点个数n个
void CreateList_H(LinkList L, int n)
{
    /* 
       L = (LinkList) malloc(sizeof(LNode)); L->next = NULL; */
    // int i = 0;

    // 这个循环想把内存耗尽么?
    /* 
       while (malloc(sizeof(LNode)) ) { ; } */
    while (n--)
    {
        LNode *e = malloc(sizeof(LNode));
        if (!e)
            return;
        printf("请输入要插入的数据:");
        scanf("%d", &e->data);
        e->next = L->next;
        L->next = e;
    }
    // i++;
}

你先整理下代码,看着很乱,很多缺失的

修改处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
//结构体
typedef struct LNode{
    int    data;
    struct LNode *next;
}LNode,*LinkList;
//取值
int GetElem(LinkList L,int i,int *e1){
    int j = 1;
    LinkList p;   //= (LNode*)malloc(sizeof(LNode));修改
    p = L->next;
    while(p && j < i){
        p = p->next;
        j++;
    }
    if(!p||j>i){
        printf("未找到\n");
        *e1 = -1;   //修改
        return 0;
    }
    *e1 = p->data;  //修改
    printf("已找到\n");
    return 1;
}
//前插法
void CreateList_H(LinkList* L,int n){ //修改
    (*L) = (LinkList)malloc(sizeof(LNode)); //修改
    (*L)->next = NULL;                //修改
    int i = 0;
    while(i < n){
        LNode* e = (LNode *)malloc(sizeof(LNode));
        printf("请输入要插入的数据");
        scanf("%d",&e->data);
        e->next = (*L)->next;  //修改
        (*L)->next = e;        //修改
        i++;
    }
}