| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 555 人关注过本帖
标题:通讯录管理问题路过的大神帮忙看一下,感激不尽
只看楼主 加入收藏
赵繁
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-5-13
收藏
 问题点数:0 回复次数:0 
通讯录管理问题路过的大神帮忙看一下,感激不尽
已知程序要求通讯录的信息为:姓名、电话号码、类别、电子邮件,其中类别的类型有 :同事
类、朋友类、商务类、一般类),设计一程序,完成以下功能:
1) 能从键盘输入通讯录的信息(增加,输入时需要能检查该姓名的通讯录的记录是否已经存
在,如果存在,需要询问是否是覆盖还是增加,需要判断输入的类型是否存在)
2) 能从指定的文件中读入通讯录的信息
3) 能按姓名查询通讯录的信息
4) 能按分类查询通讯录的信息
5) 能删除指定姓名的通讯录的信息
6) 能将通讯录信息保存在指定的文件中
提示:
l  从文件读入学生信息时,需要先设计好文件的格式,从文件中读取数据后,按照预先设计
的格式分析数据,提取学生的信息,读入程序
l  可以使用一个结构体数组保存类别,类别结构体包含的信息为:类别代号,类别名称。(如
001,同事 则表示同事类),在输入通讯录信息时,只需要输入该类别对应的代号则可(查 询
类别数组中是否有该代号的记录),将该代号保存在通讯录信息中。显示时,根据代号在
类别结构体数组中查询其类别名称显示。

下面是我写的代码,程序在将通讯录信息保存在指定的文件中的时候出了点问题,保存的结果部分是乱码,
还有在查询的时候也遇到了问题,但是我检查了几遍都没发现问题出在哪里,求各位路过的大神帮忙修改一下,顺便告诉一下原因
小弟感激不尽!!!



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

typedef struct address            /* 通讯录信息结构 */
{  
    char name[50];   
    char tele[30];
    char clas[30];
    char email[30];
    struct address *next;
} ADDR;
ADDR *head;

void displayMenu();
int choiceItem();
void freeRecord(ADDR *head);
ADDR *addRecord(ADDR *head);
ADDR *createRecord(ADDR *head);
ADDR *deleteRecord(ADDR *head);
void searchRecord1(ADDR *head);
void searchRecord2(ADDR *head);
void saveFile(ADDR *head);
ADDR *readFile( );
void display(ADDR *head);

main( )
{
    ADDR *head = NULL;         /* 表头指针 */
    int choice,a;

    system("cls");
   
   
    do {
        
        choice = choiceItem( );            /* 菜单选择 */
        switch (choice)  {
        case 1:     head = createRecord(head );        /* 创建通讯录 */
            break;
        case 2:    head = addRecord(head);             /* 添加记录 */
            break;
        case 3:     head = deleteRecord(head);        /* 删除记录 */
            break;
        case 4:                                     /* 查找记录 */
            {                              
                printf("查找方式:1、按姓名查找;2、按分类查找\n");
                printf("请输入你的选择:");
                scanf("%d",&a);
                switch(a)
                {
                case 1:{
                    printf("按姓名查找:\n");
                    searchRecord1(head);
                       }
                    break;
                case 2:{
                    printf("按分类查找:\n");
                    searchRecord2(head);
                       }
                    break;
                }
            };               
            break;
        case 5:     display(head);                    /* 显示通讯录 */
            break;
        case 6:     saveFile(head);                    /* 保存到文件 */
            break;
        case 7:     head = readFile( );                /* 从文件读通讯录数据 */
            break;
        }
        
    } while(choice!=0);
    printf( "\n谢谢使用,再见!\n!");
    freeRecord(head);
}

void displayMenu(void)       /* 显示菜单 */
{
    printf("********************************欢迎使用通讯录系统******************************");
    printf("\n");
    printf("\n");
    printf("                                   1.创建通讯录                               \n");
    printf("                                   2.添加记录                                 \n");
    printf("                                   3.删除记录                                 \n");
    printf("                                   4.查询记录                                 \n");
    printf("                                   5.显示通讯录                               \n");
    printf("                                   6.保存到文件                               \n");
    printf("                                   7.读入文件                                 \n");
    printf("                                   0.退出通讯录                               \n");
    printf("\n");
    printf("\n");
    printf("********************************欢迎使用通讯录系统******************************");
   
   
    printf("\n请在0--7内选择:");
}

int choiceItem(void)          /* 菜单选择 */
{
    int choice;
    char line[80];
   
    do{
        displayMenu( );
        gets(line);
        choice = atoi(line);;
    } while(choice<0 || choice>7);
    return choice;
}

void freeRecord(ADDR *p)        /* 释放链表结点 */
{
    ADDR *q;
    while (p!=NULL) {
        q = p;
        p = p->next;
        free(q);                /* 依次释放各结点 */
    }
}

