题目要求
功能要求:
(1)初始化三列文件;
(2)向散列文件中插入一个元素;
(3)从散列文件中删除一个元素;
(4)从散列文件中查找一个元素。
散列文件通常采用链接法处理冲突。
散列文件中每个节点的类型定义为:
Struct FLNode
{ //散列主文件中的节点类型
ElemType data ; //值域
Int next; //指向下一个节点的指针域
};
代码实现
主函数 main.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "biao.h"
int main()
{
int com;
while(1)
{
Introduce();
scanf("%d",&com);
switch(com)
{
case 1:Create();break;//初始化散列文件
case 2:MN();Insert();break;//向散列文件中插入一个元素
case 3:MN();Delete();break;//从散列文件中删除一个元素
case 4:MN();Find();break;//从散列表中查找一个元素
case 5:MN();Printff();break;//输出散列表中的全部元素
case 6:system("cls");break;
case 7:exit(1);break;
default :printf("没有该操作,请重新输入:\n");
}
}
return 0;
}
头文件 biao.h
#ifndef BIAO_H_INCLUDED
#define BIAO_H_INCLUDED
typedef int ElemType;
typedef struct FLNode
{
ElemType data;
int next;
}FLNode;
int m,n;//n是要生成散列表的长度,m是<=n的最小素数
char dizhi[1000];//存放散列文件的地址
char * moren;//存储默认文件的地址
FLNode *biao;//读取文件信息后的存放地址
void Create();
void Insert();
void Printff();
int qiusushu(int a);
void MN();//计算m,n
void Delete();
void Find();
void Introduce();
#endif // BIAO_H_INCLUDED
功能介绍 Introduce.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "biao.h"
void Introduce()
{
printf("*******************1表示初始化散列文件*********************\n");
printf("*******************2表示向散列文件中插入一个元素***********\n");
printf("*******************3表示从散列文件中删除一个元素***********\n");
printf("*****4表示从散列表中查找一个元素是否存在,并返回比较次数***\n");
printf("*******************5表示输出散列表中的全部元素*************\n");
printf("*******************6表示清屏*******************************\n");
printf("*******************7表示退出系统***************************\n");
}
初始化散列文件 Create.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "biao.h"
int qiusushu(int a)
{
int i,j,flag=1;
for(i=a;i>=0;i--)
{
for(j=2;j<i;j++)
{
if(i%j==0)
{
flag=0;
break;
}
}
if(flag==1)
return i;
flag=1;
}
}
void Create()
{
printf("请输入您要创建文件的地址,默认地址为“C:\\Users\\Administrator\\Desktop\\散列表的删除插入和查询\\散列表的删除插入和查询.txt”\n");
printf("您是否选择默认地址?是--1,不是--2\n");
int com,i;
scanf("%d",&com);
switch (com)
{
case 1:
{
//strcpy(dizhi,moren);
moren="C:\\Users\\Administrator\\Desktop\\散列表的删除插入和查询\\散列表的删除插入和查询.txt";
strcpy(dizhi,moren);//将文件地址存入dizhi【】数组中
printf("请输入要创建的散列表的长度:\n");
scanf("%d",&n);
m=qiusushu(n);
biao=(FLNode *)malloc((m+n)*sizeof(FLNode));
for(i=0;i<m+n;i++)//将散列表初始化,data和next全赋为-1
{
biao[i].data=-1;
biao[i].next=-1;
}
biao[0].data=m;//将m存放在biao[0].data中方便以后求m,n
biao[1].data=n;//将n存放在biao[1].data中
FILE *fp;
if((fp=fopen(dizhi,"w"))==NULL)
{
printf("文件打开失败!!!\n");
exit(1);
}
fwrite(biao,sizeof(FLNode),m+n,fp);//将散列表写入散列文件中
fclose(fp);
free(biao);
printf("文件创建成功!!!\n");
break;
}
case 2:
{
printf("请输入您要创建的散列文件的位置:\n");
scanf("%s",dizhi);
printf("请输入要创建的散列表的长度:\n");
scanf("%d",&n);
m=qiusushu(n);
biao=(FLNode *)malloc((m+n)*sizeof(FLNode));
for(i=0;i<m+n;i++)
{
biao[i].data=-1;
biao[i].next=-1;
}
biao[0].data=m;
biao[1].data=n;
FILE *fp;
if((fp=fopen(dizhi,"w"))==NULL)
{
printf("文件创建失败!!!\n");
exit(1);
}
fwrite(biao,sizeof(FLNode),m+n,fp);
fclose(fp);
free(biao);
printf("文件创建成功!!!\n");
break;
}
}
}
/*
C:\\Users\\Administrator\\Desktop\\散列表的删除插入和查询\\散列表.txt
C:\\Users\\Administrator\\Desktop\\散列表的删除插入和查询\\散列表的删除插入和查询.txt
*/
m、n生成 MN.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "biao.h"
void MN()
{
printf("请输入您要打开文件的地址:\n");
scanf("%s",dizhi);
FILE *fp;
if((fp=fopen(dizhi,"r"))==NULL)
{
printf("文件打开失败!!!\n");
exit(1);
}
biao=(FLNode *)malloc(2*sizeof(FLNode));
fread(biao,sizeof(FLNode),2,fp);
fclose(fp);
m=biao[0].data;
n=biao[1].data;
//printf("%d %d\n",m,n);
free(biao);
}
插入元素 Insert.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "biao.h"
void Insert()
{
int num,i;
printf("请输入您要插入的数据:\n");
scanf("%d",&num);
FILE *fp;
if((fp=fopen(dizhi,"r"))==NULL)
{
printf("文件打开失败!!!\n");
exit(1);
}
biao=(FLNode *)malloc((m+n)*sizeof(FLNode));
fread(biao,sizeof(FLNode),m+n,fp);//将散列文件中的信息读取出来
fclose(fp);
if((fp=fopen(dizhi,"w"))==NULL)
{
printf("文件打开失败!!!\n");
exit(1);
}
for(i=m;i<m+n;i++)//从散列表的后n个位置开始找,找到第一个空(数据域为-1)的位置,将数据num利用头插法
{
if(biao[i].data==-1)
{
biao[i].data=num;
biao[i].next=biao[num%m].next;
//printf("%d %d ",i,biao[num%m].next);
biao[num%m].next=i;
// printf("%d\n",biao[num%m].next);
break;
}
}
fwrite(biao,sizeof(FLNode),m+n,fp);//在将散列表中的信息写入散列文件
fclose(fp);
free(biao);
printf("数据插入成功!!!\n");
}
删除元素 Delete.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "biao.h"
void Delete()
{
int num,num1,flag=0,rnum;
printf("请输入您要删除的数据:\n");
scanf("%d",&num);
FILE *fp;
if((fp=fopen(dizhi,"r"))==NULL)
{
printf("文件打开失败!!!\n");
exit(1);
}
biao=(FLNode *)malloc((m+n)*sizeof(FLNode));
fread(biao,sizeof(FLNode),m+n,fp);//将散列文件中的信息读取出来
fclose(fp);
num1=num%m;
if(biao[num1].next==-1)
{
printf("散列文件中没有此数据!!!\n");
return;
}
else
{
rnum=num1;
num1=biao[num1].next;
while(num1!=-1)
{
if(biao[num1].data==num)
{
biao[rnum].next=biao[num1].next;
biao[num1].data=-1;
biao[num1].next=-1;
flag=1;//找到了就将flag变成0
break;
}
rnum=num1;
num1=biao[num1].next;
}
if(flag==0)
{
printf("散列文件中没有此数据!!!\n");
return;
}
else
printf("删除成功!!!\n");
if((fp=fopen(dizhi,"w"))==NULL)
{
printf("文件打开失败!!!\n");
exit(1);
}
fwrite(biao,sizeof(FLNode),m+n,fp);//再将散列表中的数据写入散列文件
fclose(fp);
free(biao);
}
}
查找元素 Find.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "biao.h"
void Find()
{
int num,num1,cishu=0,flag=0;
printf("请输入您要查找的数据:\n");
scanf("%d",&num);
FILE *fp;
if((fp=fopen(dizhi,"r"))==NULL)
{
printf("文件打开失败!!!\n");
exit(1);
}
biao=(FLNode *)malloc((m+n)*sizeof(FLNode));
fread(biao,sizeof(FLNode),m+n,fp);//将散列文件中的信息读取出来
fclose(fp);
num1=num%m;
if(biao[num1].next==-1)
{
printf("散列文件中没有此数据!!!\n");
return;
}
else
{
num1=biao[num1].next;
while(num1!=-1)
{
cishu++;//记录查找到该数据进行比较的次数
if(biao[num1].data==num)
{
flag=1;//记录是否查找到该数据,找到让flag=0
break;
}
num1=biao[num1].next;
}
if(flag==0)
{
printf("散列文件中没有此数据!!!\n");
return;
}
else
printf("散列表中有该数据,共比较了%d次\n",cishu);
}
}
输出散列表 printff.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "biao.h"
void Printff()
{
int i;
FILE *fp;
if((fp=fopen(dizhi,"r"))==NULL)
{
printf("文件打开失败!!!\n");
exit(1);
}
biao=(FLNode *)malloc((m+n)*sizeof(FLNode));
fread(biao,sizeof(FLNode),m+n,fp);
fclose(fp);
for(i=m;i<m+n;i++)
{
if(biao[i].data!=-1)
{
printf("%d ",biao[i].data);
}
}
printf("\n");
free(biao);
}