标题:求大虾们帮忙修改这段程序
只看楼主
o_O燊
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2010-11-23
结帖率:33.33%
已结贴  问题点数:15 回复次数:10 
求大虾们帮忙修改这段程序
这段程序以.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
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
得分:15 
程序代码:
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#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)
{//键盘输入各人的信息
    int i; 
    printf("输入要添加的个数:\n");
    scanf("%d",&NUM_BER);

    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){//在通讯录里查找姓名关键字,若查找成功,显示信息
    int p,pp;                                        //c用来记录冲突次数,查找成功时显示冲突次数
    NA str;
    printf("\n请输入要查找记录的姓名:\n");
    scanf("%s",str);

    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(){
    Record a[MAXSIZE];
    int c,flag=1;
    int i;
    int n=0;
    int num;
    HashTable *H;   

    H=(HashTable*)malloc(LEN);
    for(i=0;i<HASHSIZE;i++)
        H->elem[i]=NULL;
        H->size=HASHSIZE;
        H->count=0;

    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");

        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;
}

收到的鲜花
  • o_O燊2011-05-10 13:48 送鲜花  3朵   附言:谢谢你的修改,麻烦说下改的地方和原因好吗 ...
  • o_O燊2011-05-10 13:49 送鲜花  3朵  
2011-05-10 13:30
o_O燊
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2010-11-23
得分:0 
回复 2楼 诸葛修勤
改了哪里说下好吗,让我学习一下也好啊
2011-05-10 13:43
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
得分:0 
c中没有引用(&)的概念

c中局部变量必须定义在函数的开头

头文件包含的时候的文件名后缀 .h

上面的代码中就这些
收到的鲜花
  • o_O燊2011-05-10 14:07 送鲜花  2朵   附言:谢谢,还有,我发现输入3个用户以上再建立散 ...
2011-05-10 13:58
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
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
得分:0 
你把自己原来.cpp文件正确运行的操作截图看下
2011-05-10 21:24
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
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
得分:0 
程序代码:
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#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)
{//键盘输入各人的信息
    int i;
    printf("输入要添加的个数:\n");
    scanf("%d",&NUM_BER);

    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){//在通讯录里查找姓名关键字,若查找成功,显示信息
    int p,pp;                                        //c用来记录冲突次数,查找成功时显示冲突次数
    NA str;
    printf("\n请输入要查找记录的姓名:\n");
    scanf("%s",str);

    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(){
    Record a[MAXSIZE];
    int c,flag=1;
    int i;
    int n=0;
    int num;
    HashTable *H;   

    H=(HashTable*)malloc(LEN);
    for(i=0;i<HASHSIZE;i++)
        H->elem[i]=NULL;
        H->size=HASHSIZE;
        H->count=0;

    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");

        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;
}

收到的鲜花
  • o_O燊2011-05-10 23:16 送鲜花  3朵   附言:OK了,谢谢
2011-05-10 22:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-339397-1-1.html




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

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