标题:电话号码簿问题中的查找和排序问题求大神帮忙解决!
只看楼主
xwhqsj
Rank: 1
来 自:四川成都
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-9-16
结帖率:0
已结贴  问题点数:10 回复次数:4 
电话号码簿问题中的查找和排序问题求大神帮忙解决!
在实现查找和排序功能时,虽然代码没出错,但是功能并不能实现,又不知道怎么改,现在很急,求大神帮忙啊,我新手一个求带啊!
查找功能的要求是:输入要查找的姓名,若找到则输出这个人的全部信息,若找不到,则将这个人的新的信息插入到电话号码簿中,并且再次排序后打印出来;排序功能就是能够在每次打印前按照手机号的数值大小排序(假设手机号是3位数)
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
#define ERROR 0
#define OK 1
#define RL 200

typedef struct{
    char *name[RL];
    char *phonenum[RL];
    char *add[RL];
    int TD_length;
}telephoneDirectory;


int creat_telephoneDirectory(telephoneDirectory *P, int Length)//创建电话簿
{
    int i;
    for (i = 0; i<Length; i++){
        P->phonenum[i] = (char *)malloc(20 * sizeof(char));
        printf("电话号码%d:", i + 1);
        scanf("%s", P->phonenum[i]);
        P->name[i] = (char *)malloc(Length * 20 * sizeof(char));
        printf("姓名%d:", i + 1);
        scanf("%s", P->name[i]);
        P->add[i] = (char *)malloc(Length * 20 * sizeof(char));
        printf("家庭住址%d:", i + 1);
        scanf("%s", P->add[i]);
    }
    P->TD_length = Length;
    return OK;
}

int Inserti(telephoneDirectory *P)//插入操作
{
    int i, j;
    char CR_phone[20] = { '\0' }, CR_name[20] = { '\0' }, CR_add[20] = { '\0' };
    printf("请输入插入位置:");
    scanf("%d", &i);
    if (i<1 || i>P->TD_length + 1) return ERROR;
    printf("请输入插入的电话号码:");
    scanf("%s", CR_phone);
    printf("请输入插入的姓名:");
    scanf("%s", CR_name);
    printf("请输入插入的家庭住址:");
    scanf("%s", CR_add);
    P->phonenum[P->TD_length] = (char *)malloc(20 * sizeof(char));
    P->name[P->TD_length] = (char *)malloc(20 * sizeof(char));
    P->add[P->TD_length] = (char *)malloc(20 * sizeof(char));
    if (!P->phonenum[P->TD_length] || !P->name[P->TD_length] || !P->add[P->TD_length]) return ERROR;
    for (j = P->TD_length; j >= i; j--){
        //P->phonenum[j]=P->phonenum[j-1];
        //P->name[j]=P->name[j-1];
        strcpy(P->phonenum[j], P->phonenum[j - 1]);
        strcpy(P->name[j], P->name[j - 1]);
        strcpy(P->add[j], P->add[j - 1]);
    }
    strcpy(P->phonenum[i - 1], CR_phone);
    strcpy(P->name[i - 1], CR_name);
    strcpy(P->add[i - 1], CR_add);
    P->TD_length++;
    return OK;
}

int Deletei(telephoneDirectory *P)//删除操作
{
    int i, j;
    printf("请输入删除位置:");
    scanf("%d", &i);
    if (i<1 || i>P->TD_length) return ERROR;
    for (j = i; j <= P->TD_length; j++){
        P->phonenum[j - 1] = P->phonenum[j];
        P->name[j - 1] = P->name[j];
        P->add[j - 1] = P->add[j];
    }
    P->TD_length--;
    return OK;
}

int PrintfP(telephoneDirectory *P)//输出
{
    int i;
    printf("电话簿目前存储数量为:%d\n", P->TD_length);
    for (i = 0; i<P->TD_length; i++){
        printf("电话号码%d:%s   姓名%d:%s   家庭住址%d:%s\n", i + 1, P->phonenum[i], i + 1, P->name[i], i + 1, P->add[i]);
    }
    return OK;
}

int Sorti(telephoneDirectory *p)//排序操作
{
    int i, j;
    char temp;
    for (i = 0; i <= p->TD_length; i++){
        for (j = 0; j <= p->TD_length - j - 1; j++){
            if (p->phonenum[i]>p->phonenum[i + 1]){
                temp = *p->phonenum[i+1];
                p->phonenum[i+1] = p->phonenum[i];
                p->phonenum[i] = &temp;
            }
        }
    }
    return OK;
}[b]

int Locatei(telephoneDirectory *p, int *pos = NULL)//查找操作
{
    int i=0;
    char LC_name[20] = { '\0' };
    printf("请输入要查找的人物姓名: ");
    scanf("%s", LC_name);
    for(i=0;i<=p->TD_length;i++)
    {
        if(p->name[i] != LC_name)
        {
            Inserti(p);
            break;
        }
        else
        {
            *pos = i;
            PrintfP(p);
        }
    }
    Sorti(p);
    PrintfP(p);
    return OK;
}

int main()
{
    int length, operation;
    telephoneDirectory Q;
    printf("创建电话簿\n\n请输入电话簿用户数量:");
    scanf("%d", &length);
    creat_telephoneDirectory(&Q, length);
    while (1){
        printf("请选择您想对电话簿进行的操作:\n1、locate(查找).\n2、delete(删除).\n3、insert(插入).\n4、sort(排序).\n5、printfP(输出).\n6、end(结束).\n\n");
        printf("请选择您要进行的操作:");
        scanf("%d", &operation);
        printf("\n");
        if (operation == 6) break;
        if (operation == 5){
            PrintfP(&Q);
        }
        if (operation == 4){
            Sorti(&Q);
        }
        if (operation == 3){
            Inserti(&Q);
        }
        if (operation == 2){
            Deletei(&Q);
        }
        if (operation == 1){
            Locatei(&Q);
        }
    }
    //  free(&Q);
    return 0;
}
搜索更多相关主题的帖子: include 手机号 电话 信息 
2015-09-17 01:13
xwhqsj
Rank: 1
来 自:四川成都
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-9-16
得分:0 
版主大大,并非求作业啊!这两个问题里的调用函数一直用的不对,所以才来问的,调试了好久都没弄好

程序小白一个,求大神带飞,一心学习,绝无旁骛!
2015-09-17 01:28
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:5 
你查找操作有几处错误:
1、字符串比较不能直接比较,应使用strcmp函数比较
2、循环条件出错,应该是i<p->TD_length,不能i<=p->TD_length
3、逻辑错误,全部循环比较号码本中用户名后才能确定是否有自己要查找的,再决定是显示还是插入
4、函数Locatei形参里有个*pos=Null没区任何作用,估计原来是要提供返回的,但你的代码用不上。
5、这个代码绝对是你抄的,如果是自己写的很容易排除错误,也不会犯这些低级错误。函数Locatei修改后如下,拷贝替换即可(不保证你全部功能正常)
程序代码:
int Locatei(telephoneDirectory *p)//查找操作
{
    int i=0,k;
    char LC_name[20] = { '\0' };
    printf("请输入要查找的人物姓名: ");
    scanf("%s", LC_name);
    for(i=0,k=-1;i<p->TD_length;i++)
    {
        if(!strcmp(p->name[i],LC_name))
        {
            k=i;
            break;
        }
    }
    if(k>=0)printf("电话号码%d:%s   姓名%d:%s   家庭住址%d:%s\n", k+ 1, p->phonenum[k], k + 1, p->name[k], k + 1, p->add[k]);
    else
        Inserti(p);
    Sorti(p);
    return OK;
}

能编个毛线衣吗?
2015-09-17 10:29
xwhqsj
Rank: 1
来 自:四川成都
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-9-16
得分:0 
回复 3楼 wmf2014
额,谢谢,我已经改好了,没有用你的。。。

程序小白一个,求大神带飞,一心学习,绝无旁骛!
2015-09-17 22:30
来生再见
Rank: 1
来 自:江西省抚州市
等 级:新手上路
威 望:1
帖 子:39
专家分:9
注 册:2015-9-13
得分:5 
你这个是电话本的话为什么结构不是数组,

 telephoneDirectory Q

if(p->name[i] != LC_name) 比较用strcmp

你冒泡排序的for循环都错了
    for (i = 0; i <p->TD_length; i++){
        for (j = 0; j <= p->TD_length - j; j++){

 if (p->phonenum[i]>p->phonenum[i + 1])这2个数交换的时候,要用strcpy

重新开始,努力
2015-09-22 00:22



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




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

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