哈希表的应用

用哈希表写的一个小程序,仓库货物管理系统,时间复杂度可以达到O(1),速度比较快。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LENGTH 10000

typedef struct Table
{
char name[20];
   char factory[20];
   char transporter[20];
   int entertime;
   int number;
struct Table *next;
}Table;
void Input(Table *T);
void Filewrite(Table *T,FILE *fp);
void Fileread(FILE *fp,Table *T);
void Edit(Table *T);
void Insert(Table *T);
void Delete(Table *T);
void Search(Table *T);
void Print(Table *T);
void BigtoLittle(char *name);
int Hkey(char *name);
int H(int n);
int Getint(void);
void main(void)
{ Table T[LENGTH];
FILE *fp=0;
int flag,i;
char arry[10];
for(i=0;i<LENGTH;i++)
{ T[i].number=0;
    T[i].next=0;
}
fp=fopen("配置文件.txt","rb");
if(!fp)
{ printf("没有配置文件,请先输入信息");
    Input(T);
fp=fopen("配置文件.txt","wb");
    Filewrite(T,fp);
fclose(fp);
}
else
{ Fileread(fp,T);
    fclose(fp);
}
printf("            ---------------------------------------------------------/n");
printf("            |                                                       |/n");
printf("            |             ^_^ 欢迎使用仓库管理系统                  |/n");
printf("            | 货物信息 商品号,名称,生产商,供应商,库存量,进货日期   |/n");
printf("            ---------------------------------------------------------/n");
do
{ printf("/n 1,编辑 | 2,插入 | 3,删除 | 4,查找(以商品名字)| 5,输出所有信息 | 0,退出/n操作=");
flag=Getint();
switch(flag)
{
case 1: Edit(T); break;
case 2: Insert(T); break;
case 3: Delete(T); break;
case 4: Search(T); break;
case 5: Print(T);break;
case 0: break;
default : printf("/n*********对不起,选择无效!*******/n");
}
}while(flag);
printf("/n您想保存吗?/n||1,保存|0,不保存||/n选择=");
flag=Getint();
if(flag)
{ fp=fopen("配置文件.txt","wb");
Filewrite(T,fp);
fclose(fp);
}
printf("/n谢谢使用,按任意键继续/n");
getchar();
}
void Input(Table *T)
{ int i;
char name[20];
Table *p=0,*q=0;
printf("当输入货物名称时直接输入回车键即可结束程序/n");
while(1)
{ printf("请输入货物名称");
    gets(name);
if(strlen(name)<=1)
   return;
BigtoLittle(name);
i=Hkey(name);
if(!T[i].number)
{ T[i].number=i;
   strcpy(T[i].name,name);
   printf("请输入生产商/n生产商=");
      gets(T[i].factory);
      printf("请输入供应商/n供应商=");
      gets(T[i].transporter);
   printf("请输入库存量/n库存量=");
      T[i].number=Getint();
      printf("请输入进货时间,例如20080120/n进货时间=");
      T[i].entertime=Getint();
}
else
{ if(!T[i].next)
    { p=T[i].next=(Table *)malloc(sizeof(Table));
      p->number=i;
     strcpy(p->name,name);
     printf("请输入生产商/n生产商=");
        gets(p->factory);
        printf("请输入供应商/n供应商=");
        gets(p->transporter);
     printf("请输入库存量/n库存量=");
        p->number=Getint();
        printf("请输入进货时间,例如20080120/n进货时间=");
        p->entertime=Getint();
   p->next=0;
}
else
{ p=T[i].next;
   while(p->next)
    p=p->next;
       p=(Table *)malloc(sizeof(Table));
    p->number=i;
    strcpy(p->name,name);
     printf("请输入生产商/n生产商=");
        gets(p->factory);
        printf("请输入供应商/n供应商=");
        gets(p->transporter);
     printf("请输入库存量/n库存量=");
        p->number=Getint();
        printf("请输入进货时间,例如20080120/n进货时间=");
        p->entertime=Getint();
   p->next=0;
}
}
}
}
void Filewrite(Table *T,FILE *fp)
{ int i;
Table *p=0;
for(i=0;i<LENGTH;i++)
{ if(T[i].number)
{ fprintf(fp,"/t%s/t%s/t%s/t%d/t%d",T[i].name,T[i].factory,T[i].transporter,T[i].entertime,T[i].number);
    p=T[i].next;
while(p)
{ fprintf(fp,"/t%s/t%s/t%s/t%d/t%d",p->name,p->factory,p->transporter,p->entertime,p->number);
   p=p->next;
}
}
}
}
void Fileread(FILE *fp,Table *T)
{ Table S,*p=0;
int i=0;
while(feof(fp)!=1)
{ fprintf(fp,"/t%s/t%s/t%s/t%d/t%d",S.name,S.factory,S.transporter,S.entertime,S.number);
    i=Hkey(S.name);
if(!T[i].number)
{
T[i]=S;
   T[i].next=0;
}
      else
   { p=T[i].next;
     while(p)
    p=p->next;
   p=(Table *)malloc(sizeof(Table));
   (*p)=S;
   p->next=0;
   }

}
}
void Edit(Table *T)
{ int i=0,flag=0;
char name[20];
Table S,*p;
printf("请输入要编辑的货物的名称");
gets(name);
BigtoLittle(name);
i=Hkey(name);
if(T[i].number)
{ if(strcmp(name,T[i].name)==0)
{   printf("请输入生产商/n生产商=");
      gets(T[i].factory);
      printf("请输入供应商/n供应商=");
      gets(T[i].transporter);
   printf("请输入库存量/n库存量=");
      T[i].number=Getint();
      printf("请输入进货时间,例如20080120/n进货时间=");
      T[i].entertime=Getint();
   flag=1;
}
else
{ p=T[i].next;
while(p)
{ if(strcmp(name,p->name)==0)
{ printf("请输入生产商/n生产商=");
      gets(p->factory);
      printf("请输入供应商/n供应商=");
      gets(p->transporter);
   printf("请输入库存量/n库存量=");
      p->number=Getint();
      printf("请输入进货时间,例如20080120/n进货时间=");
      p->entertime=Getint();
   flag=1;
}
p=p->next;
}
}
}
if(!flag)
   printf("找不到货物%s",name);
}
void Insert(Table *T)
{ int i;
char name[20];
Table *p=0;
printf("请输入要插入的货物名称");
gets(name);
BigtoLittle(name);
i=Hkey(name);
if(!T[i].number)
{ T[i].number=i;
   strcpy(T[i].name,name);
   printf("请输入生产商/n生产商=");
      gets(T[i].factory);
      printf("请输入供应商/n供应商=");
      gets(T[i].transporter);
   printf("请输入库存量/n库存量=");
      T[i].number=Getint();
      printf("请输入进货时间,例如20080120/n进货时间=");
      T[i].entertime=Getint();
}
else
{ if(!T[i].next)
    { p=T[i].next=(Table *)malloc(sizeof(Table));
      p->number=i;
     strcpy(p->name,name);
     printf("请输入生产商/n生产商=");
        gets(p->factory);
        printf("请输入供应商/n供应商=");
        gets(p->transporter);
     printf("请输入库存量/n库存量=");
        p->number=Getint();
        printf("请输入进货时间,例如20080120/n进货时间=");
        p->entertime=Getint();
   p->next=0;
}
else
{ p=T[i].next;
   while(p->next)
    p=p->next;
       p=(Table *)malloc(sizeof(Table));
    p->number=i;
    strcpy(p->name,name);
     printf("请输入生产商/n生产商=");
        gets(p->factory);
        printf("请输入供应商/n供应商=");
        gets(p->transporter);
     printf("请输入库存量/n库存量=");
        p->number=Getint();
        printf("请输入进货时间,例如20080120/n进货时间=");
        p->entertime=Getint();
   p->next=0;
}
}
}
void Delete(Table *T)
{ int i,flag=0;
char name[20];
Table *p=0;
printf("请输入要删除的货物的名称");
gets(name);
i=Hkey(name);
if(T[i].number)
{ if(strcmp(name,T[i].name)==0)
{ if(!T[i].next)
{ T[i].number=0;
    flag=1;
}
else
{ p=T[i].next;
    T[i].next=0;
free(p);
flag=1;
}
}
else
{ p=T[i].next;
    if(strcmp(name,p->name)==0)
{ T[i].next=0;
     flag=1;
}
else
while(p->next)
{ if(strcmp(name,p->next->name)==0)
{ p->next=p->next->next;
     flag=1;
   break;
}
p=p->next;
}
}
}
if(!flag)
   printf("没有名称为%s的货物",name);
}
void Search(Table *T)
{ int i,flag;
char name[20];
Table *p=0;
printf("请输入要查找的货物的名称");
gets(name);
BigtoLittle(name);
i=Hkey(name);
if(T[i].number)
{ if(strcmp(name,T[i].name)==0)
{ printf("/n***********************货品名是%s的货物的信息如下:******************/n",name);
     printf("/n 货物名称%s 生产厂家%s 供货商%s 库存量%d 进货时间%d/n",T[i].name,T[i].factory,T[i].transporter,T[i].number,T[i].entertime);
     printf("/n************************************************************************/n");
flag=1;
}
else
{ p=T[i].next;
    while(p)
{ if(strcmp(name,p->name)==0)
    { printf("/n***********************货品名是%s的货物的信息如下:******************/n",name);
         printf("/n 货物名称%s 生产厂家%s 供货商%s 库存量%d 进货时间%d/n",p->name,p->factory,p->transporter,p->number,p->entertime);
         printf("/n************************************************************************/n");
      flag=1;
}
}
}
}
if(!flag)
   printf("没有名称为%s的货物",name);
}
void Print(Table *T)
{ int i;
Table *p=0;
printf("/n***********************货品的货物的信息如下:******************/n");
for(i=0;i<LENGTH;i++)
{ if(T[i].number)
{ printf("/n 货物名称%s 生产厂家%s 供货商%s 库存量%d 进货时间%d/n",T[i].name,T[i].factory,T[i].transporter,T[i].number,T[i].entertime);
    p=T[i].next;
while(p)
{ printf("/n 货物名称%s 生产厂家%s 供货商%s 库存量%d 进货时间%d/n",p->name,p->factory,p->transporter,p->number,p->entertime);
      p=p->next;
}
}
}
printf("/n************************************************************************/n");
}
void BigtoLittle(char *name)
{ int i,l;
l=strlen(name);
for(i=0;i<l;i++)
   if(name[i]>='A'&&name[i]<='Z')
    name[i]=name[i]+32;
}
int Hkey(char *name)
{ int i,l,s,sum,t;
l=strlen(name);
sum=0;
for(i=0;i<l;i++)
{ s=H(l-1-i)*name[i];
    sum=sum+s;
}
t=sum%LENGTH;
return t;
}
int H(int n)
{ int i,s=1;
if(n==0)
   return 1;
for(i=0;i<n;i++)
   s=s*9;
return s;
}
int Getint(void)
{ int m;
while(scanf("%d",&m)!=1)
{ while(getchar()!='/n')
     continue;
    printf("/n请输入一个整数!/n输入=");
}
while(getchar()!='/n')
     continue;
return m;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值