ADDR *addRecord(ADDR *p)        /* 输入一组记录,添加到链表中 */
{
    ADDR head, *q;
   
    head.next = p;
    p = &head;
    while (p->next!=NULL)        /* 将当前指针移动到链表尾端 */
        p = p->next;
   
    while(1) {
        char text[80];
        
        q = (ADDR *)malloc(sizeof(ADDR));
        if (q==NULL)
            return head.next;
        q->next = NULL;
        printf("\n\n输入姓名 电话 分类 邮件:\n ");
        gets(text);                                /* 读取一行文本 */
        if (text[0]=='\0')     break;                /* 空行为结束标志 */
        sscanf(text, "%s%s%s%s", q->name, q->tele,q->clas,q->email);
        p->next = q;            /* 在链表尾端添加结点 */
        p = q;                    /* 更新当前指针 */
    }
    return head.next;
}

ADDR *createRecord(ADDR *p)        /* 创建新通讯录 */
{
    freeRecord(p);                /* 释放原链表所占空间 */
    return addRecord(NULL);        /* 输入一组记录,创建链表 */
}

ADDR *deleteRecord(ADDR *p)       /* 根据输入的姓名删除记录 */
{
    char name[32];
    ADDR *q, head;                /* 前驱结点 */
   
    printf("\n输入要删除的记录姓名: ");
    gets(name);                    /* 输入姓名 */
   
    for (head.next=p, q=&head; p!=NULL; p=p->next) {
        if (strcmp(p->name, name)!=0)     /* 不等于当前结点中的姓名 */   
            q = p;                        /* 以当前结点作为前驱结点 */
        else {
            q->next = p->next;            /* 从链表中移出当前结点 */
            free(p);                     /* 释放当前结点 */
            printf("\n删除成功.\n", name);
            return head.next;
        }
    }
    printf("\n没有%s的记录\n", name);
    return head.next;
}

void searchRecord1(ADDR *p)          /* 通过输入的姓名查询记录 */
{
    char name[32];
   
   
    if(head->next==NULL)
    {
        printf("无记录!\n");
        return;
    }
    printf("请输入要查找的姓名:\n");
    scanf("%s",&name);
    for(p=head->next;p!=NULL;p=p->next)
    {
        if(strcmp(p->name,name)==0)
        {
            printf("姓名\t类别\t电话\t邮件\\n");
            printf("%s\t%s\t%s\t%s\n",p->name,p->clas,p->tele,p->email);
        }
        else  if(p->next==NULL)
            printf("无此信息!\n");
    }
}
     


void searchRecord2(ADDR *p)          /* 通过输入的分类查询记录 */
{
    char clas[32];
   
    if(head->next==NULL)
    {
        printf("无记录!\n");
        return;
    }
    printf("请输入要查找的分类:\n");
    scanf("%s",&clas);
    for(p=head->next;p!=NULL;p=p->next)
    {
        if(strcmp(p->clas,clas)==0)
        {
            printf("姓名\t类别\t电话\t邮件\\n");
            printf("%s\t%s\t%s\t%s\n",p->name,p->clas,p->tele,p->email);
        }
        else  if(p->next==NULL)
            printf("无此信息!\n");
    }
     
}

void saveFile(ADDR *p)             /* 将记录信息写入文件 */
{
    FILE *fp;
    char fname[32];
   
    printf("\n输入文件名: ");
    gets(fname);                            /* 输入文件名 */
    if ((fp = fopen(fname, "wb"))==NULL) {    /* 打开文件 */
        printf("Cannot open this file!\n");
        return;
    }
   
       for (; p!=NULL; p=p->next)                /* 遍历链表 */
        fwrite(p, sizeof(ADDR), 1, fp);        /* 写一个记录到文件 */
    fclose(fp);
    printf("写入成功!\n");
}

ADDR *readFile(void)                   /* 从文件中读取记录信息 */
{
    ADDR *p, *q, head = { "","", NULL };
    FILE *fp;
    char fname[32];
   
    printf("\n输入文件名: ");
    gets(fname);                                /* 输入文件名*/
    if ((fp=fopen(fname, "rb")) == NULL) {        /* 打开文件 */
        printf("Cannot open this file!\n");
        return NULL;
       }
   
    q = &head;                        /* 尾端结点指针 */
    while(!feof(fp)) {                /* 读结束? */
        p = (ADDR *)malloc(sizeof(ADDR));
        if (p==NULL)
            break;
        p->next = NULL;
        if (1!=fread(p, sizeof(ADDR), 1, fp))
            break;                /* 读失败时 */
        q->next = p;            /* 在链表尾端添加 */
        q = p;                    /* 更新尾端指针 */
    }
    fclose(fp);                    /* 关闭文件 */
    printf("读取成功!\n");
    return head.next;
}

void display(ADDR *p)          /* 显示所有记录信息 */
{
   
    for (; p!=NULL; p=p->next)
        printf("\n姓名:%s\t电话:%s\t分类:%s\t邮件:%s\n", p->name, p->tele,p->clas,p->email);
    printf("\n");
}
搜索更多相关主题的帖子: 信息 通讯录 
2012-06-16 04:03
快速回复:通讯录管理问题路过的大神帮忙看一下,感激不尽
数据加载中...
 
   



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

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