| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 506 人关注过本帖
标题:关于小型通讯录的问题
只看楼主 加入收藏
smileRan
Rank: 1
等 级:新手上路
帖 子:14
专家分:5
注 册:2011-4-4
结帖率:0
收藏
已结贴  问题点数:10 回复次数:2 
关于小型通讯录的问题
在下面的//处如何编写比较好?求教各位高手了

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define LEN sizeof(struct student)

/*定义通讯录链表结构体*/
struct student
{    char name[20];
    char tel[20];
    struct student *next;
};

int n=0;        /*当前通讯录中记录的个数*/
int savedtag=0;    /*是否已保存对当前通讯录所作的修改标记*/


/*按姓名查找通讯录中匹配的记录,有多个匹配记录时,都要显示出来*/
int find(struct student * head)
{
    char str[20];
    int n=0;
    struct student *p1=head;
    printf("请输入要查找记录的姓名:");
    gets(str);
    while(str[0]=='\0')
    {printf("请输入要查找记录的姓名:");gets(str);}
    if(head==NULL)
    {printf("找不到匹配的记录\n");return(n);}
    else
    {
        //此处按照输入的姓名在链表中查找记录,将找到的记录输出,并记录匹配的记录个数
        
        
        return(n);
    }
               
}

/*按姓名删除通讯录中匹配的记录,找到后需用户确认是否删除,
有多个匹配记录时,逐一找出来要求用户确认*/
struct student *del(struct student *head)
{    struct student *p1,*p2;
    char name[20],str[5];
    int i=0;

    printf("请输入要删除记录的姓名:");
    gets(name);
    while(name[0]=='\0')
    {printf("请输入要删除记录的姓名:");gets(name);}

    if(head==NULL) {printf("\n找不到要删除的记录\n");return(head);}

    //此处按照输入的姓名查找记录,找到后提示用户是否确认删除,如果有记录被删除将savedtag置1,以便最后确认文件被修改是否需要保存
    return(head);
}


/*将新的记录插入到通讯录中*/
struct student *insert(struct student *head)
{    struct student *p0,*p1,*p2;
    p1=head;

    p0=(struct student*) malloc(LEN);
    printf("请输入姓名:");
    gets(p0->name);
    while(p0->name[0]=='\0'){printf("请输入姓名:");gets(p0->name);}
    printf("请输入电话号码:");
    gets(p0->tel);
    while(p0->tel[0]=='\0'){printf("请输入电话号码:");gets(p0->tel);}

    //在链表中插入一个新记录,注意有新记录插入时将savedtag置1,以便最后确认文件被修改是否需要保存
    return(head);
}

/*显示通讯录中所有的记录*/
void print(struct student *head)
{      
    //对链表输出
}


/*将对当前通讯录所作的修改保存到文件中*/
void save(struct student *head,char filename[20])
{
    //将链表中的记录保存到文件中,保存后savedtag置0
    savedtag=0;
}

/*关闭当前通讯录,若当前通讯录尚有所作的修改未保存,询问用户是否需要保存*/
void closetxl(struct student *head,char filename[20])
{
    char str[5];
    struct student *p1,*p2;
    p1=p2=head;
    if(savedtag==1)
    {
        printf("通讯录已修改,是否需要保存?(y/n)");
        gets(str);
        while(1)
        if(str[0]=='Y'||str[0]=='y')
        {
            //将链表中的记录保存到文件中,并清空链表
            return;
        }
        else if(str[0]=='N'||str[0]=='n')
        {
            //不保存记录,并清空链表
            return;
        }
    }
}

void menu1()
{
    printf("\t\t**********************\n");
    printf("\t\t*   这是一个小型的   *\n");
    printf("\t\t*     通讯录程序。   *\n");
    printf("\t\t*      欢迎使用!    *\n");
    printf("\t\t**********************\n\n\n\n");
}

/*菜单处理函数*/
int menu3()
{
    char s[2];
    int cn=0;
    printf("\n\n请选择:1.增加记录 2.显示记录 3.删除记录 4.查找记录 5.保存记录 6.关闭通讯录\n\n");
    for(;;)
    {
        gets(s);
        cn=atoi(s);
        if(cn<1||cn>6) printf("\n输入错误,请选1~6:");
        else break;
    }
    return cn;
}


/*菜单处理函数*/
int menu2()
{
    char s[2];
    int cn=0;
    printf("\n\n请选择:\n1.新建通讯录文件\n2.打开通讯录文件\n3.合并通讯录文件\n4.退出程序\n\n");
    for(;;)
    {
        gets(s);
        cn=atoi(s);
        if(cn<1||cn>4) printf("\n输入错误,请选1~4:");
        else break;
    }
    return cn;
}

