linuxC语言项目——通讯录

Linux,C语言项目——通讯录;

 

通讯录是许多手机等电子产品必带功能之一,在有了数据结构中链表的相关知识后,便可以自己制作一个简单的通讯录了;

 

1.制作通讯录的一些基础知识;

a.结构体;

结构体是什么?说白了结构体是一种类型,它可以是一些其他类型的集合体;打个比方,数组是它元素类型的集合体,int a[10]是int类型的集合体;同理,结构体是它自身一些元素类型的集合体;为什么说是一些呢?这就涉及到了数组与结构体的区别了;数组中元素的类型是确定,一致的,而在结构体中,其元素可以是不同类型的;

举个例子(存放学生姓名,性别,分数):

structlist

{

         char name[20];

         char sex;

int point;

};

如上所示,该结构体中元素有char类型的字符串数组,char类型的字符,和int类型的数字;

 

以上是结构体的声明部分,如果需要用以上结构体定义变量的话该怎么办呢?

structlist student;

或者使用typedef关键字,然后再定义:

typedefstruct list stu;

stustudent;

一般来说,结构体会写进头文件(xxx.h)中,这时候我们就需要用到条件编译:

它的格式如下:

#ifndef  xxx

#define  xxx

#endif

除了结构体,我们还可以把一些宏定义也放进去;

像这样,在做通讯录项目的时候,我们可以把整个项目文件分成3大块:头文件和宏定义部分(address_book.h),main函数,功能函数(func.c)。

 

以上就是c语言所要用到的知识了;

以下是会涉及到的一些数据结构的知识:

链表:

链表是有结构体拓展而来的一种结构,他和顺序表不同的是,链表存储是动态的,而顺序表在定义的时候已经就确定了它最大值了,而且如果要插入,删除数据时,顺序表十分不方便。因为通讯录插入和删除数据是必要功能,所以选择链表来制作通讯录是一种非常明智的选择;

链表结构:

typedefchar ch_type;

 

structaddress_book

{

         ch_type data[10];

         ch_type name[20];

         ch_type address[20];

         ch_type telephone[20];

         ch_type home_number[20]

         struct address_book *next

}

看了以上代码后,可能会有人有疑问,为什么要以定义同一类型呢,最后一行是什么?

1.其实是可以定义不同类型的,(最开始也是这么写的),之所以定义成同一类型,是因为在写后面的功能函数时,发现如果是不同类型元素,同样一个功能,因为参数类型不同,需要写好几遍,所以不如简单一点,就定义成一种类型,以后统一调用,不需要考虑类型带来的变化;

2.最后一行就是链表区别于顺序表的地方,不难看出,最后一行是地址,指向的是下一个节点,真是因为这个链表才会非常灵活,其逻辑地址顺序也会不同于物理地址顺序;

 

一些拓展知识,链表的一些分类:单向链表,双向链表,循环链表,单向循环链表,双向循环链表等

在本次项目中,之需要单向链表就可以了;

 

项目要求:

语言:c语言

 

格式:编号       姓 名        住址          电话                       住宅电话

      201701       ***         xxxx        11位数字                8位数字

 

要求:使用结构体形式对数据存储

 

功能:使用链表实现增加(在增加人员的过程中有一个自动排序功能,比如按姓名排序)、删除、修改、查找(比如:工号查找、电话查找)的功能;

(1)添加用户信息(号码长度   号码是否重复)

(2)列出好友信息(按姓名排序)

(3)查找好友信息(按姓名查找)

(4)删除好友

(5)退出

 

注意事项:在增、删、改、查过程中,如果姓名相同怎么进行选择操作。

 

首先,在写程序之前,我们可以先构思一下,主干是实现5个功能,可以大致的画一下结构图:


大致的框架已经构思好了,接下来,就是付诸实践的时候了。

首先创建3个文件,一个放头文件,一个主函数,一个功能函数;

a.头文件address_book.h

我们需要放哪些东西呢?

结构体声明,函数声明,宏定义,typedef,

b.主函数main.c

