weixin_64513565 2022-11-29 16:55 采纳率: 66.7%
浏览 20
已结题

想问各位,这个代码可以运行,但是当我录入第二种商品时,还没给我结束的机会,随便按一个键,那个运行框就自动关闭了,而且这行代码62处好像有一个错误,求各位解答


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct 
{//化妆品信息得结构体
char brandname[10];
//品牌名
double price;
//价格
}
datatype;
typedef struct node
{
//=叉排序树链表得结点结构
datatype data;
//结点信息
struct node*lchild,*rchild;
//指向左孩子与右孩子得指针
}bintnode;
typedef bintnode*bintree;
//结点指针类型
bintree root;
//指向二叉树根结点得指针
void InsertBintree(bintree*t,datatype addnode)
//创建新结点
{
bintree f=NULL,p=*t;
  //p指向根结点
  while(p)
  //每次从根结点开始比较,查找插入位置
  {
   if (strcmp(addnode.brandname,p->data.brandname)==0&&addnode.price==p->data.price)
{
  printf("已录入该化妆品信息,本次录入无效!\n");
  return;
  }
  //若二叉排序树中已含addnode,则无需插入,ruturn退出函数f=p;
  //f用于保存新结点得最终插入位置
  p=((addnode.price)<(p->data.price))?p->lchild:p->rchild;}
  p=(bintree)malloc(sizeof(bintnode));
  //生成待插入得新结点
  p->data=addnode;
  //将新结点加到树上
  p->lchild=p->rchild=NULL;
  if(*t==NULL)*t=p;
  //原树为空,将值赋值给根结点
  else
   {
   if (addnode.price<f->data.price)f->lchild=p;
   else f->rchild=p;
  }

  }
  bintree CreatBintree()//创建二叉排序树链表
  
{
   bintree t=NULL;
   datatype addnode;
   //录入化妆品信息
   printf("\"end\",\"-1\"为结束标记:\n");
   scanf("%s",addnode.brandname);
   scanf("%lf",&addnode.brandname);
   while((strcmp(addnode.brandname,"end")!=0)||(addnode.price!=-1))
   {
   InsertBintree(&t,addnode);
   //将addnode插入二叉排序树
   scanf("%s",addnode.brandname);
   scanf("%lf",&addnode.price);
   }
   printf("化妆品信息二叉排序树建立成功,\n");
   return t;
   //返回二叉排序树得根地址
   }
   void inorder(bintree t)
   //递归实现二叉树中序遍历输出
   {
    if(t)
    {
      inorder(t->lchild);
      printf("\t\t 品牌名:%s",t->data.brandname);
      printf("\t价格:%g元\n",t->data.price);
      inorder(t->rchild);
      }
      
      
}
   //main、C
   #include<stdio.h>
   #include<stdlib.h>
   #include<string.h>
   int main()
   {
   int s=1;
   int set;
   while(s)
   {
   printf("\t\t\n");
   printf("\t\t简单化妆品信息处理系统\n");
   printf("\t\t \n");
   printf("\t\t 1、录入化妆品信息\n");
   printf("\t\t 2、输出化妆品信息\n");
   printf("\t\t 3、退出系统\n");
   printf("\t\t \n");
   printf("选择操作:" );
   scanf("%d",&set);
   switch(set)
   {
    case 1:root=CreatBintree();
    break;
    case 2:{printf("化妆品品牌价格一览表(价格从低到高):\n");
    printf("\t\t\n");
    inorder(root);
    printf("\t\t\n");
    break;
    }
    case 3:s=0;
    printf("\t系统退出成功,\n");
    break;
    default:printf("无该选项对应得操作!\n");
    }system("pause");
    system("cls");
    }
    return 0;
    }
  • 写回答

2条回答 默认 最新

  • bingbingyihao 2022-11-29 18:23
    关注

    回答:不能说你写得不好,有几点需要说明一下,一是变量命名问题,尽量取名字取的好一些,然后注意代码格式,注释格式;最后是指针的使用,有一个地方的指针你没有进行声明赋值,直接就空指针就直接取内容,报错了

    img

    修改了之后的结果

    img

    # include<stdio.h>
    # include<stdlib.h>
    # include<string.h>
    
    typedef struct
    {
        char brandname[10];
        double price;
    } datatype;
    
    typedef struct node
    {
        datatype data;
        struct node *lchild, *rchild;
    } bintnode;
    
    typedef bintnode *bintree;
    
    bintree root;
    
    void InsertBintree(bintree* t, datatype addnode)
    {
        bintree f = NULL, p = *t;
        
        while (p)
        {
            if (strcmp(addnode.brandname, p->data.brandname) == 0 && addnode.price == p->data.price)
            {
                printf("已录入该化妆品信息,本次录入无效!\n");
                return;
            }
            p = ((addnode.price) < (p->data.price)) ? p->lchild : p->rchild;
        }
        p = (bintree)malloc(sizeof(bintnode));
        p->data = addnode;
        p->lchild = p->rchild = NULL;
        
        if (*t == NULL) *t = p;
        else
        {
            f = *t;
            if (addnode.price < f->data.price) f->lchild = p;
            else f->rchild = p;
        }
    }
    
    bintree CreatBintree()
    {
        bintree t = NULL;
        datatype addnode;
    
        printf("\"end\",\"-1\"为结束标记:\n");
        while(true) {
            datatype addnode;
            scanf("%s", addnode.brandname);
            scanf("%lf", &addnode.price);
            
            if(strcmp(addnode.brandname, "end") == 0 && (int)addnode.price == -1)
            {
                printf("输入结束\n");
                break;
            }
            InsertBintree(&t, addnode);
        }
        printf("化妆品信息二叉排序树建立成功,\n");
        return t;
    }
    
    void inorder(bintree t)
    {
        if (t)
        {
            inorder(t->lchild);
            printf("\t\t 品牌名:%s", t->data.brandname);
            printf("\t价格:%g元\n", t->data.price);
            inorder(t->rchild);
        }
    }
    
    int main()
    {
        int s = 1;
        int set;
        while (s)
        {
            printf("\t\t\n");
            printf("\t\t简单化妆品信息处理系统\n");
            printf("\t\t \n");
            printf("\t\t 1、录入化妆品信息\n");
            printf("\t\t 2、输出化妆品信息\n");
            printf("\t\t 3、退出系统\n");
            printf("\t\t \n");
            printf("选择操作:");
            scanf("%d", &set);
            switch (set)
            {
                case 1:
                    root = CreatBintree();
                    break;
                case 2:
                    {
                        printf("化妆品品牌价格一览表(价格从低到高):\n");
                        printf("\t\t\n");
                        inorder(root);
                        printf("\t\t\n");
                        break;
                    }
                case 3:
                    s = 0;
                    printf("\t系统退出成功,\n");
                    break;
                default: printf("无该选项对应得操作!\n");
            }
            system("pause");
            system("cls");
        }
        return 0;
    }
    

    我实在是没有办法忍受不换行写括号的,而且很多地方的格式太过紧凑,不方便阅读,这里稍作修改了一下;主要就是那个空指针问题

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月7日
  • 已采纳回答 11月29日
  • 请采纳用户回复 11月29日
  • 创建了问题 11月29日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改