/*处理内存中的通讯录链表*/
void deallink(struct student *head,char filename[20])
{
    for(;;){
        switch(menu3())
        {
        case 1: head=insert(head);break;
        case 2: print(head);break;
        case 3: head=del(head);break;
        case 4: find(head);break;
        case 5: save(head,filename);break;
        case 6: closetxl(head,filename);return;
        }
    }
}

/*新建通讯录文件,若输入的文件名已存在,则重新输入*/
void creattxl()
{
    char str[20];
    FILE *fp;
    struct student *head;
    printf("请输入新通讯录文件的文件名:");
    gets(str);
    while(1){
    if(str[0]=='\0')
    {printf("请输入新通讯录文件的文件名:");gets(str);}
    else
    {if((fp=fopen(str,"rb"))!=NULL)    {fclose(fp);printf("该文件已经存在,请重新输入文件名:");gets(str);}
    else break;
    }};
    head=NULL;
    n=0;
    savedtag=0;
    deallink(head,str);

}

/*打开已存在的通讯录文件*/
void opentxl()
{
    char str[20];
    struct student *head,*p1,*p2;
    FILE *fp;
    printf("请输入要打开的通讯录文件的文件名:");
    gets(str);
    do{if((fp=fopen(str,"rb+"))==NULL)    {printf("该文件不能打开,请重新输入文件名:");gets(str);}
       else break;}while(1);
    head=NULL;

    n=0;
    savedtag=0;
    //打开文件,将文件中的记录读入内存并建立链表
    fclose(fp);

    deallink(head,str);
}


/*合并多个已存在的通讯录文件,并将合并后的通讯录保存到新的文件中*/
void hebintxl()
{
    char str[20];
    struct student *head,*p1,*p2;
    FILE *fp;
    int i=1;
    printf("请输入第%d个要合并的通讯录文件的文件名:",i);
   
    gets(str);
    do{if((fp=fopen(str,"rb+"))==NULL)    {printf("该文件不能打开,请重新输入文件名:");gets(str);}
       else {i++;break;}}while(1);


    head=NULL;
    n=0;
   
    //读入第一个通讯录文件,并建立链表
    fclose(fp);

    printf("要输入第%d个要合并的通讯录文件的文件名吗?(y/n):",i);
    gets(str);

    do{
        if(str[0]=='Y'||str[0]=='y')
        {
            printf("请输入第%d个要合并的通讯录文件的文件名:",i);
            gets(str);
            do{if((fp=fopen(str,"rb+"))==NULL)    {printf("该文件不能打开,请重新输入文件名:");gets(str);}
               else {i++;break;}}while(1);
            //读入第n个通讯录文件,并将记录加到第一个链表中
            fclose(fp);
        }
        else if(str[0]=='N'||str[0]=='n') break;
        
        printf("要输入第%d个要合并的通讯录文件的文件名吗?(y/n):",i);
        gets(str);

    }while(1);

    printf("请输入合并后的通讯录文件的文件名:");
    gets(str);
    while(1){
    if(str[0]=='\0')
    {printf("请输入合并后的通讯录文件的文件名:");gets(str);}
    else
    {if((fp=fopen(str,"rb"))!=NULL)    {fclose(fp);printf("该文件已经存在,请重新输入文件名:");gets(str);}
    else break;
    }};
   
    print(head);
    save(head,str);

    deallink(head,str);
}


main()
{
    menu1();
    for(;;){
        switch(menu2())
        {
        case 1:    creattxl();break;//新建通讯录文件
        case 2:    opentxl();break;//打开通讯录文件
        case 3:    hebintxl();break;//合并多个通讯录文件
        case 4:    exit(0);
        }
    }
}


[ 本帖最后由 smileRan 于 2011-6-3 20:19 编辑 ]
搜索更多相关主题的帖子: 结构体 通讯录 
2011-06-03 20:18
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:5 
void print(struct student *head)
{      
    //对链表输出
    stdent *p = head->next;
    while(p)
    {
        printf(p->data);
        p=p->next;
    }
}

                                         
===========深入<----------------->浅出============
2011-06-03 21:28
变幻小子
Rank: 6Rank: 6
来 自:广东陆丰
等 级:侠之大者
帖 子:188
专家分:473
注 册:2011-3-4
收藏
得分:5 
学习

明天的梦
2011-06-08 13:29
快速回复:关于小型通讯录的问题
数据加载中...
 
   



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

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