先构思一张程序流程图,


c.功能函数func.c

和主函数的区别就是主函数负责“串联各个功能”(电路),func.c里的函数主要是一些实现具体功能的函数(用电设备);首先我们要做的是大致了解通讯录要有哪些功能,然后将这些功能进行分析,拆分成一个个小功能,需要用那些函数实现,哪些是可以共用同一个函数,所以最好是事先打一个草稿;

 

有了之前大概的思路后,接下来我们就可以写程序了,首先我们要搭建函数的框架,即把整个流程写下来,

就比如:先将函数的头文件等,执行步骤一一写出来,遇到需要调用的函数不必展开,直接写成空函数,写完后,运行程序,查看程序是否按照自己的设想在运行,对照流程表是否每个功能是否都在主函数有了“位置”;

 

当主函数写完后,在一步一步完善func.c里的函数,没写完一个,就要运行排错,检查函数是否有什么缺漏,直至整个程序完成;

 

小白我在写这个程序的时候遇到了一个新人常犯的段错误,在这里和大家分享一下:

在初始化结构体的时候,我们在主函数使用的是结构体指针,在传入参数的时候,由于是对地址的改写分配地址,所以要传入二级指针,这样才能malloc成功,不然会一直段错误;

如果传入一级指针的话,在初始函数中,会把这个地址当作一个变量,赋值给函数参数,我们虽仍然为其分配了地址,但是函数结束,改值就被释放掉了,并不会影响主函数中的实参;

 

 

以下是参考程序:

1.main.c

#include<stdio.h>

#include"address_book.h"

#include<stdlib.h>

 

 

 

intmain()

{

         int ret;

         char choice[10] = {0};

         book list = NULL;

         list = (book)malloc(sizeof(BOOK));

 

         list->next = NULL;

 

 

         system("clear");

         show1();

         sleep(2);

         system("clear");

        

         while(1)

         {

                   show2();

                   printf("Please input thenumber you want to go :\n");

                   scanf("%s",choice);

 

                   switch(atoi(&choice[0]))

                   {

                            case 1:

                                     add_information(&list);

                                     break;

                            case 2:

                                      ret = show_information(list);

                                     if(FAILURE== ret)

                                               printf("AddressBook is None!\n");

                                     break;

                            case 3:

                                     ret =find_information(list);

                                     if(FAILURE== ret)

                                               printf("FindFailure!\n");

                                     break;

                            case 4:

                                     ret = delete_information(list);

                                     if(FAILURE== ret)

                                               printf("DeleteFailure!\n");

                                     break;

                            case 5:

                                     quit();

                                     break;

                            default:

                                     printf("Unknown\n");

                                     break;

                   }

         }

         return 0;

}

2.address_book.h

#ifndef      _ADDRESS_BOOK_H_

#define_ADDRESS_BOOK_H_

 

#defineFAILURE 10000

#defineSUCCESS       10001

#defineTRUE    10002

#defineFALSE  10003

 

 

typedefchar ch_type;

 

 

structaddress_book

{

         ch_type time[10];

         ch_type name[30];

         ch_type address[20];

         ch_type phone_number[20];

         ch_type home_number[20];

         struct address_book *next;

};

 

typedefstruct address_book BOOK;

typedefBOOK * book;

 

 

 

voidadd_information(book *s);

intshow_information(book s);

intfind_information(book s);

intdelete_information(book s);

 

#endif

3.func.c

#include<stdio.h>

#include<stdlib.h>

#include"address_book.h"

#include<string.h>

 

intlength = 0;

 

show1()

{

         printf("\t|************************************************************|\n");

         printf("\t|************************************************************|\n");

         printf("\t|*                                                         *|\n");

         printf("\t|*                                                         *|\n");

         printf("\t|*                   欢迎来到通讯录!                      *|\n");

         printf("\t|*               WELCOME TO ADDRESS BOOK                    *|\n");

         printf("\t|*                                                         *|\n");

         printf("\t|*                                                         *|\n");

         printf("\t|*                                                          *|\n");

         printf("\t|************************************************************|\n");

         printf("\t|************************************************************|\n");

}

 

