首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

大神帮小弟我看下错哪了(哈希表按手机号为关键字查找)

2013-06-25 
大神帮我看下哪里错了(哈希表按手机号为关键字查找) //creathash函数里的for循环里有错,j在33到41行之间j

大神帮我看下哪里错了(哈希表按手机号为关键字查找)
 //creathash函数里的for循环里有错,j在33到41行之间j发生了变化,怎么回事呢??(附图)大神帮小弟我看下错哪了(哈希表按手机号为关键字查找)大神帮小弟我看下错哪了(哈希表按手机号为关键字查找)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
typedef struct
{
    char phone[11];
    char name[20];
    char stuid[8];
}DATA;
void inserthash(DATA* hash,int m,char* dataphone,char* dataname,char *datastuid )//????
{
    int i;
    i=(dataphone[9]-'0')*10+(dataphone[10]-'0');
    while(hash[i].phone[0]!='\0')
    {
       // i=(++i) % m ;
       ++i;
       i%=m;
    }
    strcpy(hash[i].phone,dataphone);
    strcpy(hash[i].name,dataname);
    strcpy(hash[i].stuid,datastuid);
}
void creathash(DATA* hash,int m,int n)
{
    int j;
    char dataphone[11],dataname[20],datastuid[8];
    printf("n=%d\n",n);
    for(j=0;j<n;j++)
    {
        printf("j1=%d\n",j);
        if(j==0)
            printf("\n输入学生手机号:");
        else
        printf("\n输入下一个学生手机号:");
        scanf("%s",dataphone);
        printf("\n输入学生姓名:");
        scanf("%s",dataname);
        printf("\n输入学生学号:");
        scanf("%s",datastuid);
        printf("j2=%d\n",j);
        inserthash(hash,m,dataphone,dataname,datastuid );//????
        printf(".....下一次循环...\n");
    }
        printf("输入结束\n");
}
int hashsearch(DATA* hash,int m,char* key)
{
    int i;
    i=(key[9]-'0')*10+(key[10]-'0');
    while(strcmp(hash[i].phone,"\0")!=0&&strcmp(hash[i].phone,key)!=0)
    //i=(++i)%100;
    ++i;
    i%=m;
    if(strcmp(hash[i].phone,"\0")==0)
        return -1;
    else
     return i;
}

int main()
{
    char find[11];
    int num,k;
    DATA hash[SIZE];
    printf("输入学生个数:");
    scanf("%d",&num);
    creathash(hash,100,num);
    printf("\n输入查找的手机号");
    scanf("%s",find);
    k=hashsearch(hash,100,find);
    if(k<0)
    printf("查找失败\n");
    else
    {
        printf("序号为%d\n",k);


        printf("姓名为:%s\n",hash[k].name);
        printf("学号为:%s\n",hash[k].stuid);
    }
    return 0;
}




数据结构
[解决办法]


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
typedef struct
{
    char phone[12];//加大数组
    char name[20];
    char stuid[9];
}DATA;
void inserthash(DATA* hash,int m,char* dataphone,char* dataname,char *datastuid )//????
{
    int i;
    i=(dataphone[9]-'0')*10+(dataphone[10]-'0');
    while(hash[i].phone[0]!='\0')
    {
       // i=(++i) % m ;
       ++i;
       i%=m;
    }
    strcpy(hash[i].phone,dataphone);
    strcpy(hash[i].name,dataname);
    strcpy(hash[i].stuid,datastuid);
}
void creathash(DATA* hash,int m,int n)
{
    int j;
    char dataphone[12],dataname[20],datastuid[9];//这里数组太小了。。11位的电话号码应该开12的数组。。还有以为'\0'。。
    printf("n=%d\n",n);
    for(j=0;j<n;j++)
    {
        printf("j1=%d\n",j);
        if(j==0)
            printf("\n输入学生手机号:");
        else
        printf("\n输入下一个学生手机号:");
        scanf("%s",dataphone);
        printf("\n输入学生姓名:");
        scanf("%s",dataname);
        printf("\n输入学生学号:");
        scanf("%s",datastuid);
        printf("j2=%d\n",j);
        inserthash(hash,m,dataphone,dataname,datastuid );
        printf(".....下一次循环...\n");
    }
    printf("输入结束\n");
}
int hashsearch(DATA* hash,int m,char* key)
{
    int i;
    i=(key[9]-'0')*10+(key[10]-'0');
    while(strcmp(hash[i].phone,key)!=0){
//i=(++i)%100;
++i;
i%=m;
}
    if(strcmp(hash[i].phone,"")==0)
        return -1;
    else return i;
}

int main()
{


    char find[12];//加大数组。。
    int num,k;
    DATA hash[SIZE];
//这里应该先清0。。
for(int i = 0; i < SIZE; ++i) hash[i].phone[0] = '\0';
    printf("输入学生个数:");
    scanf("%d",&num);
    creathash(hash,100,num);
    printf("\n输入查找的手机号");
    scanf("%s",find);
    k=hashsearch(hash,100,find);
    if(k<0) 
printf("查找失败\n");
    else
    {
        printf("序号为%d\n",k);
        printf("姓名为:%s\n",hash[k].name);
        printf("学号为:%s\n",hash[k].stuid);
    }
    return 0;
}

热点排行