用c语言实现简易通讯录(链表)

首先,这是本人第一次写博客。不当之处,望请见谅!(脑补一个doge)
最近在学习C语言,并实现了 下面链接中 简易通讯录的功能。区别是:我是用链表实现了其所有功能。并增加了文件保存模块!
本人初来乍到,c功底不是很扎实,且是第一次用c写小项目,虽然实现了所有功能,但代码中定会有很多需优化的地方。所以,各位希望不吝赐教!万分感谢!

https://blog.csdn.net/iconm/article/details/80380406

下面开始啦:

头文件:

# ifndef   __TONGXUNLU_H
# define   __TONGXUNLU_H

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define LEN  sizeof(address_list) //开辟空间

int n=0;//记录通讯录人员人数

typedef struct A
{
    char name[100];//名字
    char sex[5];//性别
    char  age[10];//年纪
    char phone[15];//电话
    char addr[100];//地址
    struct A *next;  
}address_list;

void show_feature(void);//菜单函数
address_list * add(address_list *);//添加联系人
address_list * delete1(address_list *);//删除特定联系人
void show_list(address_list *);//显示所有联系人
void find_list(address_list *);//寻找特定联系人
address_list * sort(address_list *);//排序联系人
address_list * clear_list(address_list *);//清楚所有联系人
address_list * revision_list(address_list *);//修改特定联系人特定信息
void save_list(address_list *);//保存所有联系人信息
void exit_list();//退出通讯录系统
# endif // __TONGXUNLU_H

主功能源码:

#include "tongxunlu.h"

int main()
{
  int func;
  address_list *p1;
  p1 = (address_list *)malloc(LEN);
  //printf("%d",p1->next);
  do
  {
    show_feature();//菜单函数
    printf("请选择您要进行的操作:");
    scanf("%d" ,&func);
    fflush(stdin);
    switch(func)
    {
      case 1:  p1=add(p1); break;//添加
      case 2:  p1=delete1(p1); break;//删除
      case 3:  find_list(p1); break;//查找
      case 4:  revision_list(p1); break;//修改
      case 5:  show_list(p1); break;//显示
      case 6:  p1=clear_list(p1); break;//清除
      case 7:  p1=sort(p1); break;//排序
      case 8:  save_list(p1); break;//保存
      case 0:  exit_list(); break;//退出
     default:  printf("选择错误,请重新输入!\n"); break;
    }
  }while(func);
  return 0 ;
}