show2()

{

         printf("\t|************************************************************|\n");

         printf("\t|************************************************************|\n");

         printf("\t|*                         MENU                             *|\n");

         printf("\t|*                                                         *|\n");

         printf("\t|* Options        Function                                  *|\n");

         printf("\t|*    1.       添加好友信息.                              *|\n");

         printf("\t|*    2.       显示所有好友信息.                          *|\n");

         printf("\t|*    3.       查找好友信息.                               *|\n");

         printf("\t|*    4.       删除好友信息.                              *|\n");

         printf("\t|*    5.       退出.                                      *|\n");

         printf("\t|*                                                         *|\n");

         printf("\t|************************************************************|\n");

         printf("\t|************************************************************|\n");

}

 

show3()

{

         printf("\t|************************************************************|\n");

         printf("\t|************************************************************|\n");

         printf("\t|*                                                         *|\n");

         printf("\t|*                                                         *|\n");

         printf("\t|*                   欢迎再次使用!                         *|\n");

         printf("\t|*                WELCOME TO USE AGAIN                      *|\n");

         printf("\t|*                                                         *|\n");

         printf("\t|*                                                          *|\n");

         printf("\t|*                                                         *|\n");

         printf("\t|************************************************************|\n");

         printf("\t|************************************************************|\n");

}

 

quit()

{

         system("clear");

         show3();

         sleep(2);

         system("clear");

         exit(1);

}

 

intrepetition(ch_type *a, ch_type *b)

{

         if(strcmp(a, b) == 0)

                   return FALSE;

         else

                   return TRUE;

}

 

intdigit(ch_type *a, int len)

{

         if(strlen(a) == len)

                   return TRUE;

         else

                   return FALSE;

}

 

intsmall(ch_type *a,ch_type *b)

{

         if(strcmp(a, b) < 0)

         {

                   return TRUE;

         }

         else

         {

                   return FALSE;

         }

}

 

 

 

voidadd_information(book *s)

