「已注销」 2022-04-20 15:22 采纳率: 33.3%
浏览 116
已结题

单链表查找和插入无法执行 返回值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);
}

  • 写回答

3条回答 默认 最新

  • qzjhjxj 2022-04-21 08:47
    关注

    修改处见注释,供参考:

    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月29日
  • 已采纳回答 4月21日
  • 修改了问题 4月20日
  • 创建了问题 4月20日

悬赏问题

  • ¥30 自适应 LMS 算法实现 FIR 最佳维纳滤波器matlab方案
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥15 Python3.5 相关代码写作
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像