数据结构课程设计(五):散列文件的插入、删除和查找(C语言、文件、哈希查找)

题目要求

功能要求:
(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);
}

  • 0
    点赞
  • 20
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSnTi

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值