您的位置:首页 > 其它

哈希表的应用

2010-06-02 10:57 134 查看
用哈希表写的一个小程序,仓库货物管理系统,时间复杂度可以达到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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: