| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 782 人关注过本帖
标题:求大虾们帮忙修改这段程序
取消只看楼主 加入收藏
o_O燊
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2010-11-23
结帖率:33.33%
收藏
已结贴  问题点数:15 回复次数:5 
求大虾们帮忙修改这段程序
这段程序以.cpp保存可以编译运行,但是以.c格式保存却不能编译,求高手解决,老师规定要以.c格式上交啊,求高手转换
在此感激不尽啊啊

2楼的虽然改成可以编译了,但是算法好像改变了,在冲突那块有问题


程序代码:
#include<stdio.h>
#include<string>
#define MAXSIZE  20  //电话薄记录数量
#define MAX_SIZE 20    //人名的最大长度
#define HASHSIZE 35    //定义表长 
#define SUCCESS 1
#define UNSUCCESS -1
#define LEN sizeof(HashTable)
typedef int Status;
typedef char NA[MAX_SIZE];

typedef struct{//记录
    NA name;
    NA tel;
    NA add;
}Record;

typedef struct{//哈希表
    Record *elem[HASHSIZE];    //数据元素存储基址
    int count;                 //当前数据元素个数
    int size;                  //当前容量
}HashTable;

Status eq(NA x,NA y){//关键字比较,相等返回SUCCESS;否则返回UNSUCCESS
    if(strcmp(x,y)==0)
        return SUCCESS;
    else
        return UNSUCCESS;
}

Status NUM_BER;     //记录的个数

void getin(Record* a){//键盘输入各人的信息
    printf("输入要添加的个数:\n");
    scanf("%d",&NUM_BER);
    int i;   
    for(i=0;i<NUM_BER;i++){

        printf("请输入第%d个记录的用户名:\n",i+1);
        scanf("%s",a[i].name);
        printf("请输入%d个记录的电话号码:\n",i+1);
        scanf("%s",a[i].tel);
        printf("请输入第%d个记录的地址:\n",i+1);
        scanf("%s",a[i].add);        
    }
}

void ShowInformation(Record* a)//显示输入的用户信息
{   
    int i;
    for( i=0;i<NUM_BER;i++)                      
        printf("\n第%d个用户信息:\n 姓    名:%s\n 电话号码:%s\n 联系地址:%s\n",i+1,a[i].name,a[i].tel,a[i].add);
}                                   


long fold(NA s){//人名的折叠处理
    char *p;
    long sum=0;
    NA ss;
    strcpy(ss,s);//复制字符串,不改变原字符串的大小写
    strupr(ss);//将字符串ss转换为大写形式
    p=ss;
    while(*p!='\0')
        sum+=*p++;
    return sum;
}

int Hash1(NA str){//哈希函数
    long n;
    int m;
    n=fold(str);//先将用户名进行折叠处理
    m=n%HASHSIZE;     //折叠处理后的数,用除留余数法构造哈希函数
    return m;   //并返回模值
}


Status collision(int p,int &c){//冲突处理函数,采用二次探测再散列法解决冲突
    int i,q;
    i=c/2+1;
    while(i<HASHSIZE){
        if(c%2==0){
            c++;
            q=(p+i*i)%HASHSIZE;
            if(q>=0)
                return q;
            else
                i=c/2+1;
        }
        else{
            q=(p-i*i)%HASHSIZE;
            c++;
            if(q>=0)
                return q;
            else
                i=c/2+1;
        }
    }
        return UNSUCCESS;
}

