单链表查找和插入无法执行 返回值3221225477

代码如下,运行到插入和查找的时候会没办法继续,返回值3221225477,请问是哪里出了问题?如何检查修改 谢谢

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include<string.h>
#define N 10
#define error 0
#define ok 1
struct {
char id[N];
char name[N];
float price;
}book;

struct lnode {
book data;
struct lnode* next;
};

//头插法
struct lnode* creatlist1(struct lnodet l, int n) {
lnode
p;
int i;
for (i = 0; i < n; i++)
{
p = (struct lnode*)malloc(sizeof(lnode));
printf("输入数据 %d:", i + 1);
scanf("%s %s %f", p->data.id, p->data.name, &p->data.price);
p->next = l->next;
l->next = p;
}
return l;
}

//输出
int printlist(struct lnode* l)
{
lnode* p;
int i;
p = l->next;
while (p != NULL)
{
printf("data:%s %s %f\n", p->data.id, p->data.name, p->data.price);
p = p->next;
}
return ok;
}

//插入
int insertlist(struct lnode* l,int i,book e){
int j;
lnode* p;
lnode* s;
j=0;
p = l;
while(p && (j<i-1)){
p=p->next;
j++;
}
if(!p||j>i-1)
{ return error;
}
s->data=e;
s->next=p->next;
p->next=s;
return ok;

}

//查找
void sreach(struct lnode* l)
{ lnode *p;
char id[N];
int i;
int j;
int flag;
p=l;
i=1;
printf("请输入书的id:\n");
scanf("%s",id);
while(p!=NULL){
if(strcmp(p->data.id,id) == 0)
{
flag=1;
j=i;
}
p=p->next;
i++;
}
if(flag==1){
printf("书的位置e:%d\n",j);
}
else
{
printf("表中无此书e\n");
}
}

int main()
{
struct lnode* l;
int n;
int p;
book e;
printf("请输入表L元素个数n:\n");
scanf("%d", &n);
intlist(&l);
creatlist1(l, n);
printlist(l);
printf("请输入要插入的位置p:\n");
scanf("%d",&p);
printf("请输入要插入的元素e:\n");
scanf("%s %s %f",e.id,e.name,e.price);
insertlist(l,p,e);
printlist(l);
sreach(l);
}

修改处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define N 10
#define error 0
#define ok 1
typedef struct {
    char id[N];
    char name[N];
    float price;
}book;

typedef book elemtype;

typedef struct lnode {
    elemtype data;
    struct lnode* next;
}lnode, * linklist;


void intlist(linklist* l)
{
    (*l) = (linklist)malloc(sizeof(lnode));
    (*l)->next = NULL;
}

//头插法
linklist creatlist1(linklist l, int n) {
    lnode* p;
    //linklist l;
    int i;
    for (i = 0; i < n; i++)
    {
        p = (linklist)malloc(sizeof(lnode));
        printf("输入数据 %d:", i + 1);
        scanf("%s %s %f", p->data.id, p->data.name, &p->data.price);
        p->next = l->next;
        l->next = p;
    }
    return l;
}

//输出
int printlist(linklist l)
{
    lnode* p;
    int i;
    p = l->next;
    while (p != NULL)
    {
        printf("data:%s %s %f\n", p->data.id, p->data.name, p->data.price);
        p = p->next;
    }
    return ok;
}

//插入
int insertlist(linklist l, int i, elemtype e) {
    int j;
    lnode* p;
    lnode* s;
    if (i < 1)  return error;      //修改
    j = 0;
    p = l;
    while (p && j < (i - 1)) {  
        p = p->next;
        j++;
    }
    if (!p || j > i - 1)  
    {
        return error;
    }
    s = (linklist)malloc(sizeof(lnode)); //修改
    s->data = e;
    s->next = p->next;
    p->next = s;
    return ok;
}

//查找
void sreach(linklist l)
{
    lnode* p;
    char id[N];
    int i = 1, j;
    int flag = 0;   //int flag;
    p = l->next;    //p = l;
                    //i = 1;
    printf("请输入书的id:\n");
    scanf("%s", id);   //scanf("%s", id[N]);
    while (p != NULL) {
        if (strcmp(p->data.id, id) == 0)
        {
            flag = 1;
            j = i;
        }
        p = p->next;
        i++;
    }
    if (flag == 1) {
        printf("书的位置e:%d\n", j);
    }
    else
    {
        printf("表中无此书e\n");
    }
}

int main()
{
    linklist l;
    int n;
    int p;
    elemtype e;
    printf("请输入表L元素个数n:\n");
    scanf("%d", &n);
    intlist(&l);
    creatlist1(l, n);
    printlist(l);

    printf("请输入要插入的位置p:\n");
    scanf("%d", &p);
    printf("请输入要插入的元素e:\n");
    scanf("%s %s %f", e.id, e.name, &e.price); //修改
    //scanf("%s %s %f", e.id, e.name, e.price);
    insertlist(l, p, e);
    printlist(l);

    sreach(l);
    return 0;
}

把typedef都去掉,我会帮你看一下

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633