C语言通讯录1.3

  1、修改了往文件里存储和从文件里都出来的过程。使用了fread,fwrite.

  2、注意fread和fwrite使用时,若数据块是结构体,则结构体中的指针域也将被写进文件或从文件中读出。

 

 

/**************************************

电子通讯录:

  内容:序号,姓名,电话,住址。

  功能:添加好友、删除好友、清空联系人、好友排序、搜索好友、显示所有联系人。

    添加好友:如果重名,可选择覆盖或新建。

    好友排序:可选择按姓氏正序排或逆序排。

    删除好友:若遇到重名好友,则按序号删除。

****************************************/

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

 

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

#include<unistd.h>

 

typedef structPeople{

    char ID[20];         //序号

    char name[20];  //姓名

    char phone[20]; //号码

    char add[20];   //住址

    struct People *next;

}List;

 

/********主界面**********/

int menu()

{

    int choice;

  

    printf("\n");

    printf("0----添加好友\n");

    printf("1----显示好友列表\n");

    printf("2----搜索好友\n");

    printf("3----删除好友\n");

    printf("4----好友排序\n");

    printf("5----清空联系人\n");

    printf("6----保存联系人至文件\n");

    printf("7----读取文件中联系人\n");

    printf("8----退出\n");    

    scanf("%d",&choice);       

 

    return choice;

}

 

//添加联系人

void Add(List*people)

{

    List *p,*r;

   

    r = people;

    p = (List *)malloc(sizeof(List));

    printf("请输入序号:\n");

    scanf("%s",p->ID);

    printf("请输入姓名:\n");

    scanf("%s",p->name);

    printf("请输入电话:\n");

    scanf("%s",p->phone);

    printf("请输入地址:\n");

    scanf("%s",p->add);

    while(r->next != NULL)

    {

        r = r->next;

    }

    r->next = p;

    p->next = NULL;

    printf("\n添加成功!\n");

}

 

//显示

void Display(List*people)

{

    List *p;   

 

    p = people->next;

    printf("好友列表:\n");

    printf("序号\t\t姓名\t\t电话\t\t住址\n");

    while(p != NULL)

    {

        printf("%s\t\t",p->ID);

        printf("%s\t\t",p->name);

        printf("%s\t\t",p->phone);

        printf("%s\t\t",p->add);

        p = p->next;

        printf("\n");

    }

}

//搜索好友

void Search(List*people)

{

    List *p;

    char name[10];     //搜索人的姓名

   

    p = people->next;

    if(p != NULL)

    {

        printf("请输入要搜索人的姓名:\n");

        scanf("%s",name);

        while(p != NULL)

        {

            if(strcmp(p->name,name) == 0)

            {

                printf("%s  ",p->ID);

                printf("%s  ",p->name);

                printf("%s  ",p->phone);

                printf("%s  ",p->add);

                printf("\n");

            }

            p = p->next;

        }

    }

    else

    {

        printf("联系人为空,无法搜索!\n");

    }

}

//删除联系人

void Delete(List*people)

{

    char name[10];

    List *p,*r;

    int count = 0;

    char ID[10];

  

    p = people->next;

    if(p != NULL)

    {

        printf("\n请输入要删除人的姓名:\n");

        scanf("%s",name);

        while(p != NULL)

        {

            if(strcmp(p->name,name) == 0)

            {

                count++;

            }

            p = p->next;

        }

        if(count == 1)

        {

            p = people;

            r = people->next;

            while(r != NULL)

            {

                if(strcmp(r->name,name) ==0)

                {

                    p->next = r->next;

                    break;

                }

                p = p->next;

                r = r->next;

            }

        }

        if(count > 1)

        {

            r = people->next;

            while(r != NULL)

            {

                if(strcmp(r->name,name) ==0)

                {

                    printf("%s %s %s%s\n",r->ID,r->name,r->phone,r->add);

                }

                r = r->next;

            }

            printf("请选择序号删除;\n");

            scanf("%s",ID);

            p = people;

            r = people->next;

            while(r != NULL)

            {

                if(strcmp(r->ID,ID) == 0)

                {

                    p->next = r->next;

                    r = p->next;

                }

                else

                {

                    p = p->next;

                    r = r->next;

                }

            }          

        }

        printf("删除成功!\n");

    }

    else

    {

        printf("联系人为空,无法删除!\n");

    }

}

//排序

void Sort(List*people)

{

    List *pre,*p,*tail,*temp;

  

    tail = NULL;

    p = people->next;

    if(p != NULL)

    {

        while(tail != people->next->next)

        {

            pre = people;

            p = people->next;

            while(p->next != tail)

            {

           if(strcmp(p->name,p->next->name) == 1)

                {

                    pre->next = p->next;

                    p->next =pre->next->next;

                    pre->next->next = p;

                    p = pre->next;

                }

                pre = pre->next;

                p = p->next;

            }

            tail = p;

        }

        printf("排序成功!\n");

    }

    else

    {

        printf("联系人为空,无法排序!\n");

    }

}

//清空联系人

void Clear(List*people)

{

    List *p,*q;

   

    p = people->next;

    if(p != NULL)

    {

        while(p != NULL)

        {

            q = p->next;

            free(p);

            p = q;

        }

        people->next = NULL;

        printf("清空成功!\n");

    }

    else

    {

        printf("联系人为空!\n");

    }

}

 

//将联系人保存至文件

void FileSave(List*people)

{

    List *p;

    FILE *F;

 

    p = people->next;

    F =fopen("ContactList.c","w"); //打开一个文件,没有则创建

    if(F == NULL)          //打开失败

    {

        printf("打开文件失败!\n");

        exit(1);

    }

    while(p != NULL)

    {

        fwrite(p,sizeof(List),1,F);

        p = p->next;

    }

    printf("存储成功!\n");

 

    fclose(F);

}

 

//将文件中的数据读出来,并放到一个链表中

void FileRead(List*people, FILE *F)

{

    List *q,*r;        //用来创建新的节点,存放读取的信息

    int num;

 

    r = people;

    F =fopen("ContactList.c","r");

 

    if(fgetc(F) == EOF)     //判断文件中是否有内容

    {

        printf("读取失败,文件中无内容!\n");

    }

    else

    {

        fseek(F,0,SEEK_SET);

        while(1)

        {

            q = (List *)malloc(sizeof(List));

            num = fread(q,sizeof(List),1,F);

            if(num < 1)

            {

                free(q);

                break;

            }

            r->next = q;

            q->next = NULL;

            r = r->next;

        }

        printf("读取成功!\n");

    }

       

 

    fclose(F);

}

 

//主函数

int main()

{

    int choice;

    List people;

    FILE *F;

 

    people.next = NULL;

    while(1)

    {

        choice = menu();

        switch(choice)

        {

            case 0: Add(&people);

                   break;

            case 1: Display(&people);

                   break;

            case 2: Search(&people);

                   break;

            case 3: Delete(&people);

                   break;

            case 4: Sort(&people);

                   break;

            case 5: Clear(&people);

                   break;

            case 6: FileSave(&people);

                   break;

            case 7: FileRead(&people,F);

                   break;

            case 8: exit(1);

 

            default: printf("\n无效指令,请重新输入!\n");

                   break;

        } 

    }

 

    return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值