darkwolf 发表于 2015-7-2 23:27:30

c语言制作的药品管理系统,出现了问题,请大神帮助

2211020259药品管理系统,在输入药品各项之后查找只能查找到第一个,第二三个没办法找到,同时删除的时候第二三个也没有办法删除,显示信息不存在。但是查询全部信息的时候可以查询的到。代码如下,同时运行的图片也在下面。#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
typedef struct
{ char   name;//药名
char   ID;//编号
char   number;//库存数量
char   price;//价格
}datatype;
typedef struct node
{
        datatype data;   
        struct node * next;
}listnode;
typedef listnode * linklist;
linklist head;
listnode * p;
//1药品信息的建立//
linklist Create(int a )
{
linklist head=(listnode *)malloc(sizeof(listnode));
listnode *p,*q;
q=head;
while(a--)
   {
          p=(listnode *)malloc(sizeof(listnode));
          printf("药名 编号数量 价格\n");
          scanf("%s %s %s %s",p->data.name,p->data.ID,
                  p->data.number,p->data.price);
          q->next=p;
          q=p;
}
q->next=NULL;
return head;
   
}
//2药品信息的添加
void Add(linklist head,int b)
{
        listnode * m,* n,* p;
        m=head;
        n=m->next;
        while(n->next!=NULL)
        {
                m=n;
                n=n->next;
        }
        while(b--)
        {
      p=(listnode *)malloc(sizeof(listnode));
      printf("药名 编号 数量 价格\n");
          scanf("%s %s %s %s",p->data.name,p->data.ID,
                  p->data.number,p->data.price);
      n->next=p;
      n=p;
        }
        n->next=NULL;

}
//3按药名查找药品信息
listnode *Find(linklist head)
{
       listnode *p;
       char name;

          p=head->next;

               printf("请输入要查询的药名:");
                       scanf("%s",&name);
                       while(p&&strcmp(p->data.name,name/*比较两个条件不相等输出1*/)>0)
                               p=p->next;
                       if(p==NULL||strcmp(p->data.name,name)<0)
                               p=NULL;
//               }
       return p;
          
}




//4药名信息的删除
void Delete(linklist head)
{
        int i;
        listnode *p,*q;
        p=Find(head);
        if(p==NULL)
        {
                printf("信息不存在!\n");
                return;
        }
        else
        {
                printf("要删除的话就按1:");
                scanf("%d",&i);
                if(i==1)
                {
                        q=head;
                        while(q!=NULL&&q->next!=p)
                                q=q->next;
                        q->next=p->next;
                        free(p);
                        printf("已删除信息!\n");
                }
        }

}
//5药名信息的输出
void List(linklist head)
{
       listnode *p;
       p=head;
       printf("药名 编号 数量价格\n");
       while(p->next!=NULL)
       {
               printf("%s %s %s %s\n",p->next->data.name,p->next->data.ID,
                  p->next->data.number,p->next->data.price);
               p=p->next;
       }
}
int Menu()
{
int i;
system("pause");
system ("cls");//清屏数据
printf("—————————————欢迎使用药品信息管理系统————————————\n");
printf("|                                                                         |\n");
printf("|                                                                         |\n");
printf("|                           1.建立信息表                                  |\n");
printf("|                           2.插入新信息                                  |\n");
printf("|                           3.查询信息记录                              |\n");   
printf("|                           4.删除信息记录                              |\n");
printf("|                           5.显示信息                                    |\n");
printf("|                           0.退出管理系统                              |\n");
printf("|                                                                         |\n");
printf("|———————————————————————————————————— |\n");
printf("请选择 0-5:");
for(;;)
   {
          scanf("%d",&i);
      printf("\n");
      if(i<0||i>5)
                  printf("输出错误,重选0-5:");
          else
                  break ;
}
return i;
}
   //药品信息系统主函数部分
voidmain()

{
        system ("color 4f");
        for(;;)
{
                switch(Menu())
{
                case 1:
                        printf("————————————————药品信息的建立————————————————\n");
                        int i;
                        printf("输入你想输入的数目:");
                        scanf("%d",&i);
                        head=Create(i);
                        List(head);
                        break;
                case 2:
                        printf("————————————————药品信息的添加————————————————\n");
                        int a;
                        printf("输入你想添加的数目:");
                        scanf("%d",&a);
                        Add(head,a);
                        break;
                case 3:
                        printf("————————————————药品名的查询————————————————\n");
                        p=Find(head);
                        if(p!=NULL)
                        {
                                printf("药名 数量类型价格\n");
                                printf("—————————————————————————————\n");
                          printf("%s %s %s %s\n",p->data.name,p->data.ID,
                           p->data.number,p->data.price);
                                printf("\n");
                               
                        }
                        else {
                                printf("该客户信息不存在!");
                        }
               
                        List(head);
                        break;
                case 4:
                        printf("————————————————药品信息的删除————————————————\n");
                        Delete(head);
                        break;
                case 5:
                        printf("————————————————药品信息的输出————————————————\n");
                        List(head);
                        break;
                case 0:
                        printf("————————————————退出本系统————————————————\n");
                        exit(0);
                        }
                }
        }

zh741 发表于 2015-7-3 14:47:53

你是用链表存储的,查找和删除不到第二个之后的。说明你的链表有问题或者链表的索引有问题

1012662902 发表于 2015-7-3 23:16:20

不如用STL里的vector,比链表简单

nin98 发表于 2015-7-8 17:34:14

你这链表,是不能自由索引的,要用遍历的方法索引才行
页: [1]
查看完整版本: c语言制作的药品管理系统,出现了问题,请大神帮助