//修改特定联系人特定信息
address_list * revision_list(address_list *head)
{
    char j[100],q[100],p[100];
    address_list *A1;
    A1 = (address_list *)malloc(LEN);
    printf("请输入你想要修改的人的姓名:");
    scanf("%s",j);
    A1 = head;
    for (int i=1; i <= n; i++)
    {
        if(!(strcmp(j,A1->name)))
        {
            printf("成功找到 %s 的具体信息:\n", A1->name);
            printf("名字:%4s,性别:%4s,年龄:%4s,电话:%4s,地址:%4s\n" ,A1->name,A1->sex,A1->age,A1->phone,A1->addr);
            printf("你想要修改%s的什么信息(name, sex, age, phone, addr):",j);
            scanf("%s",q);
            if((strcmp(q,"name"))&(strcmp(q,"sex"))&(strcmp(q,"age"))&(strcmp(q,"phone"))&(strcmp(q,"addr")))
                {printf("请输入正确的想要修改的信息!\n");break;}
            printf("你想要把 %s 的 %s 修改成:",j,q);
            scanf("%s",p);
            if(!(strcmp(q,"name")))strcpy(A1->name, p);
            if(!(strcmp(q,"sex")))strcpy(A1->sex, p);
            if(!(strcmp(q,"age")))strcpy(A1->age, p);
            if(!(strcmp(q,"phone")))strcpy(A1->phone, p);
            if(!(strcmp(q,"addr")))strcpy(A1->addr, p);
                //A1->name = "x";这样赋值是不行滴!!
            printf("成功把 %s 的 %s 修改为 %s!!!\n", j,q,p);break;
        }
        else
        {
            if(A1->next == NULL) printf("没有找到%s的信息!\n",j);
            A1 = A1->next;
        }
    }
    return head;
}
//清除联系人信息
address_list * clear_list(address_list *head)
{
    head = NULL;
    n = 0;
    printf("已清除全部通讯录信息!!\n");
    return head;
}
//寻找特定联系人信息
void find_list(address_list *head)
{
    char j[100];
    address_list *A1;
    A1 = (address_list *)malloc(LEN);
    printf("请输入你要查找人的姓名:");
    scanf("%s",j);
    A1 = head;
    for (int i=1; i <= n; i++)
    {
        if(!(strcmp(j,A1->name)))
        {
            printf("%s 的具体信息是:\n", A1->name);
            printf("名字:%4s,性别:%4s,年龄:%4s,电话:%4s,地址:%4s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr);
            break;
        }
        else
        {
            if(A1->next == NULL) printf("没有找到%s的信息\n",j);
            A1 = A1->next;
        }
    }
    //free(A1);
}
//删除某通讯录成员信息
address_list * delete1(address_list *head1)
{
   char j[100];
   int i;
   address_list *p1,*p2,*p3,*p4;
   p1=p2=p3=p4=(address_list *)malloc(LEN);
   if (n == 0)
   {
       printf("There is no any data!");
       goto END;
   }
   else
   {
       p1=p2=head1;
       p4=head1->next;//p4的作用:当删除的是链表第一个数据时候。
       printf("Please enter the name that you want to delete:");
       scanf("%s",j);
       //遍历链表,寻找要删除的数据
       if(!(strcmp(j,head1->name)))//删除数据是否为第一个链表
        {
            if(n==1)
            {
                head1 = NULL;
                printf("删除成功!\n");
                printf("现在通讯表没有任何信息,请添加或退出!\n");
            }
            else
            {
               head1=p4;
               printf("删除成功!");
            }
        }
       //遍历链表寻找要删除的信息(若p3在第一链,则p2在第二链,p1在第三链)
       for (i=1;i<=n;i++)
       {
           p1=p1->next;
           if(!(strcmp(j,p2->name)))
           {
               p3->next=p2->next;
               printf("删除成功!");
               n--;
               goto END;
           }
           else
           {
               p3=p2;
               p2=p1;
           }
       }
   }
   printf("遍历通讯录,并未发现想要删除的信息!");
   END:return head1;
}
//按首字母从小到大排序联系人信息
address_list * sort(address_list *head)
{
    if(n == 0)
    {
        printf("没有数据,请添加!\n");
        return head;
    }
    else//能进入下面程序的,n>=2
    {
        char j[100];
        address_list *A1, *A2, *A3;
        A1 = A2 = A3 =(address_list *)malloc(sizeof(address_list));//这里不开辟空间总会导致程序崩溃!
        printf("请选择要排序的方式");
        printf("(name, sex, age, phone, addr):");
        scanf("%s" ,j);
        if((strcmp(j,"name"))&(strcmp(j,"sex"))&(strcmp(j,"age"))&(strcmp(j,"phone"))&(strcmp(j,"addr")))
        {printf("输入有误!请输入正确的想要修改的信息!\n");goto END;}
        //A1 = A2 = A3 = head;
        if(head->next == NULL)//检测是否只有一组数据
        {
            printf("成功完成排序!\n");
            //show_list(head);
            return head;
        }
        else
        {
            for (int ii=1; ii<=n-1; ii++)
            {
               A1 = head->next;
               A2 = head;
               for (int jj=1; jj<=n-ii; jj++)
                {
                  if(jj == 2) {A3 = head;}
                  if(jj > 2) {A3 = A3->next;}
                  if(!(strcmp(j,"name")))  {if(strcmp(A2->name,A1->name)>0) goto Loop; else  goto Loop1;}
                  if(!(strcmp(j,"sex")))   {if(strcmp(A2->sex,A1->sex)>0) goto Loop; else  goto Loop1;}
                  if(!(strcmp(j,"age")))   {if(strcmp(A2->age,A1->age)>0) goto Loop; else  goto Loop1;}
                  if(!(strcmp(j,"phone"))) {if(strcmp(A2->phone,A1->phone)>0) goto Loop; else  goto Loop1;}
                  if(!(strcmp(j,"addr")))  {if(strcmp(A2->addr,A1->addr)>0) goto Loop; else  goto Loop1;}
                  Loop:{
                     if(jj == 1) {head = head->next;}
                     if(jj >= 2) {A3->next = A1;}
                     A2->next = A1->next;
                     A1->next = A2;
                     A1 = A1->next->next;
                     continue;
                     }
                  Loop1:{
                     A2 = A1;
                     A1 = A1->next;
                        }
            }
            //show_list(head);
        }
        printf("成功完成排序!\n");
        }
        END:return head;
      }
}

//添加通讯录成员信息
address_list * add(address_list *head)
{
    int i;
    address_list *A1, *A2, *A3;
    A1 = A2 = A3 =(address_list *)malloc(sizeof(address_list));//这里不开辟空间总会导致程序崩溃!
    A1 = head;
    if(n==0)
    {
        printf("添加通讯录成员\n");
        printf("请输入名字:");
        scanf("%s",A2->name);
        printf("请输入性别:");
        scanf("%s",A2->sex);
        printf("请输入年龄:");
        scanf("%s",A2->age);
        printf("请输入电话:");
        scanf("%s",A2->phone);
        printf("请输入地址:");
        scanf("%s",A2->addr);
        printf("添加成功!\n");
        A2->next = NULL;
        head = A2;
    }
    else
    {
        for (i=1; i<=n; i++)
        {
           if(A1->next == NULL)
            {
               A1->next = A3;
               printf("\n添加通讯录成员\n");
               printf("请输入名字:");
               scanf("%s",A3->name);
               printf("请输入性别:");
               scanf("%s",A3->sex);
               printf("请输入年龄:");
               scanf("%s",A3->age);
               printf("请输入电话:");
               scanf("%s",A3->phone);
               printf("请输入地址:");
               scanf("%s",A3->addr);
               printf("添加成功!\n");
               A3->next = NULL;
            }
            A1 = A1->next;
        }
    }
    n++;
    //free(A1);free(A2);free(A3);//释放之后结果就不对了!
    //printf("%d",head->next);
    return head;
}

//显示已存在通讯表信息
void show_list(address_list *head)
{
    int i;
    address_list *A1;
    A1 = (address_list *)malloc(sizeof(address_list));//这里不开辟空间总会导致程序崩溃!
    A1 = head;
    if (n == 0)
        printf("没有数据,请添加!\n");
    else
    {
       printf("\n现在通讯录中保存 %d 个人的信息!\n",n);
       for (i=1; i<=n; i++)
       {
          printf("名字:%4s,性别:%4s,年龄:%4s,电话:%4s,地址:%4s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr);
          A1 = A1->next;
       }
    }
   free(A1);
}
//保存联系人信息
void save_list(address_list *head)
{
    address_list *A1;
    A1 = (address_list *)malloc(sizeof(address_list));//这里不开辟空间总会导致程序崩溃!
    A1 = head;
    FILE *fp;//文件指针
    /*文件的打开*/
    char data_list[100];
    printf("请输入想保存的文件名称(需带文件后缀):");
    scanf("%s",data_list);
    fp=fopen(data_list,"w");//fopen打开文件,这个文件可以是当前不存在的。“w”以写入的形式打开,“r”以读的形式打开
    if(fp==NULL) //判断如果文件指针为空
    {
        printf("不能打开文件! " );
        //exit(0);//在以0的形式退出,必须在文件开头有#include <stdlib.h>,stdlib 头文件即standard library标准库头文件
    }
    //写入数据
    else
    {
       for (int i=1; i<=n; i++)
       {
           fprintf(fp, "名字:%6s,性别:%6s,年龄:%6s,电话:%6s,地址:%6s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr);
           A1 = A1->next;
       }
    printf("通讯录信息成功保存至 %s 中!\n",data_list);
    }
    //关闭文件
    fclose(fp);
    free(A1);
}

//显示功能
void show_feature(void)
{
   printf("\n现在通讯录中保存 %d 个人的信息!\n",n);
   printf("*********************************\n");
   printf("***1. 添加        2. 删除********\n");
   printf("***3. 查找        4. 修改********\n");
   printf("***5. 显示        6. 清空********\n");
   printf("***7. 排序        8. 保存********\n");
   printf("***0. 退出               ********\n");
   printf("*********************************\n");
}
//退出通讯录系统
void exit_list()
{
    printf("欢迎您再次使用!");
    printf("\n已成功退出通讯录系统!\n");
}

结果显示:
在这里插入图片描述

完事收工!

猜你喜欢

转载自blog.csdn.net/weixin_40890148/article/details/84637676