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;
}