为什么我的按值查找结点的位置出不来呢?

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node
{char data;
struct Node* next;
}linklist;
linklist *head,*p;
linklist *CREATLISTRO()//尾插法建立单链表
{
char ch;
linklist *head,*s,r;
head=NULL;
r=NULL;
printf("开始建立单链表输入$结束\n");
ch=getchar();
while(ch!='$')
{
s=(linklist
)malloc(sizeof(linklist));
s->data=ch;
if(head==NULL)
head=s;
else
r->next=s;
r=s;
ch=getchar();
}
if(r!=NULL)
r->next=NULL;
return head;
}
///
//输出单链表/1
void ShowList(linklist *head)
{
linklist *p;
printf("输出单链表:"); p=head;
if(head->next==NULL)
printf("表为空\n");
else
while(p!=NULL)
{
printf(" %c ",p->data);
p=p->next;
}
printf("\n");
}
//求单链表长度//
void LENGTH(linklist *head)
//求长度
{
int n=0;
linklist p;
p=head;
if(head->next==NULL)
printf("表为空\n");
else
while(p->next!=NULL)
{
n++;
p=p->next;
}
printf("\n该单链表的长度为:%d\n",n+1);
}
linklist
GET(linklist *head,int i)//按位查找
{
int j;
linklist p;
p=head;
j=0;
while((p->next!=NULL)&&(j<i))
{
p=p->next;
j++;
}
if(i==j)
return p;
else
return NULL;
}
linklist
LOCATE(linklist *head,int key)//按值查找
{
linklist p;
p=head->next;
while(p!=NULL)
if(p->data!=key)
p=p->next;
else break;
return p;
}
linklist
INSERTBEFORE(linklist *head)//前插
{
linklist *s,q;
int i;
char x;
printf("\n请输入插入的结点:");
scanf("%c",&x);
getchar();
printf("请输入插入的位置:");
scanf("%d",&i);
getchar();
p=GET(head,i-1);
s=(linklist
)malloc(sizeof(linklist));
s->data=x;
q=head;
while(q->next!=p)
q=q->next;
s->next=p;
q->next=s;
printf("插入成功!\n");
return head;
}
void DELETE(linklist *head,int i)
{
linklist *p,*r;
int j;
j=i-1;
p=GET(head,j);
if((p!=NULL)&&(p->next!=NULL))
{
r=p->next;
p->next=r->next;
free(r);
printf("删除成功!\n");
}
else
printf("error!");
}
int main()
{
int j=1,g=1,h=1;
int i=1;
int n,key;
head=CREATLISTRO();
ShowList(head);
printf("请输入须查找结点:");
scanf("%c",&key);
getchar();
printf("%c结点储存的位置为:%d\n",key,LOCATE(head,key));
getchar();
LENGTH(head);
INSERTBEFORE(head);
ShowList(head);
printf("请输入删除的结点:\n");
scanf("%d",&i);
DELETE(head,i);
ShowList(head);
return 0;
}

修改完善如下,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node
{
    char   data;
    struct Node* next;
}linklist;
//linklist* head,* p;
linklist* CREATLISTRO()//尾插法建立单链表
{
    char ch;
    linklist* head, * s, *r;
    head = NULL;
    r = NULL;
    printf("开始建立单链表输入$结束\n");
    scanf(" %c", &ch);
    while (ch != '$')
    {
        getchar();   //修改
        s = (linklist*)malloc(sizeof(linklist));
        s->data = ch;
        if (head == NULL)
            head = s;
        else
            r->next = s;
        r = s;
        scanf(" %c", &ch);
    }
    r->next = NULL;
    return head;
}
//输出单链表/1
void ShowList(linklist* head)
{
    linklist* p;
    p = head;
    printf("输出单链表:"); 
    if (head == NULL)    //if (head->next == NULL) 
        printf("表为空\n");
    else
        while (p != NULL)
        {
            printf(" %c ", p->data);
            p = p->next;
        }
    printf("\n");
}
//求单链表长度//
void LENGTH(linklist* head)
//求长度
{
    int n = 0;
    linklist *p;  
    p = head;
    if (head == NULL)  
        printf("表为空\n");
    else
        while (p != NULL) 
        {
            n++;
            p = p->next;
        }
    printf("\n该单链表的长度为:%d\n", n);  // n + 1
}
linklist* GET(linklist* head, int i)//修改  
{
    int j;
    linklist* p, * q;
    q = p = head;
    j = 0;
    while (p && j < i) //修改
    {
        j++;
        q = p;
        p = p->next;
    }
    if (p != NULL )     //if (i == j)
        return q;
    else
        return NULL;
}
int  LOCATE(linklist* head, char  key)// 修改
{
    linklist* p;
    int i = 0;
    p = head;       //p = head->next; 修改
    while (p != NULL)
    {
        if (p->data == key) break;
        i++;
        p = p->next;
    }
    if (p != NULL)
        return i + 1;   //i-1;
    else
        return  -1;  // -1 表示未找到
}
linklist* INSERTBEFORE(linklist* head)//前插
{
    linklist* s, * p=NULL;
    int i;
    char x;
    printf("\n请输入插入的结点值:");
    scanf("%c", &x);
    getchar();
    printf("请输入插入的位置:");
    scanf("%d", &i);
    getchar();
    p = GET(head, i-1);
    if (p == NULL)
    {
        printf("插入位置错误,无法插入!\n");
        return head;
    }
    s = (linklist*)malloc(sizeof(linklist));
    s->data = x;
    if (p == head && i==1)
    {    
        s->next = head;
        head = s;
    }
    else {
        s->next = p->next;
        p->next = s;
    }
    printf("插入成功!\n");
    return head;
}
linklist*  DELETE(linklist* head, int i)
{
    linklist* p, * r;
    int j;
    j = i - 1;
    p = GET(head, j);
    if (p == NULL)
    {
        printf("删除位置错误!\n");
        return head;
    }
    if (p == head && i == 1)
    {
        r = head;
        head = head->next;
    }
    else{
        r = p->next;
        p->next = r->next;
    }
    free(r);
    printf("删除成功!\n");
    return head;
}
int main()
{
    linklist* head;
    int  j = 1, g = 1, h = 1;
    int  i = 1;
    int  n = 0;
    char key;
    head = CREATLISTRO();
    ShowList(head);

    printf("请输入须查找结点值:");
    getchar();                   //修改
    scanf("%c", &key);   
    printf("值为: %c 结点储存的位置为:%d\n", key, LOCATE(head, key));

    getchar();
    LENGTH(head);

    head = INSERTBEFORE(head);
    ShowList(head);

    printf("请输入删除的结点位置:\n");
    scanf("%d", &i);
    getchar();
    head = DELETE(head, i);
    ShowList(head);
    return 0;
}

1.哪里有错,截主要部分
2.没有注释,很少有闲人给你看这么长的代码

1.先确认链表建的是否正确
2.如果链表建的没问题,你查找的位置是从0开始的还是从1开始的?