{

         int i = 0, j = 0, back;

         book p = *s;

         book t = *s;

         int x = 11, y = 8;

 

 

         while(1)

         {

                   printf("If you want getback to main menu, type in \"quit\" .\n");

                   printf("Please inputinformation :\n");       

                   book n =(book)malloc(sizeof(BOOK));

                   if(NULL == n)

                   {

                            printf("MallocFailure!\n");

                            return;

                   }

 

 

                   printf("请输入日期 :\n");

                   scanf("%s",n->time);

                   if(strcmp(n->time,"quit") == 0)

                   {

                            length = i - 1;

                            return;

                   }

                  

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

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

 

                   while(p)

                   {

                            back =repetition(n->name, p->name);

                            if(FALSE == back)

                            {

                                     while (back== FALSE)

                                     {

                                               printf("名字已存在,请重新输入 :\n");

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

                                               back= repetition(n->name, p->name);

                                     }

                            }

                            p = p->next;

                   }       

                   p = *s;

 

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

                   scanf("%s",n->address);

                   printf("请输入手机号码  :\n");  

                   scanf("%s",n->phone_number);

                  

                   back =digit(n->phone_number, x);

                   if(FALSE == back)

                   {

                            while(back == FALSE)

                            {

                                     printf("手机号码位数不正确,请重新输入 :\n");

                                     scanf("%s",n->phone_number);

                                     back =digit(n->phone_number, x);

                            }

                   }

 

                   while(p)

                   {

                            back = repetition(n->phone_number,p->phone_number);

                            if(FALSE == back)

                            {

                                     while (back== FALSE)

                                     {

                                               printf("手机号码已存在,请重新输入 :\n");

                                               scanf("%s",n->phone_number);

                           

                                               back= digit(n->phone_number, x);

                                               if(FALSE== back)

                                               {

                                                        while(back== FALSE)

                                                        {

                                                                 printf("手机号码位数不正确,请重新输入 :\n");

                                                                 scanf("%s",n->phone_number);

                                                                 back= digit(n->phone_number, x);

                                                        }

                                               }

                                               back= repetition(n->phone_number, p->phone_number);

                                     }

                            }

                            p = p->next;

                   }

                   p = *s;

 

                   printf("请输入住宅固定电话 :\n");     

                   scanf("%s",n->home_number);

 

                   back =digit(n->home_number, y);

                   if(FALSE == back)

                   {

                            while(back == FALSE)

                            {

                                     printf("固定电话号码位数不正确,请重新输入 :\n");

                                     scanf("%s",n->home_number);

                                     back =digit(n->home_number, y);

                            }

                   }

 

                   while(p)

                   {

                            back =repetition(n->home_number, p->home_number);

                            if(FALSE == back)

                            {

                                     while (back== FALSE)

                                     {

                                               printf("固定电话号码已存在,请重新输入 :\n");

                                               scanf("%s",n->home_number);

                           

                                               back= digit(n->home_number, y);

                                               if(FALSE== back)

                                               {

                                                        while(back== FALSE)

                                                        {

                                                                 printf("固定电话号码位数不正确,请重新输入 :\n");

                                                                 scanf("%s",n->home_number);

                                                                 back= digit(n->home_number, y);

                                                        }

                                               }

                                               back= repetition(n->home_number, p->home_number);

                                     }

                            }

                            p = p->next;

                   }

                   p = *s;

                  

 

                   i++;

/*               while(t->next)

                   {

                            t=t->next;

                   }

 

                   t->next = n;

                   n->next = NULL;

*/

                   if((p->next) == NULL)

                   {

                            p->next = n;

                            n->next = NULL;

                            printf("AddSuccess!\n");

                   }

                   else

                   {

                            while(p)

                            {

                                     if(small(n->name,p->name) == TRUE)

                                     {

                                               n->next= p;

                                               t->next= n;

                                               printf("AddSuccess!\n");

                                               break;

                                     }

                                     else

                                     {

                                               if(p->next==NULL)

                                               {

                                                        p->next= n;

                                                        n->next= NULL;

                                                        printf("AddSuccess!\n");

                                                        break;

                                               }

                                     }

                                     t = p;

                                     p =p->next;

                            }

                            p = *s;      

                   }

         }

}

 

intshow_information(book s)

{

         int i = 0;

 

         if((s->next) == NULL)

         {

                   return FAILURE;

         }

         else

         {

                   printf("\t|============================================================|\n");

                   printf("\t|************************************************************|\n");

                   printf("\t日期\t姓名\t住址\t手机\t\t固话\t\t\n");

                   book p = s->next;

                   while (p)

                   {

                            printf("%d\t%s\t%s\t%s\t%s\t%s\t\t\n",i+1, p->time, p->name, p->address, p->phone_number, p->home_number);

                            p = p->next;

                            i++;

                   }

                   printf("\t|************************************************************|\n");

                   printf("\t|============================================================|\n");

         }

}

 

 

intfind_information(book s)

{

         book p;

         book t = s->next;

         printf("Please input the name youwant to find :\n");

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

         while(t)

         {

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

                   {

                            printf("\t日期\t姓名\t住址\t手机\t\t固话\n");

                            printf("\t%s\t%s\t%s\t%s\t%s\n",t->time, t->name, t->address, t->phone_number, t->home_number);

                            return SUCCESS;

                   }

                   t=t->next;

         }

 

         return FAILURE;

        

}

 

intdelete_information(book s)

{

         int i = 0;

         book p = (book)malloc(sizeof(BOOK));

         book tmp;

         book t = s;

         printf("Please input the name youwant to delete :\n");

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

        

         if(t->next == NULL || s == NULL)

                   return FAILURE;

 

        

        

        

         while(t->next)

         {

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

                   {

                            printf("5\n");

                            tmp = t->next;

                            t->next =tmp->next;       

                            free(tmp);

                            return SUCCESS;

                   }

                   t = t->next;

         }

        

         return FAILURE;

}

 

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值