// 头文件
#ifndef _ADDRESS_H
#define _ADDRESS_H
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SUCCESS 10000
#define FAILURE 10001
#define TRUE 10002
#define FALSE 10003
struct address
{
char name[20]; // 名字
char sex[10]; // 性别
int age; // 年龄
char tel[12]; // 电话
char addre[20]; // 地址
struct address *next; // 指针域
};
typedef struct address L;
void menu(); // 显示界面
int Init(L **l); // 初始化链表
int namesort(L *l); // 以名字排序
int agesort(L *l); // 以年龄排序
int Insert(L *l); // 1、添加联系人
int show(L *l); // 2、显示所有联系人信息
int delet(L *l); // 3、删除联系人信息
int mod(L *l); // 4、修改联系人信息
int find(L *l); // 5、查找联系人
int savefile(L *l); // 6、保存联系人信息
int readfile(L *l); // 7、读取联系人信息
#endif
// 主函数文件
#include "address.h"
int main()
{
int ret,n = 0;
char ch;
L *l;
ret = Init(&l);
if(FAILURE == ret)
{
printf("Init Failure!");
exit(1);
}
ret = readfile(l);
if(FAILURE == ret)
{
printf("read file Failure!");
}
while(1)
{
menu();
printf("请输入选择的操作:");
scanf(" %c",&ch);
printf("\n");
switch(ch)
{
case '1':
ret = Insert(l);
if(FAILURE == ret)
{
printf("添加联系人失败\n");
}
else
{
printf("添加联系人成功\n");
}
break;
case '2':
ret = show(l); // 显示所有联系人信息
if(FAILURE == ret)
{
printf("查看联系人失败\n");
}
else if(FALSE == ret)
{
printf("通讯录为空,没有可以显示的联系人\n");
}
sleep(2);
break;
case '3':
ret = delet(l);
if(FAILURE == ret)
{
printf("删除失败\n");
}
else if(TRUE == ret) // 找不到
{
printf("通讯录中没有你要删除的联系人\n");
}
else if(ret == FALSE) // 没有
{
printf("通讯录为空,没有可以删除的联系人\n");
}
else
{
printf("删除成功\n");
}
sleep(2);
break;
case '4':
ret = mod(l);
if(FAILURE == ret)
{
printf("修改失败\n");
}
else if(ret == FALSE) // 空的时候
{
printf("通讯录为空,没有可以修改的联系人\n");
}
else if(ret == TRUE) // 找不到
{
printf("通讯录中没有要修改的联系人\n");
}
else // 找到
{
printf("修改成功\n");
}
sleep(2);
break;
case '5':
ret = find(l);
if(FAILURE == ret)
{
printf("查找失败\n");
}
else if(ret == FALSE) // 没有
{
printf("通讯录为空,没有可以查询的联系人\n");
}
else if(TRUE == ret) // 找不到
{
printf("通讯录中没有要查询的联系人\n");
}
else
{
printf("查找成功\n");
}
sleep(2);
break;
case '6':
ret = savefile(l);
if(ret == FAILURE)
{
printf("保存失败\n");
}
else
{
printf("保存成功\n");
}
sleep(2);
case '0':
break;
default :
printf("输入有误,请重新输入!\n");
break;
}
if(ch == '0')
{
printf("是否确定退出?1/0\n");
scanf("%d",&n);
if(1 == n)
{
printf("欢迎下次使用\n");
break;
}
}
}
return 0;
}
// 功能函数文件
#include "address.h"
void menu() //显示通讯录界面,方便进行功能选择
{
//system("color f4");// 控制背景色和字体颜色 红色字体,亮白色背景
printf("================================================\n");
printf("=== 通讯录3.0 ===\n");
printf("================================================\n");
printf("=== ===\n");
printf("=== 1、添加联系人 ===\n");
printf("=== 2、显示联系人 ===\n");
printf("=== 3、删除联系人 ===\n");
printf("=== 4、修改联系人 ===\n");
printf("=== 5、查找联系人 ===\n");
printf("=== 6、保存联系人 ===\n");
//printf("=== 7、读取联系人 ===\n");
printf("=== 0、退出通讯录 ===\n");
printf("=== ===\n");
printf("================================================\n");
}
int Init( L **l) // 初始化链表
{
*l = (L *)malloc(sizeof(L)*1);
if(NULL == (*l))
{
return FAILURE;
}
(*l)->next = NULL;
return SUCCESS;
}
int namesort(L *l) // 以名字排序
{
L *h,*p,*p1,*q,*q1,*t;
int flag;
if(NULL == l || l->next == NULL || l->next->next == NULL)
{
return FAILURE;
}
h = l;
p = h->next;
p1 = p->next;
while(p1 != NULL)
{
flag = 1;
t = p1;
for(q = h,q1 = q->next;q1 != p1;q = q->next,q1 = q1->next)
{
if(strcmp(q1->name,p1->name) > 0)
{
p1 = p1->next;
p->next = p1;
q->next = t;
t->next = q1;
flag = 0;
break;
}
}
if(flag)
{
p = p->next;
p1 = p->next;
}
}
return SUCCESS;
}
int agesort(L *l) // 以年龄排序
{
L *h,*p,*p1,*q,*q1,*t;
int flag;
if(NULL == l || l->next == NULL || l->next->next == NULL)
{
return FAILURE;
}
h = l;
p = h->next;
p1 = p->next;
while(p1 != NULL)
{
flag = 1;
t = p1;
for(q = h,q1 = q->next;q1 != p1;q = q->next,q1 = q1->next)
{
if(q1->age < p1->age)
{
p1 = p1->next;
p->next = p1;
q->next = t;
t->next = q1;
flag = 0;
break;
}
}
if(flag)
{
p = p->next;
p1 = p->next;
}
}
return SUCCESS;
}
int Insert(L *l) // 1、添加联系人信息
{
L *p = l;
char nam[20],ch;
if (NULL == l)
{
return FAILURE;
}
while (p->next != NULL) // 移动到最后
{
p = p->next;
}
L *q;
printf("添加联系人,输入'bye'时,结束添加联系人\n");
printf("请输入姓名:");
scanf(" %s",nam);
while(strcmp(nam,"bye") != 0)
{
q = (L *)malloc(sizeof(L) * 1);
if (NULL == q)
{
return FAILURE;
}
strcpy(q->name,nam);
//printf("\n");
printf("请输入性别:");
scanf(" %s",q->sex);
//printf("\n");
printf("请输入年龄:");
scanf(" %d",&q->age);
//printf("\n");
printf("请输入电话:");
scanf(" %s",q->tel);
//printf("\n");
printf("请输入地址:");
scanf(" %s",q->addre);
printf("\n");
q->next = p->next;
p->next = q;
p = q;
while(1)
{
printf("是否继续输入?y/n:");
scanf(" %c",&ch);
printf("\n");
if(ch == 'y')
{
printf("请输入姓名:");
while(1)
{
scanf("%s",nam);
//printf("\n");
if(strcmp(nam,"bye") != 0)
{
break;
}
}
break;
}
else if(ch == 'n')
{
strcpy(nam,"bye");
break;
}
else
{
printf("请输入'y/n'!\n");
}
}
}
return SUCCESS;
}
int show(L *l) // 2、显示所有联系人信息
{
int ret,n;
L *p = l;
if(NULL == l) // 入参判断
{
return FAILURE;
}
if(l->next == NULL) // 空链表
{
return FALSE;
}
if(p->next->next == NULL ) // 只有一个联系人的时候
{
printf("联系人信息如下:\n");
printf("姓名\t性别\t 年龄\t\t电话\t地址\n");
printf("%s\t %s\t %d\t %s\t %s\t\n",p->next->name,p->next->sex,p->next->age,p->next->tel,p->next->addre);
return SUCCESS;
}
while(1)
{
printf("请输入选择方式:1、以姓名显示 2、以年龄显示 其它、直接显示\n");
scanf("%d",&n);
if(1 == n)
{
ret = namesort(l);
if(FAILURE == ret)
{
printf("namesort Failure!\n");
}
break;
}
else if(2 == n)
{
ret = agesort(l);
if(FAILURE == ret)
{
printf("agesort Failure!\n");
}
break;
}
else // 默认
{
break;
}
}
p = p->next;
printf("联系人信息如下:\n");
printf("姓名 性别 年龄 电话 地址\n");
while(p != NULL)
{
printf("%s\t %s\t %d\t %s\t %s\n",p->name,p->sex,p->age,p->tel,p->addre);
p = p->next;
}
return SUCCESS;
}
int delet(L *l) // 3、删除联系人信息
{
char nam[20],ch;
int k = 1;
L *p,*q;
if(NULL == l) // 入参判断
{
return FAILURE;
}
if(NULL == l->next) // 空链表
{
return FALSE;
}
p = l;
printf("请输入要删除联系人的姓名:");
scanf("%s",nam);
printf("\n");
while(p->next != NULL)
{
if(strcmp(p->next->name,nam) == 0)
{
q = p->next;
printf("要删除联系人信息如下:\n");
printf("姓名:%s\t性别:%s\t年龄:%d\t电话:%s\t地址:%s\t\n",q->name,q->sex,q->age,q->tel,q->addre);
printf("是否确定删除 y/n : ");
scanf(" %c",&ch);
while(1)
{
if('y' == ch || 'n' == ch)
{
break;
}
else
{
printf("请输入 y/n :");
scanf(" %c",&ch);
}
}
if('y' == ch)
{
p->next = q->next;
if(p->next == NULL)
{
k = 0;
}
free(q);
}
break;
}
p = p->next;
}
if(p->next == NULL && k == 1) // 没有找到
{
return TRUE;
}
return SUCCESS;
}
int mod(L *l) // 4、修改联系人信息
{
L *p = l->next;
char nam[20],ch;
int k = 0;
if(NULL == l) // 入参判断
{
return FAILURE;
}
if(NULL == l->next) // 空链表
{
return FALSE;
}
printf("请输入要修改联系人的姓名:");
scanf("%s",nam);
printf("\n");
while(p != NULL)
{
if(strcmp(p->name,nam) == 0)
{
printf("要修改联系人信息如下:\n");
printf("姓名:%s\t性别:%s\t年龄:%d\t电话:%s\t地址:%s\t\n",p->name,p->sex,p->age,p->tel,p->addre);
printf("是否确定修改 y/n :");
scanf(" %c",&ch);
if('y' == ch)
{
printf("请输入姓名:");
scanf(" %s",p->name);
//printf("\n");
printf("请输入性别:");
scanf(" %s",p->sex);
//printf("\n");
printf("请输入年龄:");
scanf(" %d",&p->age);
//printf("\n");
printf("请输入电话:");
scanf(" %s",p->tel);
//printf("\n");
printf("请输入地址:");
scanf(" %s",p->addre);
printf("\n");
}
break;
}
p = p->next;
}
if(p == NULL)
{
return TRUE;
}
return SUCCESS;
}
int find(L *l) // 5、查找联系人
{
L *p = l->next;
char nam[20];
if(NULL == l) // 入参判断
{
return FAILURE;
}
if(NULL == l->next) // 空链表
{
return FALSE;
}
printf("请输入要查找的联系人姓名:");
scanf("%s",nam);
printf("\n");
while(p != NULL)
{
if(strcmp(p->name,nam) == 0)
{
printf("要修改联系人信息如下:\n");
printf("姓名:%s\t性别:%s\t年龄:%d\t电话:%s\t地址:%s\t\n",p->name,p->sex,p->age,p->tel,p->addre);
break;
}
p = p->next;
}
if(p == NULL)
{
return TRUE;
}
return SUCCESS;
}
int savefile(L *l) // 保存联系人信息
{
int fp,ret;
L *p = l;
if(NULL == l)
{
return FAILURE;
}
fp = open("address.txt",O_WRONLY | O_TRUNC); // O_WRONLY 只读方式 O_TRUNC 覆盖文件之前内容
if(fp == -1)
{
perror("opensave");
exit(1);
}
while(p->next != NULL)
{
p = p->next;
ret = write(fp,p,sizeof(L));
if(-1 == ret)
{
perror("write");
exit(1);
}
}
close(fp);
return SUCCESS;
}
int readfile(L *l) // 读取文件信息
{
int fp,ret;
L *p = l,*q;
if(l == NULL)
{
return FAILURE;
}
fp = open("address.txt",O_RDONLY); // O_WRONLY 只写方式
if(fp == -1)
{
perror("open0");
}
while(1)
{
q = (L *)malloc(sizeof(L)*1);
ret = read(fp,q,sizeof(L));
if(-1 == ret)
{
perror("read");
exit(1);
}
if(ret == 0)
{
break;
}
q->next = p->next;
p->next = q;
p = p->next;
}
close(fp); // 关闭文件
return SUCCESS;
}