c语言链表运行发生异常

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

运行时发生异常

用代码块功能插入代码,请勿粘贴截图

#include"project——f.h"
#include
#include

#include
typedef char ElemType;
//1.定义线性表的链式存储结构(LinkList)
typedef struct Lnode {
char data;
struct Lnode* next;
}Lnode, * LinkList;

//2.初始化链表
void InitList(LinkList L);

/3.使用头插法或尾插法建表,往表L中存入若干元素,
例如按顺序输入:“a,b,c,d,e,f,g”
/
void CreateFromHead(LinkList L);
/4. 使用输出函数,输出表L中所有元素/
void Display(LinkList L);
//5.查找指定位置的元素,例如,查找第5个元素,则输出e
Lnode* GetData(LinkList L, int s,char *e);

int ListLength(LinkList L);
int main() {
ElemType e;
LinkList L; //定义链表

//*2.初始化链表函数调用
InitList(&L);

/*3. 使用头插法建表,往表L中存入若干元素,
例如按顺序输入:“a,b,c,d,e,f,g”*/
int n;//输入元素个数
printf("请输入表的长度");
scanf("%d", &n);
getchar();
printf("请输入表元素");
CreateFromHead(L, n);
/*4.输出元素*/
Display(L);


/*5. 查找指定位置的元素*/
char s;
printf("请输入查找的为位置s:");
char t;
scanf("%c", &s);
t = s;
 GetData(L,t,&e);
 printf("\n%c\n",e);
 return 0;

}

//2.初始化链表
void InitList(LinkList* L) {
*L = (LinkList)malloc(sizeof(Lnode));
(*L)->next = NULL;
}

/3头插法插入元素/
void CreateFromHead(LinkList L, int n) {
int i;
char c;
Lnode* p;
for (i = 0; i < n; i++) {
p = (Lnode*)malloc(sizeof(Lnode));
c = getchar();
getchar(); //缓冲空格和换行
p->data = c;
p->next = L->next;
L->next = p;
}
}

/4.输出元素/
void Display(LinkList L) {
Lnode* p;
p = L->next;
while (p != NULL) {
printf("%c ", p->data);
p = p->next;
}
}
/5. 查找指定位置的元素/
Lnode* GetData(LinkList L, int s,char x) {
int i = 1;
Lnode
q;
q = L->next;//此处发生异常
for (i = 1; i < s; i++) {

    q = q->next;
}
if (!q || i > s) {

    return 0;
}
else
{
    *x = q->data;
    return 1;
}

}

运行结果及报错内容

此处发生异常
编译器为vs2022
q = q->next;

我想要达到的结果

希望可以解决异常

是不是S比较大 导致q为空 但是空没有判断继续取所以异常了? 贴的代码不是很清楚

修改完善如下,供参考:

//#include"project——f.h"
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
//1.定义线性表的链式存储结构(LinkList)
typedef struct Lnode {
    char data;
    struct Lnode* next;
}Lnode, * LinkList;
//2.初始化链表
void InitList(LinkList* L);
// 3.使用头插法或尾插法建表,往表L中存入若干元素,
//例如按顺序输入:“a, b, c, d, e, f, g” /
void CreateFromHead(LinkList L, int n);
// 4. 使用输出函数,输出表L中所有元素 /
void Display(LinkList L);
//5.查找指定位置的元素,例如,查找第5个元素,则输出e
Lnode* GetData(LinkList L, int s, char* e);

//int ListLength(LinkList L);

int main() {
    ElemType e;
    LinkList L; //定义链表

    //*2.初始化链表函数调用
    InitList(&L);

    /*3. 使用头插法建表,往表L中存入若干元素,
    例如按顺序输入:“a,b,c,d,e,f,g”*/
    int n;//输入元素个数
    printf("请输入表的长度:");
    scanf("%d", &n);
    getchar();
    printf("请输入表元素:");
    CreateFromHead(L, n);
    /*4.输出元素*/
    Display(L);


    /*5. 查找指定位置的元素*/
    int s;              //char s;    修改
    printf("请输入查找的为位置s:");
                        //char t;     修改
    scanf("%d", &s);   //scanf("%c", &s); 修改
                        //t = s;     修改
    GetData(L, s, &e); //(L, t, &e) 修改
    printf("%c\n", e);
    return 0;
}
//2.初始化链表
void InitList(LinkList* L) {
    (*L) = (LinkList)malloc(sizeof(Lnode));
    (*L)->next = NULL;
}
// 3头插法插入元素 /
void CreateFromHead(LinkList L, int n) {
    int i;
    char c;
    Lnode* p;
    for (i = 0; i < n; i++) {
        p = (Lnode*)malloc(sizeof(Lnode));
        scanf(" %c", &c);  //c = getchar(); 修改
        //getchar();        //缓冲空格和换行 修改
        p->data = c;
        p->next = L->next;
        L->next = p;
    }
}
// 4.输出元素 /
void Display(LinkList L) {
    Lnode* p;
    p = L->next;
    while (p != NULL) {
        printf("%c ", p->data);
        p = p->next;
    }
    printf("\n");   //修改
}
// 5. 查找指定位置的元素 /
Lnode * GetData(LinkList L, int s, char* x) {
    int i = 1;
    Lnode* q;
    q = L->next;//此处发生异常
    for (i = 1; q && i < s; i++) { //修改 (i = 1;i < s; i++)

        q = q->next;
    }
    if (!q || i > s) {

        *x = NULL;      //修改
        return NULL;    //修改
    }
    else
    {
        *x = q->data;
        return q;      //修改
    }
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^