| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 656 人关注过本帖
标题:一个用哈希表实现的程序总是出错……
只看楼主 加入收藏
若为初见
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-4-6
结帖率:0
收藏
 问题点数:0 回复次数:1 
一个用哈希表实现的程序总是出错……
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>

#define LONGEST_LEN 20                /*使用哈希函数时最多的分类数目*/
#define NUMBER 10                     /*原文件中存储的图书信息的数目*/
#define NULL 0

struct book
{
    char chiname[20];                 /*图书的中文名*/
    char isbn[15];                    /*图书的ISBN码*/
    char autname[20];                 /*作者的名字*/
    char publishinghouse[50];         /*出版社名*/
    struct book *next;
};
typedef struct book BOOK;

BOOK *symtab[LONGEST_LEN];                        /*创建链表数组*/

char Menu();
void Print(BOOK *sym[]);
void Appendnode(BOOK *sym[]);
void Deletenode(BOOK *sym[],char Isbn[]);
void Modifynode(BOOK *sym[],char Isbn[]);
void lookup(BOOK *sym[],char Isbn[]);
unsigned int hash(char *str);
void SaveDocument(BOOK *sym[]);

void main()
{
    char c,isbn_num[15];
    int i;
    unsigned int h;
    BOOK *p0[NUMBER],*p1;
    for(i=0;i<NUMBER;i++)
    {
        p0[i]=(BOOK *)malloc(sizeof(BOOK));            /*为存储图书信息开辟空间*/
        p0[i]->next=NULL;                              /*将每一个节点都指向空*/
    }
    for(i=0;i<LONGEST_LEN;i++)
    {
        symtab[i]=NULL;                          /*将链表数组初始化为空*/
    }
    FILE *fp;
    fp=fopen("book1.txt","r");
    printf("                        The current document!\n");
    for(i=0;i<NUMBER;i++)
    {
        fscanf(fp,"%s %s %s %s\n",p0[i]->chiname,p0[i]->isbn,p0[i]->autname,p0[i]->publishinghouse); /*将文件中的内容读入散列表中*/
        h=hash(p0[i]->isbn);
        if(symtab[h]==NULL)
            symtab[h]=p0[i];
        else
        {
            p1=symtab[h];
            while(p1->next!=NULL)
                p1=p1->next;
            p1->next=p0[i];
        }
        /*采用表尾插入的方式向散列表中增加新的结点*/
    }
    fclose(fp);
    Print(symtab);
    while(1)
    {
        c=Menu();
        switch(c)
        {
            case'1':Appendnode(symtab);break;
            case'2':
            {
                printf("Please input the ISBN:\n");       /*通过ISBN查找需要删除的图书信息的节点*/
                scanf(" %s",isbn_num);
                Deletenode(symtab,isbn_num);
                break;
            }
            case'3':
            {
                printf("Please input the ISBN:\n");       /*通过ISBN查找需要修改的图书信息的节点*/
                scanf(" %s",isbn_num);
                Modifynode(symtab,isbn_num);
                break;
            }
            case'4':
            {
                printf("Please input the ISBN:\n");       /*通过ISBN查找需要查找的图书信息的节点*/
                scanf(" %s",isbn_num);
                lookup(symtab,isbn_num);
                break;
            }
            case'5':Print(symtab);break;
            case'6':SaveDocument(symtab);break;
            default:exit(0);
        }
    }
}

/*    函数功能:显示菜单并获得用户键盘输入的选项
    函数参数:无
    函数返回值:用户输入的选项
*/
char Menu()
{
    char ch;
    printf("\n                       The system of books!\n");
    printf("                           1.Appendnode\n");
    printf("                           2.Deletenode\n");
    printf("                           3.Modifynode\n");
    printf("                           4.Searchnode\n");
    printf("                           5.Printnode\n");
    printf("                           6.Savenode\n");
    printf("                       Please input your option:");
    scanf(" %c",&ch);
    return ch;
}

/*函数功能:打印散列表中存储的信息
  函数参数:链表数组的首地址
  函数的返回值:无
*/
void Print(BOOK *sym[])
{
    char c1[10]="book_name",c2[5]="ISBN",c3[12]="autor_name",c4[20]="publishing_house",c5[15]="hash_number";
    int i=0;
    BOOK *p[LONGEST_LEN],*p0;
    printf("%-15s%-18s%-14s%-15s%-15s\n",c5,c1,c2,c3,c4);
    while(i<LONGEST_LEN)
    {
        p[i]=symtab[i];
        p0=p[i];
        while(p0!=NULL)
        {
            printf("%5d  ",i);
            printf("%16s  ",p0->chiname);
            printf("%17s  ",p0->isbn);
            printf("%10s  ",p0->autname);
            printf("%15s\n",p0->publishinghouse);
            p0=p0->next;
        }
        i++;
    }
}

/*函数功能:向散列表中添加图书信息
  函数参数:链表数组的首地址
  函数返回值:无
*/
void Appendnode(BOOK *sym[])
{
    unsigned int h;
    BOOK *p,*p1;
    printf("Please input the data you want to append!\n");
    p=(BOOK *)malloc(sizeof(BOOK));
    printf("Please input the isbn number:");
    scanf(" %s",p->isbn);
    h=hash(p->isbn);
    if(sym[h]==NULL)
        sym[h]=p;
    else
    {
        p1=sym[h];
        while(p1->next!=NULL)
            p1=p1->next;
        p=p1->next;
    }
    printf("Please input the chinese name:");
    scanf(" %s",p->chiname);
    printf("Please input the author name:");
    scanf(" %s",p->autname);
    printf("Please input the publishinghouse name:");
    scanf(" %s",p->publishinghouse);
    printf("\n");
    Print(sym);
}