void CreateHash1(HashTable* H,Record* a){//建表,以人的姓名为关键字,建立相应的散列表
                                        //若哈希地址冲突,进行冲突处理
    int i,p=-1,c,pp;                   
    for(i=0;i<NUM_BER;i++){                          
        c=0;
        p=Hash1(a[i].name);
        pp=p;
        while(H->elem[pp]!=NULL) {
            pp=collision(p,c);
            if(pp<0){
                printf("第%d记录无法解决冲突",i+1);//需要显示冲突次数时输出
                continue;
            }//无法解决冲突,跳入下一循环
        }
        H->elem[pp]=&(a[i]);  //求得哈希地址,将信息存入
        H->count++;
        printf("第%d个记录冲突次数为%d。\n",i+1,c);//需要显示冲突次数时输出
    }
    printf("\n建表完成!\n此哈希表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->count);
}


void SearchHash1(HashTable* H,int &c){//在通讯录里查找姓名关键字,若查找成功,显示信息
                                            //c用来记录冲突次数,查找成功时显示冲突次数
    NA str;
    printf("\n请输入要查找记录的姓名:\n");
    scanf("%s",str);
    int p,pp;
    p=Hash1(str);
    pp=p;
    while((H->elem[pp]!=NULL)&&(eq(str,H->elem[pp]->name)==-1))
        pp=collision(p,c);
    if(H->elem[pp]!=NULL&&eq(str,H->elem[pp]->name)==1){
        printf("\n查找成功!\n查找过程冲突次数为%d.以下是您需要要查找的信息:\n\n",c);
        printf("姓  名:%s\n电话号码:%s\n联系地址:%s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);
    }
    else
        printf("\n此人不存在,查找不成功!\n");
}



void menu(){
    int c,flag=1;
    HashTable *H;   
   int n=0;
    H=(HashTable*)malloc(LEN);
    for(int i=0;i<HASHSIZE;i++)
        H->elem[i]=NULL;
        H->size=HASHSIZE;
        H->count=0;
    Record a[MAXSIZE];
    while (1){

        printf("\n                             欢迎使用电话号码查找系统                 ");
        printf("\n");
        printf("\n                    【1】.  添加用户信息                           ");
        printf("\n                    【2】.  读取所有用户信息                       ");
        printf("\n                    【3】.  以姓名建立哈希表(再哈希法解决冲突)     ");
        printf("\n                    【4】.  查找并显示给定用户名的记录             ");
        printf("\n                    【5】.  退出程序                               "); 
        printf("\n           温馨提示:                                              "); 
        printf("\n                    Ⅰ.进行4操作前 请先输出3                       "); 
        printf("\n    ********************************************************************");
        printf("\n");
        printf("请输入一个任务选项>>>");
        printf("\n");
        int num;
        scanf("%d",&num);
        switch(num){
            case 1:
                getin(a); 
                break;
            case 2:
                ShowInformation(a);
                break;
            case 3:   
                CreateHash1(H,a);   /* 以姓名建立哈希表 */
                break;
             case 4:
                c=0;
                SearchHash1(H,c);
                break;   
            case 5:
                exit(0);
                break;
            default:
                printf("你输错了,请重新输入!");
                printf("\n");   
        }
    }
}

int main(){
    menu();
    return 0;
}


Text1.rar (2.43 KB)


[ 本帖最后由 o_O燊 于 2011-5-10 19:52 编辑 ]
搜索更多相关主题的帖子: 老师 上交 
2011-05-10 13:24
o_O燊
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2010-11-23
收藏
得分:0 
回复 2楼 诸葛修勤
改了哪里说下好吗,让我学习一下也好啊
2011-05-10 13:43
o_O燊
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2010-11-23
收藏
得分:0 
回复 4楼 诸葛修勤
发现问题,改了以后原来的解决冲突的方法不能用了
2011-05-10 15:39
o_O燊
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2010-11-23
收藏
得分:0 
有点急啊,来人啊
2011-05-10 19:52
o_O燊
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2010-11-23
收藏
得分:0 
回复 7楼 诸葛修勤
截图不好看,我直接录下来了
录像2.rar (386.1 KB)
2011-05-10 21:36
o_O燊
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2010-11-23
收藏
得分:0 
回复 7楼 诸葛修勤
我调试这段
程序代码:
void CreateHash1(HashTable* H,Record* a){//建表,以人的姓名为关键字,建立相应的散列表
                                        //若哈希地址冲突,进行冲突处理
    int i,*c,p=-1,pp;
    for(i=0;i<NUM_BER;i++){
        c=0;
        p=Hash1(a[i].name);
        pp=p;
        while(H->elem[pp]!=NULL)
        {
            pp=collision(p,c);
            if(pp<0){
                printf("第%d记录无法解决冲突",i+1);//需要显示冲突次数时输出
                continue;
            }//无法解决冲突,跳入下一循环
       
        H->elem[pp]=&(a[i]);  //求得哈希地址,将信息存入
        H->count++;}
        printf("第%d个记录冲突次数为%d。\n",i+1,c);//需要显示冲突次数时输出
    }
    printf("\n建表完成!\n此哈希表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->count);
}
发现这句printf("第%d个记录冲突次数为%d。\n",i+1,c);//需要显示冲突次数时输出
的变量c不会变
2011-05-10 21:38
快速回复:求大虾们帮忙修改这段程序
数据加载中...
 
   



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

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