三个文件 :address_list.h function.c main.c
核心文件存储:
//读数据
int readfiledata(ADDRESS *address)
{
int fd;
int bytes_read;
NODE node;
ADDRESS new_node = NULL;
if(CREATE_NO == create_address_list(address)) //创建通讯录
{
return READ_NO;
}
if((fd = open("address.txt", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) == -1)
{
perror("open file error!");
return READ_NO;
}
while(bytes_read = read(fd,&node,sizeof(node)))
{
if(bytes_read == -1)
{
perror("read error!");
return READ_NO;
}
else if(bytes_read < sizeof(node))
{
continue;
}
else if(bytes_read == sizeof(node))
{
if(CREATE_OK == create_node(&new_node)) //创建节点
{
new_node->num = node.num;
strcpy(new_node->name, node.name);
strcpy(new_node->sex, node.sex);
strcpy(new_node->number, node.number);
insert_mid_front(*address, new_node); //节点前插入
}
else
{
return READ_NO;
}
}
}
close(fd);
return READ_OK;
}
void save_data(ADDRESS address) //保存数据
{
int fd;
int bytes_write;
NODE *ptr;
NODE node;
ADDRESS p = NULL;
p = address->next;
if((fd = open("address.txt", O_RDWR)) == -1)
{
perror("open error!");
}
while(p != NULL)
{
node.num = p->num;
strcpy(node.name, p->name);
strcpy(node.sex, p->sex);
strcpy(node.number, p->number);
ptr = &node;
while(bytes_write = write(fd, ptr, sizeof(node)))
{
if(bytes_write == -1)
{
perror("write error!");
break;
}
else if(bytes_write == sizeof(node))
{
break;
}
else if(bytes_write < sizeof(node))
{
ptr -= bytes_write;
}
}
if(bytes_write == -1)
{
break;
}
p = p->next;
}
if(NULL == p)
{
printf(" ");
printf("保存成功!\n");
}
close(fd);
}
address_list.h
#ifndef _ADDRESS_LIST_H_
#define _ADDRESS_LIST_H_
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#define NAME_SIZE 10
#define SEX_SIZE 6
#define NUM_SIZE 11
enum return_val{
CREATE_OK = 100,
CREATE_NO,
MALLOC_OK,
MALLOC_NO,
DELETE_OK,
DELETE_NO,
READ_NO,
READ_OK,
};
typedef struct address_node
{
int num;
char name[NAME_SIZE];
char sex[SEX_SIZE];
char number[NUM_SIZE];
struct address_node *next;
}*ADDRESS;
typedef struct node_data
{
int num;
char name[NAME_SIZE];
char sex[SEX_SIZE];
char number[NUM_SIZE];
}NODE;
extern void welcome(); //欢迎界面
extern void interface(); //目录
extern int is_malloc_ok(ADDRESS address); //内存分配
extern int create_node(ADDRESS *address); //创建节点
extern int create_address_list(ADDRESS *address); //创建通讯录
extern void insert_mid_front(ADDRESS address, ADDRESS new_node); //节点前插入
extern ADDRESS seek_node_num(ADDRESS address, int num); //按序号查找
//按姓名查找
extern ADDRESS seek_node_name(ADDRESS address, char *name);
//按姓名删除
extern int delete_node(ADDRESS address, char name[]);
extern void select_function(int *select); //选择功能
//遍历链表
extern void display_data(ADDRESS address);
extern void make_empty(ADDRESS address); //清空数据
extern void exit_address_list(ADDRESS *address); //退出通讯录
//单个输入
extern void insert_one(ADDRESS address);
//多个输入
extern void insert_more(ADDRESS address);
extern void insert_infro(ADDRESS address); //输入数据
extern void seek_data(ADDRESS address); //查找数据
extern void delete_data(ADDRESS address); //删除数据
extern void save_data(ADDRESS address); //保存数据
extern int readfiledata(ADDRESS *address);
#endif
function.c
#include "address_list.h"
void welcome() //欢迎界面
{
printf(" ");
printf("*******************************************************");
printf("\n\n");
printf(" Welcome you!");
printf("\n\n");
printf(" ");
printf("*******************************************************");
printf("\n\n");
}
//通讯录界面
void interface()
{
printf(" ");
printf("*******************************************************");
printf("\n\n");
printf(" ");
printf("*************************目录**************************");
printf("\n\n");
printf(" ");
printf("******************* 1、输入数据 ***********************");
printf("\n\n");
printf(" ");
printf("******************* 2、显示数据 ***********************");
printf("\n\n");
printf(" ");
printf("******************* 3、查找数据 ***********************");
printf("\n\n");
printf(" ");
printf("******************* 4、删除数据 ***********************");
printf("\n\n");
printf(" ");
printf("******************* 5、清空数据 ***********************");
printf("\n\n");
printf(" ");
printf("******************* 6、保存数据 ***********************");
printf("\n\n");
printf(" ");
printf("****************** 7、退出通讯录 **********************");
printf("\n\n");
printf(" ");
printf("*******************************************************");
printf("\n\n");
}
/*********但链表**********/
int is_malloc_ok(ADDRESS address) //内存分配
{
if(NULL == address)
{
return MALLOC_NO;
}
return MALLOC_OK;
}
int create_node(ADDRESS *address) //创建节点
{
*address = (ADDRESS)malloc(sizeof(struct address_node));
if(MALLOC_OK == is_malloc_ok(*address))
{
return CREATE_OK;
}
return CREATE_NO;
}
int create_address_list(ADDRESS *address) //创建通讯录
{
if(CREATE_OK == create_node(address))
{
(*address)->next = NULL;
return CREATE_OK;
}
return CREATE_NO;
}
void insert_mid_front(ADDRESS address, ADDRESS new_node) //节点前插入
{
ADDRESS p = NULL;
ADDRESS q = NULL;
q = address;
p = address->next;
while((p != NULL) && (p->num < new_node->num))
{
q = p;
p = p->next;
}
new_node->next = p;
q->next = new_node;
}
//按序号查找
ADDRESS seek_node_num(ADDRESS address, int num)
{
ADDRESS p = NULL;
p = address->next;
while(NULL != p)
{
if(num == p->num)
{
return p;
}
p = p->next;
}
return NULL;
}
//按姓名查找
ADDRESS seek_node_name(ADDRESS address, char *name)
{
ADDRESS p = NULL;
p = address->next;
while(NULL != p)
{
if(0 == strcmp(name, p->name))
{
return p;
}
p = p->next;
}
return NULL;
}
//按姓名删除
int delete_node(ADDRESS address, char name[])
{
ADDRESS p = NULL;
ADDRESS q = NULL;
q = address;
p = address->next;
while((NULL != p) &&(0 != strcmp(name, p->name)))
{
q = p;
p = p->next;
}
if(NULL == p)
{
return DELETE_NO;
}
else
{
q->next = p->next;
free(p);
return DELETE_OK;
}
}
/********通讯录功能**********/
//遍历链表
void display_data(ADDRESS address)
{
ADDRESS p = NULL;
p = address->next;
system("clear");
interface();
if(NULL == address)
{
printf(" ");
printf("通讯录不存在!\n");
return ;
}
if(NULL == p)
{
printf(" ");
printf("通讯录为空!\n");
return ;
}
while(NULL != p)
{
printf(" ");
printf("序号:%2d", p->num);
printf(" ");
printf("姓名:%8s", p->name);
printf(" ");
printf("性别:%4s", p->sex);
printf(" ");
printf("电话:%15s", p->number);
printf("\n");
p = p->next;
}
}
void make_empty(ADDRESS address) //清空数据
{
ADDRESS p = NULL;
p = address->next;
system("clear");
interface();
while(NULL != p)
{
address->next = p->next;
free(p);
p = p->next;
}
printf(" ");
printf("数据清空成功!\n");
}
void exit_address_list(ADDRESS *address) //退出通讯录
{
make_empty(*address); //清空数据
free(*address);
*address = NULL;
printf(" ");
printf("退出成功!\n");
}
void select_function(int *select) //选择功能
{
printf("\n\n ");
printf("请选择您的功能:\n");
printf(" ");
scanf("%d", select);
}
//单个输入
void insert_one(ADDRESS address)
{
ADDRESS new_node = NULL;
system("clear");
interface();
printf(" ");
printf("请输入成员信息!\n\n");
if(CREATE_OK == create_node(&new_node))
{
printf(" ");
printf("请输入序号(如12):");
scanf("%d", &(new_node->num));
printf("\n ");
printf("请输入姓名(如张三):");
scanf("%s", new_node->name);
printf("\n ");
printf("请输入性别(如男):");
scanf("%s", new_node->sex);
printf("\n ");
printf("请输入电话(如 1234567891):");
scanf("%s", new_node->number);
insert_mid_front(address, new_node); //节点前插入
}
else
{
printf("输入信息失败!\n");
return ;
}
}
//多个输入
void insert_more(ADDRESS address)
{
ADDRESS new_node = NULL;
int num;
int i;
system("clear");
interface();
printf(" ");
printf("请输入成员个数:");
scanf("%d", &num);
for(i = 0; i < num; i++)
{
if(CREATE_OK == create_node(&new_node))
{
printf(" ");
printf("请输入序号(如12):");
scanf("%d", &(new_node->num));
printf("\n ");
printf("请输入姓名(如张三):");
scanf("%s", new_node->name);
printf("\n ");
printf("请输入性别(如男):");
scanf("%s", new_node->sex);
printf("\n ");
printf("请输入电话(如 1234567891):");
scanf("%s", new_node->number);
insert_mid_front(address, new_node); //节点前插入
}
else
{
printf("输入信息失败!\n");
return ;
}
system("clear");
interface();
}
}
void insert_infro(ADDRESS address) //输入数据
{
int i;
system("clear");
interface();
printf(" ");
printf("请选择输入方式:\n");
printf(" ");
printf("1、单项输入\n");
printf(" ");
printf("2、多项输入\n");
printf(" ");
printf("输入:");
scanf("%d", &i);
if(1 == i)
{
insert_one(address);
}
if(2 == i)
{
insert_more(address);
}
}
void seek_data(ADDRESS address) //查找数据
{
ADDRESS p = NULL;
int i;
int num;
char name[NAME_SIZE];
system("clear");
interface();
printf(" ");
printf("请选择查找方式:\n");
printf(" ");
printf("1、序号查找\n");
printf(" ");
printf("2、姓名查找\n");
printf(" ");
printf("输入:");
scanf("%d", &i);
if(1 == i)
{
printf(" ");
printf("请输入查找的序号:");
scanf("%d", &num);
p = seek_node_num(address, num);
printf(" ");
printf("序号:%2d", p->num);
printf(" ");
printf("姓名:%8s", p->name);
printf(" ");
printf("性别:%4s", p->sex);
printf(" ");
printf("电话:%15s", p->number);
printf("\n");
}
if(2 == i)
{
printf(" ");
printf("请输入查找的姓名:");
scanf("%s", name);
p = seek_node_name(address, name);
printf(" ");
printf("序号:%2d", p->num);
printf(" ");
printf("姓名:%8s", p->name);
printf(" ");
printf("性别:%4s", p->sex);
printf(" ");
printf("电话:%15s", p->number);
printf("\n");
}
}
void delete_data(ADDRESS address) //删除数据
{
char name[NAME_SIZE];
system("clear");
interface();
printf(" ");
printf("请输入删除的姓名:");
scanf("%s", name);
if(DELETE_OK == delete_node(address, name))
{
printf(" ");
printf("删除成功!\n");
}
else
{
printf(" ");
printf("删除失败!\n");
}
}
//读数据
int readfiledata(ADDRESS *address)
{
int fd;
int bytes_read;
NODE node;
ADDRESS new_node = NULL;
if(CREATE_NO == create_address_list(address)) //创建通讯录
{
return READ_NO;
}
if((fd = open("address.txt", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) == -1)
{
perror("open file error!");
return READ_NO;
}
while(bytes_read = read(fd,&node,sizeof(node)))
{
if(bytes_read == -1)
{
perror("read error!");
return READ_NO;
}
else if(bytes_read < sizeof(node))
{
continue;
}
else if(bytes_read == sizeof(node))
{
if(CREATE_OK == create_node(&new_node)) //创建节点
{
new_node->num = node.num;
strcpy(new_node->name, node.name);
strcpy(new_node->sex, node.sex);
strcpy(new_node->number, node.number);
insert_mid_front(*address, new_node); //节点前插入
}
else
{
return READ_NO;
}
}
}
close(fd);
return READ_OK;
}
void save_data(ADDRESS address) //保存数据
{
int fd;
int bytes_write;
NODE *ptr;
NODE node;
ADDRESS p = NULL;
p = address->next;
if((fd = open("address.txt", O_RDWR)) == -1)
{
perror("open error!");
}
while(p != NULL)
{
node.num = p->num;
strcpy(node.name, p->name);
strcpy(node.sex, p->sex);
strcpy(node.number, p->number);
ptr = &node;
while(bytes_write = write(fd, ptr, sizeof(node)))
{
if(bytes_write == -1)
{
perror("write error!");
break;
}
else if(bytes_write == sizeof(node))
{
break;
}
else if(bytes_write < sizeof(node))
{
ptr -= bytes_write;
}
}
if(bytes_write == -1)
{
break;
}
p = p->next;
}
if(NULL == p)
{
printf(" ");
printf("保存成功!\n");
}
close(fd);
}
main.c
#include "address_list.h"
int main(int argc, char *argv[])
{
int select;
ADDRESS address = NULL;
system("clear");
welcome();
sleep(1);
system("clear");
interface();
if(READ_NO == readfiledata(&address))
{
return 0;
}
/*if(CREATE_NO == create_address_list(&address)) //创建通讯录
{
return 0;
}*/
while(1)
{
select_function(&select);
switch(select)
{
case 1:
insert_infro(address); //输入数据
break;
case 2:
display_data(address); //显示数据
break;
case 3:
seek_data(address); //查找数据
break;
case 4:
delete_data(address); //删除数据
break;
case 5:
make_empty(address); //清空数据
break;
case 6:
save_data(address); //保存数据
break;
case 7:
exit_address_list(&address); //退出通讯录
break;
default :
printf("您输入错误!请重新输入!\n");
break;
}
if(7 == select)
{
goto key;
}
}
key:
return 0;
}