文件保存通讯录(单链表)—— 通讯录3.0

// 头文件
#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;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值