段错误,我要疯了,C语言数据结构

图片说明

所以问题出在哪里,我很菜,轻喷

附上完整代码

#include
#include
#include
#define OK 1
#define ERROR 0
#define TURE 1
#define FALSE 0
#define ElemType int

typedef struct Node
{
ElemType data;
struct Node *next;
} Node,*LinkList;

void CreateTail(LinkList L);
int DelList(LinkList L,int i,ElemType e);
void Get(LinkList L,int i);
void InitList(LinkList *l);
int InsList(LinkList L,int i,ElemType e);
int ListLength(LinkList L);
void Locate(LinkList L,ElemType e);

void main()
{
LinkList k;
int m; //要查找的序号
int n; //要插入的位置
int t; //要删除的位置
char a; //要查找的元素
InitList(&k);
Node *p;
p=k->next;
printf("用尾插法建立单链表,请输入链表数据,以$结束!\n");

CreateTail(k);

while(p!=NULL)
{
    printf("%c\n",p->data );
    p=p->next;
} 

printf("请输入要查找的序号:");
scanf("%d",&m);
printf("查找到的元素是:");
Get(k,m);

printf("\n请输入要查找的元素:");
scanf("%c",&a);
Locate(k,a);

printf("\n请输入要插入的位置:");
scanf("%d",&n);
printf("插入的元素是:");
scanf("%c",&a);
InsList(k,n,a);
printf("插入后的链表是:");
p=k->next;

while(p!=NULL)
{
    printf("%c",p->data );
    p=p->next;
}

printf("\n请输入要删除的位置:");
scanf("%d",&t);


printf("删除的元素是:%c\n",a);
scanf("%c",&a);
DelList(k,t,a);
printf("删除后的链表是:");
p=k->next;

while(p!=NULL)
{
    printf("%c",p->data );
    p=p->next;
}
printf("\n链表的长度是:%d\n",ListLength(k));

}

void InitList(LinkList *k)
{
*k=(LinkList)malloc(sizeof(Node));
(*k)->next=NULL;
}

void CreateTail(LinkList L)
{
char c;
Node *r,*s;
int flag=1;
r=L;

while(flag)
{
    c=getchar();
    if(c!='$')
    {
        s=(Node*)malloc(sizeof(Node));
        s->data =c;
        r->next=s;
        r=s; 
    }
    else
    {
        flag=0;
        r->next=NULL;
    }
}

}

void Get(LinkList L,int i)
{
int j;
Node *p;
p=L;j=0;

while(p->next!=NULL&&j<i)
{
    p=p->next;
    j++;
}

if(i==j)
    printf("%c",p->data );
else
    printf("FALSE");

}

void Locate(LinkList L,ElemType e)
{
Node *p;
p=L->next;

while(p!=NULL)
if(p->data!=e )
    p=p->next;
else
break;
if(p->data ==e)
    printf("TURE");
else
    printf("FALSE"); 

}

int InsList(LinkList L,int i,ElemType e)
{
Node *pre,*s;
int k;
pre=L;k=0;

while(pre!=NULL&&k<i-1)
{
    pre=pre->next;
    k=k+1;
}

if(k!=i-1)
{
    printf("插入位置不合法!");
    return ERROR;
}

s=(Node*)malloc(sizeof(Node));
s->data =e;
s->next=pre->next;
pre->next=s;
return OK;

}

int DelList(LinkList L,int i,ElemType e)
{
Node *p,*r;
int k;
p=L;k=0;

while(p->next!=NULL&&k<i-1)
{
    p=p->next;
    k=k+1;
}

if(k!=i-1)
{
    printf("删除结点的位置不合法!");
    return ERROR;
}

r=p->next;
p->next=p->next->next;
e=r->data ;
free(r);
return OK;

}

int ListLength(LinkList L)
{
Node *p;
p=L->next;
int j=0;

while(p!=NULL)
{
    p=p->next;
    j++;
}

return j;

}

printf("\n请输入要查找的元素:");
scanf("\n%c",&a); 这里要加上一个回车,否则a得不到输入

下面还有几个地方类似

还有
printf("\n请输入要删除的位置:");
scanf("%d",&t);
printf("删除的元素是:%c\n",a);
scanf("%c",&a);
你这里输入了删除位置t,之后查找都不查找就输出a,a肯定不是删除的元素。

下面的scanf又不知道是要输入什么

程序就不仔细看了,建议你学会调试,知道下断点怎么看链表和输入变量的状态。建议你用visual studio,初学者不要用这种简陋的开发环境。