/*函数功能:删除指定ISBN码的结点
  函数参数:链表数组的首地址,需要删除的ISBN码序列
  函数返回值:无
*/
void Deletenode(BOOK *sym[],char Isbn[])
{
    unsigned int h;
    BOOK *p,*p0,*p1;
    h=hash(Isbn);
    p=sym[h];
    while(p!=NULL)
    {
        if(strcmp(p->isbn,Isbn)==0)
        {
            p0=p;
            break;
        }
        else p=p->next;
    }
    if(p==NULL)
        printf("The ISBN number has not been found!\n");
    else
    {
        p1=sym[h];
        if(p1->next!=p0) p1=p1->next;
        p1->next=p0->next;
        free(p0);
        Print(sym);
    }
}

/*函数功能:通过ISBN查找需要修改的图书信息的节点,选择需要修改的选项
  函数参数:链表数组的首地址,需要修改的ISBN码序列
  函数返回值:无
*/
void Modifynode(BOOK *sym[],char Isbn[])
{
    unsigned int h1;
    BOOK *p,*p0;
    h1=hash(Isbn);
    p=sym[h1];
    while(p!=NULL)
    {
        if(strcmp(p->isbn,Isbn)==0)
        {
            p0=p;
            break;
        }
        else p=p->next;
    }
    if(p==NULL)
        printf("The ISBN number has not been found!\n");
    else
    {
        scanf("%s",p0->chiname);
        scanf("%s",p0->autname);
        scanf("%s",p0->publishinghouse);
        printf("\n");
        Print(sym);
    }
}

/*函数功能:在散列表中按照ISBN码来查找相应的图书信息如果没有找到,则将该信息添加进散列表
  函数参数:链表数组的首地址,需要查找的ISBN码序列
  函数返回值:无
*/
void lookup(BOOK *sym[],char Isbn[])
{
    unsigned int h;
    BOOK *p,*p0;
    char c1[10]="book_name",c2[5]="ISBN",c3[12]="autor_name",c4[20]="publishing_house";
    h=hash(Isbn);
    p=sym[h];
    while(p!=NULL)
    {
        if(strcmp(p->isbn,Isbn)==0)
        {
            p0=p;
            break;
        }
        else p=p->next;
    }
    if(p!=NULL)
    {
        printf("The node has been found!\n");
        printf("%-5s%-10s%-5s%-5s",c1,c2,c3,c4);
        printf("%s  ",p->chiname);
        printf("%s  ",p->isbn);
        printf("%s  ",p->autname);
        printf("%s\n",p->publishinghouse);
    }
    else Appendnode(sym);
}
/*函数功能:利用除留余数法算出哈希表的值
  函数参数:指向字符型的指针
  函数返回值:无符号整形
*/
unsigned int hash(char *str)
{
    enum{SIZE=31};
    unsigned int i,h;
    h=0;
    for(i=0;i<LONGEST_LEN;i++)
        h=SIZE*h+str[i];
    return h%LONGEST_LEN;
}

/*函数功能:将修改后的图书信息存放到文件中
  函数参数:链表数组的首地址
  函数的返回值:无
*/
void SaveDocument(BOOK *sym[])
{
    int i=0;
    BOOK *p;
    FILE *fp;
    fp=fopen("book2.txt","w");
    while(i<LONGEST_LEN)
    {
        if(sym[i]!=NULL)
        {
            p=sym[i];
            while(p!=NULL)
            {
                fprintf(fp,"%s %s %s %s\n",p->chiname,p->isbn,p->autname,p->publishinghouse);
                p=p->next;
            }
            i++;
        }
        else i++;
    }
    fclose(fp);
}
大家好~我是一个初学者,对于C语言的很多用法语法都不是很了解……
老师布置了一个有关哈希表的程序,我写的程序有比较严重的问题,但是我却不知道要怎么改……
希望好心的大家帮帮我~

作业要求如下:
    添加文件读写功能,利用文件将图书信息存储和管理起来。基本要求如下
  1.读取文件内容,将文件信息读入到列表中,其内容包括书名,书号,作者,出版商等。
  2.在此基础上,实现对链表的增删改操作。
  3.构造散列表,将数据按照ISBN存放到散列表中。实现散列表的增删改操作。
  4.将修改的数据(增加了书信息,删除书信息,修改后的信息)存入文件,替换原有文件信息。

代码已上传,存储图书信息的文件内容为:
Ccxsj 9787302108535 thq qhdx
cxsjsj 3284610563149 bwk jjgy
dxjcwlx 9787302067221 zsh qhdx
dxwl 9787303099146 gj bjsfdx
gddsxtj 9787533129248 yzx sdkxjs
gdds 9787040119152 wef gdjy
sjqm 3819281937418 yqy wl
qnyt 3610374512857 yqy wl
ycxy 5710038275633 ly jl
wbsjnz 6729174018401 ly jl

 文件名称为“book1”。
谢谢大家了~最后时限是周一……麻烦大家了……
搜索更多相关主题的帖子: 函数 图书 
2011-04-09 22:28
若为初见
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-4-6
收藏
得分:0 
最后再来求助大家了……
时间就要到了……
麻烦大家了……
2011-04-11 17:00
快速回复:一个用哈希表实现的程序总是出错……
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053412 second(s), 9 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved