多功能电子通讯录(涉及到了双向链表的使用,Linux文件编程等等)
readme.txt //作为一个程序员,我们咋么能不写用户手册呢!MSP的我觉得用户体验是王道,苹果手机的用户体验的确不错!不过WP加油!我去,扯远了!赶紧看我的程序吧!
歡迎使用多功能電子通訊錄V1.0版本
如有BUG敬請原諒
make 之後便可以使用
./ebook 運行本程序
make clean 清理本程序中間文件
make cleanall 清除所有非源程序文件
PS:我本想直接给大家看代码的,但是在这个过程中,重要不仅仅是代码,首先你要在你的脑海有一个大体的框架,你打算咋么写?如何去写得更加规范化,当然我自己写的地方也有不好的地方,纵观
全局,你打算使用什么来实现,比如,我特喜欢把一个系统模块化!第一个,链表操作吧,好那我就给一个文件专门用来存放链表的函数,第二个,该是界面吧!那我就拿个HELP.C专门来存放它的函数等等,
有人就奇怪了,你把那些模块化了,咋么组装起来?声明都文件吗?每个都带一个,不错 这是个方法,但是你的写多少个头文件呢来声明函数呢?不要忘了编译器只是找你的MIAN函数的入口,我们直接用
makefile把他们连起来就行了!头文件只用用来定义我们的数据结构,方便我们的函数调用!
还有一个思想也是非常重要的,不要一蹴而就!我们不是大神,更不要说C本来就是一个有缺陷的语言,因而,你如何去完善及调试C,那才是我们应该关注的要点!而不是代码的本身!
好了,这回我的废话真的结束了!
1 首先大家看到的是我定义的一个data.h的头文件,我在头文件中写好了数据框架和应当包括的头文件!这个程序大概写了3天,
#ifndef __DATA__
#define __DATA__
#define MAXSIZE 100
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
struct node
{
int id; //ID
char name[MAXSIZE]; //姓名
char phone[MAXSIZE]; //電話
char add[MAXSIZE]; //公司地址
char comp[MAXSIZE]; //公司電話 struct node *pr;
struct node *next;
};
typedef struct node Node;
typedef struct node* link;
#endif
这边呢!就是我写的主函数了!具体的功能,将在这个文件中一一诉述!
/****************************************************************************
* 函數列表 *
* int insert_cmd() 命令選擇 *
* int input_num_ok(char *temp) 判斷數字 *
* int input_char_ok(char *temp) 判斷字符 *
* link input_list() 輸入數據 *
* int is_choose(char ch) 選擇查詢模式 *
****************************************************************************/
#include"data.h"//调用自己定义的头文件 int insert_cmd()
{
char cmd[MAXSIZE];
printf("请输入相应的命令:(提示:INSERT/DISPLAY/SEARCH/DELETE/EXIT:)\n");
scanf("%s",cmd);
if( strcmp(cmd,"INSERT") == )
{
return ;//INSERT CMD ID
}
else if( strcmp(cmd ,"DISPLAY") == )
{
return ;//DISPLAY CMD ID
}
else if( strcmp(cmd , "SEARCH") == )
{
return ;//SEARCH CMD ID
}
else if( strcmp(cmd , "DELETE") == )
{
return ;//EDLETE CMD ID
}
else if( strcmp(cmd , "EXIT") == )
{
return ;//EXIT CMD ID
}
else
{
return ;//ERROR CMD ID
} } int input_num_ok(char *temp) //0~9返回1 其他直接返回0
{
int len = strlen(temp);
int i;
for(i = ; i < len; i++)
{
if(temp[i] >= ''&&temp[i] <= '' )
{
}
else
{
return ;
}
}
return ;
}
int input_char_ok(char *temp) //a~z或者A~Z返回1 其他直接返回0
{
int len = strlen(temp);
int i;
for(i = ; i < len; i++)
{
if((temp[i] >= 'a'&&temp[i] <= 'z')||(temp[i] >= 'A'&&temp[i] <= 'Z' ))
{
}
else
{
return ;
}
}
return ;
}
link input_list()
{
link temp;
is_malloc_ok(&temp);
char tempchar[MAXSIZE];
printf("请输入您好友的名字(名字必须英文):\n");
scanf("%s",tempchar);
int flag = ;
flag = input_char_ok(tempchar);
while(flag != )
{
printf("您输入的名字有误!请重新输入您好友的名字(名字必须英文):\n");
scanf("%s",tempchar);
flag = input_char_ok(tempchar);
}
strcpy(temp->name,tempchar);
printf("请输入您想要设置的ID(该ID必须0~300):\n");
scanf("%d",&temp->id);
while(temp->id < || temp->id > )
{
printf("您输入的ID已经超过了限定ID,请重新输入ID:\n");
scanf("%d",&temp->id);
}
printf("请输入您好友的手机号码:\n");
scanf("%s",tempchar);
flag = ;
flag = input_num_ok(tempchar);
while(flag != )
{
printf("您输入的手机号码有误!请重新输入号码(号码必须为数字):\n");
scanf("%s",tempchar);
flag = input_num_ok(tempchar);
}
strcpy(temp->phone,tempchar);
printf("请输入公司地址:\n");
scanf("%s",temp->add);
printf("请输入公司电话(电话须为数字):\n");
scanf("%s",tempchar);
flag = ;
flag = input_num_ok(tempchar);
while(flag != )
{
printf("您输入的公司电话有误!请重新输入公司电话(号码必须数字):\n");
scanf("%s",tempchar);
flag = input_num_ok(tempchar);
}
strcpy(temp->comp,tempchar);
return temp;
}
int is_choose(char ch)
{
while()
{
if(ch == 'i' || ch =='I')
{
return ;
}
if(ch == 'N' || ch == 'n')
{
return ;
}
printf("请正确输入!\n");
scanf("%c",&ch);
}
}
int main()
{
system("clear");
insert_help();//包含在help.c文件中的函数
link head;
link newnode;
create_list(&head);//包含在looplist.c文件的函数
int fd; //file id文件描述符! int cmdid;
char sc;//用于判断查询的模式
int id;
char name[MAXSIZE];
fd = is_open_creat("data.txt",O_RDONLY|O_CREAT,);//文件编程 打开或者创建一个文件
// null_fd = is_open_creat("null.txt",O_RDWR|O_CREAT,0755);
int count = ;
count = read_countline(fd);//我是以行读取文件中的内容的!因为要判定data.txt文件中有多少行
lseek(fd,,SEEK_SET);
int i = ;
for(i = ; i < count; i++)
{
analysis(fd,&head);//解析文件内容
}
cmdid = insert_cmd();
while(cmdid != ) //主程序
{
switch(cmdid)
{
case :
{
system("clear");
is_malloc_ok(&newnode);
newnode = input_list();
insert_list(&head,&newnode);
sleep();
break;
}
case :
{
system("clear");
display_list(&head);//凡带list的函数都是我调用了looplist.c的文件函数
printf("请按回车键返回首页");
getchar();
getchar();
break;
}
case :
{
system("clear");
printf("请选择你所需要搜索的模式 ID搜素请输入I或者i 名字搜索请输入N或者n\n");
scanf("%c",&sc);
if(is_choose(sc) == )
{
printf("请输入要搜素的ID号\n");
scanf("%d",&id);
display_id(&head,id);
}
else
{
printf("请输入要搜索的名字\n");
scanf("%s",name);
display_name(&head,name);
}
printf("请按回车键返回首页");
getchar();
getchar();
break;
}
case :
{
system("clear");
printf("你想删除谁?请输入他的名字!\n");
scanf("%s",name);
display_name(&head,name);//这是调用了search.c的函数
printf("已找到你想删除的人,注意:如果您的通讯录本来就为空,請不要輸入Y!\n");
printf("您是否要刪除?確定請輸入Y,取消请输入N\n");
char chcmd;
scanf("%c",&chcmd);
while(chcmd != 'N')
{
if(chcmd == 'Y'||chcmd == 'y')
{
printf("請輸入對應的ID!\n");
scanf("%d",&id);
delete_list(&head,id);
break;
}
scanf("%c",&chcmd);
} printf("请按回车键返回首页");
getchar();
getchar();
break; }
case :
{
system("clear");
printf("tui chu chengxue");
sleep();
break;
}
case :
{
printf("你所输入的命令不正确,等待1秒后,请重新输入!\n");
sleep();
break;
}
}
system("clear");
insert_help();
cmdid = insert_cmd();
}
close(fd);
FILE *fp;
fp = fopen("data.txt","w");
fd = fileno(fp);
lseek(fd,,SEEK_SET);
write_all(fd,&head);
close(fd);
//close(null_fd);
return ;
}
好了,下面大家将看看到我写的一些用makefile关联起来的一些文件
这个就是file.c文件 用于解析文件内容和文件操作的函数
#include"data.h" int is_open_creat(char *filename,int flags,mode_t mode)
{
int fd;
if((fd = open(filename,flags,mode)) < )
{
perror("can't open file");
exit();
}
return fd;
} int is_open(char *filename,int flags)
{
int fd;
if((fd = open(filename,flags)) < )
{
perror("can't open file");
exit();
}
}
int is_read(int fd,char *buf,int maxsize)
{
int btye;
if((btye = read(fd,buf,maxsize)) < )
{
perror("can't read this file");
exit();
}
return btye;
}
int read_countline(int fd)
{
int count = ;
int btye;
char buf[];
btye = is_read(fd,buf,);
int i = ;
for(i = ; i < btye; i++)
{
if(buf[i] == '\n')
{
count++;
}
}
return count; }
int read_line(int fd,char *buf,int maxsize)
{
int i;
char ch;
for(i = ; i < maxsize - ; i++)
{
if(read(fd,&ch,) < )
{
perror("can't read this file");
exit();
}
if(ch == '\n')
{
buf[i] = '\0';
return i;
}
buf[i] = ch;
}
buf[i] = '\0';
return maxsize;
}
void analysis(int fd,link *head)
{
link temp;
is_malloc_ok(&temp);
char buf[];
char ptr[];
int size;
size = read_line(fd,buf,);
int i = ;
int count = ;
while(buf[i] != ':')
{
ptr[count++] = buf[i++];
}
ptr[count] = '\0';
i++;
count = ;
temp->id = atoi(ptr);
while(buf[i] != ':')
{
ptr[count++] = buf[i++];
}
ptr[count] = '\0';
count = ;
i++;
strcpy(temp->name,ptr);
while(buf[i] != ':')
{
ptr[count++] = buf[i++];
}
ptr[count] = '\0';
count = ;
i++;
strcpy(temp->phone,ptr);
while(buf[i] != ':')
{
ptr[count++] = buf[i++];
}
ptr[count] = '\0';
count = ;
i++;
strcpy(temp->add,ptr);
while(buf[i] != ':')
{
ptr[count++] = buf[i++];
}
ptr[count] = '\0';
count = ;
strcpy(temp->comp,ptr);
insert_list(head,&temp);
}
int is_write(int fd,char *buf,int maxsize)
{
int btye;
if((btye = write(fd,buf,maxsize)) < )
{
perror("can't write this file");
exit();
}
return btye;
} FILE *is_fopen(const char *fname,const char *mode)
{
FILE *fp;
if((fp = fopen(fname,mode)) == NULL)
{
perror("无法打开信息文件!请检查信息文件是否安全!");
exit();
}
return fp;
}
void write_data(int fd,link *newnode)
{
char buf[];
int id;
int i = ;
id = (*newnode)->id;
if( id <= )
{
buf[i++] = id + '';
buf[i++] = ':';
}
else if(id > && id <= )
{
buf[i++] = id / + '';
buf[i++] = id % + '';
buf[i++] = ':';
}
else
{
buf[i++] = id / + '';
buf[i++] = id % / + '';
buf[i++] = id % + '';
buf[i++] = ':';
}
int j = ;
while((*newnode)->name[j] != '\0')
{
buf[i++] = (*newnode)->name[j++];
}
j = ;
buf[i++] = ':';
while((*newnode)->phone[j] != '\0')
{
buf[i++] = (*newnode)->phone[j++];
}
j = ;
buf[i++] = ':';
while((*newnode)->add[j] != '\0')
{
buf[i++] = (*newnode)->add[j++];
}
j = ;
buf[i++] = ':';
while((*newnode)->comp[j] != '\0')
{
buf[i++] = (*newnode)->comp[j++];
}
j = ;
buf[i++] = ':';
buf[i++] = '\n';
is_write(fd,buf,i);
}
void write_all(int fd,link *head)
{
link temp = (*head)->next;
if(temp == *head)
{
printf("您的通讯录是空的!\n");
}
while(temp != *head)
{
write_data(fd,&temp);
temp = temp->next;
}
printf("已经录入文件完毕\n");
}
这个就是我的help.c文件主要是为了显示我的主界面,display在我的主函数中 没有用到,仅仅是用来调用调试的!
/***************************************************
* 函數列表 *
* insert_help() 幫助界面顯示 *
* display(link *temp) 查看數據 *
***************************************************/
#include"data.h"
void insert_help()
{
printf("\033[;35m \t************************多功能电子通讯录*********************************\n\033[0m");
printf("\033[;35m \t* 功能介绍 *\n\033[0m");
printf("\033[;35m \t* A、添加好友信息 *\n\033[0m");
printf("\033[;35m \t* B、列表好友信息 *\n\033[0m");
printf("\033[;35m \t* C、搜索好友信息 *\n\033[0m");
printf("\033[;35m \t* D、删除好友信息 *\n\033[0m");
printf("\033[;35m \t* 如在本界面出现录入成功,表示正在读取文件信息 *\n\033[0m");
printf("\033[;35m \t**************************欢迎您的使用***********************************\n\033[0m");
}
void display(link *temp)
{
printf("\033[;32m \t********************您的联系人的基本信息*********************************\n\033[0m");
printf("\033[;32m \t* ID = %d \n\033[0m",(*temp)->id);
printf("\033[;32m \t* 姓名:%s \n\033[0m",(*temp)->name);
printf("\033[;32m \t* 电话号码:%s \n\033[0m",(*temp)->phone);
printf("\033[;32m \t* 公司地址:%s \n\033[0m",(*temp)->add);
printf("\033[;32m \t* 公司电话:%s \n\033[0m",(*temp)->comp);
printf("\033[;32m \t*************************************************************************\n\033[0m");
}
这是looplist.c文件用来对我的双向链表进行相应的操作!
/***************************************************************
* 函數列表 *
* void is_malloc_ok(link *list)判斷空間分配 *
* void create_list(link *list) 創建鏈表 *
* int insert_list(link *head,link*newnode)錄入信息*
* void display_list(link *head)遍歷鏈表 *
* int delete_list(link *head,int num)刪除節點 *
***************************************************************/
#include"data.h"
#define MALLOC_ERROR -1
#define MALLOC_SUCCSE 0
void is_malloc_ok(link *list)
{
*list = (link)malloc(sizeof(Node));
if(*list == NULL)
{
exit(MALLOC_ERROR);
}
} void create_list(link *list)
{
is_malloc_ok(list);
(*list)->next = (*list);
(*list)->pr = (*list);
}
int insert_list(link *head,link *newnode)
{
link temp = (*head)->next;
while(temp != *head)
{
if((*newnode)->id < temp->id)
{
(*newnode)->next = temp;
(*newnode)->pr = temp->pr;
(temp->pr)->next = *newnode;
temp->pr = *newnode;
printf("\t\t\t录入信息成功!\n");
return ;
}
temp = temp->next;
}
(*newnode)->next = temp;
(*newnode)->pr = temp->pr;
(temp->pr)->next = *newnode;
temp->pr = *newnode;
printf("\t\t\t录入信息成功!\n");
return ;
}
void display_list(link *head)
{
link temp = (*head)->next;
if(temp == *head)
{
printf("您尚未录入任何信息\n");
}
while(temp != *head)
{
printf("\033[;32m \t********************您的联系人的基本信息*********************************\n\033[0m");
printf("\033[;32m \t* ID = %d \n\033[0m",temp->id);
printf("\033[;32m \t* 姓名:%s \n\033[0m",temp->name);
printf("\033[;32m \t* 电话号码:%s \n\033[0m",temp->phone);
printf("\033[;32m \t* 公司地址:%s \n\033[0m",temp->add);
printf("\033[;32m \t* 公司电话:%s \n\033[0m",temp->comp);
printf("\033[;32m \t*************************************************************************\n\033[0m");
temp = temp->next;
} } int delete_list(link *head,int num)
{
link temp = (*head)->next;
while(temp != *head)
{
if(temp->id == num)
{
(temp->pr)->next = temp->next;
(temp->next)->pr = temp->pr;
free(temp);
temp->next = NULL;
printf("\t\t刪除成功!\n");
return ;
}
temp = temp->next;
}
return -;
这是search.c文件 用于操作搜索!
}/***************************************************************
* 函數列表 *
* void display_id(link *head,int id)ID查詢 *
* void display_name(link *head,char *name)名字查詢 *
***************************************************************/
#include"data.h"
void display_id(link *head,int id)
{
int flag = ;
link temp = (*head)->next;
if(temp == *head)
{
printf("您的通讯录是空的!\n");
}
printf("\t\t以下为ID寻找方式得到的信息\n");
while(temp != *head)
{
if(temp->id == id)
{
printf("\033[;32m \t********************您的联系人的信息*********************************\n\033[0m");
printf("\033[;32m \t* ID = %d \n\033[0m",temp->id);
printf("\033[;32m \t* 姓名:%s \n\033[0m",temp->name);
printf("\033[;32m \t* 电话:%s \n\033[0m",temp->phone);
printf("\033[;32m \t* 公司地址:%s \n\033[0m",temp->add);
printf("\033[;32m \t* 公司电话:%s \n\033[0m",temp->comp);
printf("\033[;32m \t********************************************************************\n\033[0m");
flag = ;
}
temp = temp->next;
}
if(flag == )
{
printf("查无此人!\n");
}
}
void display_name(link *head,char *name)
{
int flag = ;
link temp = (*head)->next;
if(temp == *head)
{
printf("您的联系簿中是空的\n");
}
printf("以下为按照名字查询所得信息\n");
while(temp != *head)
{
if(strcmp(name,temp->name) == )
{
printf("\033[;32m \t********************您的联系人信息*********************************\n\033[0m");
printf("\033[;32m \t* ID = %d \n\033[0m",temp->id);
printf("\033[;32m \t* 姓名:%s \n\033[0m",temp->name);
printf("\033[;32m \t* 电话:%s \n\033[0m",temp->phone);
printf("\033[;32m \t* 公司地址:%s \n\033[0m",temp->add);
printf("\033[;32m \t* 公司电话:%s \n\033[0m",temp->comp);
printf("\033[;32m \t*************************************************************************\n\033[0m");
flag = ;
}
temp = temp->next;
}
if(flag == )
{
printf("查无此人!");
}
}
这是我写的makefile文件:
main = help.o ebook.o looplist.o search.o file.o
ebook:$(main)
@gcc $(main) -o ebook
main.o: main.c
@gcc main.c -c
help.o: help.c
@gcc help.c -c
looplist.o: looplist.c
@gcc looplist.c -c
search.o:search.c
@gcc search.c -c
file.o:file.c
@gcc file.c -c
.PHONY: clean cleanall
clean:
@rm *.o
cleanall:
@rm *.o ebook
多功能电子通讯录(涉及到了双向链表的使用,Linux文件编程等等)的更多相关文章
- C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)
说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...
- linux网络编程涉及的函数
常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息. netstat有许多的选项我们常用的选项是-an用来显示详细的网络状态.至于其它选项我们使用帮 ...
- SpringBoot日志配置(详解) 涉及控制台输出日志、生成日志文件、日志级别修改、hibernate日志不输出
写在前面 本篇主要讲述日志配置,看完本篇可以解决下述问题, 控制台输出日志.生成日志文件.日志级别修改.hibernate日志不输出 Git Demo Path:https://github.com/ ...
- Tomcat启动过程原理详解 -- 非常的报错:涉及了2个web.xml等文件的加载流程
Tomcat启动过程原理详解 发表于: Tomcat, Web Server, 旧文存档 | 作者: 谋万世全局者 标签: Tomcat,原理,启动过程,详解 基于Java的Web 应用程序是 ser ...
- C语言可以开发哪些项目?
C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中--,这些迷茫也导致了我们在学习的过程 ...
- C语言可以开发哪些项目?(转)
原文地址:https://www.cnblogs.com/shiyanlou/p/6098661.html 知乎:https://www.zhihu.com/question/20564904 C语言 ...
- 用C语言开发的19个经典项目,你会第几个?
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:实验楼 C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多 ...
- 通用双向链表的设计(参考Linux系统中的实现)
通常我们设计设计链表都是将数据域放在里面,这样每次需要使用链表的时候都需要实现一个链表,然后重新实现它的相关操作,这里参考Linux系统中的设计实现了一个通用的双向链表,只需要在你的结构里面有一个这个 ...
- iphone通讯录的备份与恢复
最近在做iOS系统通讯录备份到服务器,并且可以从服务器中下载备份文件恢复到手机的功能,部分实现细节记录如下. 将iphone系统通讯录生成.vcf文件 ABAddressBookRef address ...
随机推荐
- [Oracle]Oracle部分函数
1.nvl(a,b) 若a为null,则b 2.to_char(date,'YY-MM-DD') 按格式将date类型转为字符串 to_date('1999/1/1','YY-MM-DD') 将字符串 ...
- C# 时间戳与DateTime间的互相转换
//DateTime转换为时间戳public long GetTimeSpan(DateTime time) { DateTime startTime = TimeZone.CurrentTimeZo ...
- WPF 内部Template 动画板 无法冻结此 Storyboard 时间线树供跨线程使用
解决此问题,需要一定的想象力. 换个思路即可 大体是 使用Tag或者别无用的可以输入数值的属性,或者附加属性也可以的.来绑定到你要动画的属性 当然这个过程中要使用转换器了 我给出一个关于Button ...
- Syncthing源码解析 - 第三方库
1,AudriusButkevicius/cli 网址:https://github.com/AudriusButkevicius/cli 2,bkaradzic/go-lz4 网址:https:// ...
- php中的XML DOM(11)
7.创建节点 在dom操作中,增删改操作必须要找父节点 1.DOMElement DOMDocument::createElement ( string $name [, string $value ...
- Java中运算符“|”和“||”以及“&”和“&&”区别
1.“|”运算符:不论运算符左侧为true还是false,右侧语句都会进行判断,下面代码 int a =1,b=1; if(a++ == 1 | ++b == 2) System.out.printl ...
- 洛谷P2179 [NOI2012]骑行川藏(拉格朗日乘数法)
题面 传送门 题解 看\(mashirosky\)大佬的题解吧--这里 //minamoto #include<bits/stdc++.h> #define R register #def ...
- AtcoderExaWizards 2019题解
传送门 \(A\ Regular\ Triangle\) 咕咕 \(B\ Red\ or\ Blue\) 咕咕咕 \(C\ Snuke\ the\ Wizard\) 我可能脑子真的坏掉了-- 容易发现 ...
- nosql基本了解
数据库分为关系型数据库和非关系型数据库nosql,关系型数据库比较常见,此处不再多讲:nosql有key-value存储数据库,比如redis:文档型数据库,比如mongodb:列存储数据库,比如hb ...
- 回归到jquery
最近在做一个公司的老产品的新功能,使用原来的技术框架,jquery和一堆插件,使用jquery的话,灵活性是有了,但是对于一个工作了3年多的我来说,很low,没什么成就感,技术本身比较简单,但是业务的 ...