Linux C通讯录文件版

头文件:

#ifndef _LINKLIST_H_
#define _LINKLIST_H_

typedef int DATA;
typedef enum{TRUE,FALSE,ERROR}BOOL;
enum{QUIT,INSERT,DISPLAY,SEARCH,DELETE};
typedef struct addlist
{
	long pertel;
	long comtel;
	int  id;
	char address[20];
	char name[20];
}Txl;

typedef struct _node
{
	Txl te;
	
	struct _node *next;
}Node;
typedef struct _list
{
	Node *head;
}List;
//创建一个空链表
List *CreateList();
//删除链表
void Destory(List *pList);
//增加联系人
BOOL Insert_Frined(List *pList);
//显示联系人
void Display(List *pList);


//删除联系人
BOOL Delete_Friend(List *pList);
//查找联系人
BOOL Find_Friend(List *pList);

BOOL Sava_Friends(List *pList);
BOOL Load_Friends(List *pList);
BOOL Insert_Last(List *pList,Txl* data);
int myrand(int Rand_Max);
#endif //_LINKLIST_H_

功能函数

#include "LinkList.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#define SIZE 30
DATA randcount = 0;
int count_friend = 0;
List *CreateList()
{
	List *p = (List*)malloc(sizeof(List)/sizeof(char));
	if(NULL == p)
	{
		return NULL;
	}
	p->head = (Node*)malloc(sizeof(Node)/sizeof(char));
	p->head->next = NULL;
	if(NULL == p->head)
	{
		free(p);
		return NULL;
	}
	return p;
}
int myrand(int Rand_Max)//产生随机数
{
	
	
	int i=0;
	srand(time(NULL));
	
	int rnum=rand()%Rand_Max;
	
	return rnum;
	
}
BOOL Insert_Friend(List *pList)
{
	if(NULL == pList)
	{
		return ERROR;
		printf("添加失败\n");
	}
	/* Node *p = (Node*)malloc(sizeof(Node)/sizeof(char));
	if(NULL == p)
	{
		return ERROR;
		printf("添加失败\n");
	}
	p->next = NULL; */
	Txl data;
	printf("请输入姓名:\n");
	scanf("%s",data.name);
	int ran = ++randcount;
	data.id = ran;//给每个联系人分配一个ID
	printf("生成随机ID:%d\n",ran);
	printf("请输入个人手机号码:\n");
	scanf("%ld",&data.pertel);
	printf("请输入公司手机号码:\n");
	scanf("%ld",&data.comtel);
	printf("请输入家庭住址:\n");
	scanf("%s",data.address);
	printf("添加成功!\n");	
	
	Insert_Last(pList,&data);
	/* Node *tmp = pList->head;
	while(tmp->next)
	{
		tmp = tmp->next;
	}
	tmp->next = p; */
	count_friend++;
	return TRUE;
}
BOOL Sava_Friends(List *pList)
{
	if(pList == NULL)
	{
		return;
	}
	FILE *fp1  = fopen("txl","wb+");
	if(NULL == fp1)
	{
		perror("fail open fp1");
		return FALSE;
	}
	FILE *fp2  = fopen("count","ab+");
	if(NULL == fp2)
	{
		perror("fail open fp2");
		return FALSE;
	}
	Node *tmp = pList->head->next;
	int save_count = count_friend;
	fwrite(&save_count,sizeof(int),1,fp2);
	
	int i;
	
		while(tmp!=NULL)
		{
			fwrite(&tmp->te,sizeof(Txl),1,fp1);
			printf("save success\n");
			tmp = tmp->next;
		}
	
	
	
	fclose(fp1);
	fclose(fp2);
	return TRUE;
}
BOOL Load_Friends(List *pList)
{
	FILE* fp3  = fopen("txl","rb+");
	if(NULL == fp3)
	{
		perror("fail open fp3");
		return -1;
	}
	
	FILE* fp4  = fopen("count","rb+");
	if(NULL == fp4)
	{
		perror("fail open fp4");
		return -1;
	}
	int i;
	int load_count=0;
	while(1)
	{
		size_t ret = fread(&load_count,sizeof(int),1,fp4);
		if (0 == ret)  // 可能是文件结尾, 也可能是发生错误
		{
			if (feof(fp4) == 0) // 错误  
			{
				printf ("文件发生错误\n");
				return -1;
			}
			
			break;
		}
	
		
	}
	count_friend = load_count;
	printf("load_count = %d\n",load_count);
	printf("cofriend %d\n",count_friend);
	
	
	Txl history[load_count];
	for(i=0;i<load_count;i++)
	{
		fread(&history[i],sizeof(Txl),1,fp3);
		
		Insert_Last(pList,&history[i]);
		
		printf("load success\n");
	}
}
BOOL Insert_Last(List *pList,Txl* data)
{
	if(NULL == pList)
	{
		return ERROR;
	}
	Node *p = (Node*)malloc(sizeof(Node)/sizeof(char));
	if(NULL == p)
	{
		return ERROR;
	}
	p->te.pertel = data->pertel;
	p->te.comtel = data->comtel;
	p->te.id = data->id;
	strcpy(p->te.address,data->address);
	strcpy(p->te.name,data->name);
	p->next = NULL;
	Node *tmp = pList->head;
	while(tmp->next)
	{
		tmp = tmp->next;
	}
	tmp->next = p;
	
	return TRUE;
}	

BOOL Delete_Friend(List *pList)//删除联系人
{
	if(NULL == pList)
	{
		return ERROR;
	}
	char deletename[20];//记录输入的字符串
	printf("请输入要删除联系人的姓名:\n");
	scanf("%s",deletename);
	Node *tmp =pList->head;
	DATA count = 0;//记录是否有同名的联系人
	while(tmp->next)//第一次遍历看联系人姓名是否唯一
	{
		if(!(strcmp(tmp->next->te.name,deletename)))
		{
			count++;
			
		}
		tmp = tmp->next;
	}	
	Node *lp = pList->head->next;
	Node *tp = pList->head;
	Node *mp = pList->head;
	if(count >1)//如果不唯一
	{
		printf("有重名,请输入ID确认删除\n");
		int deleteid = 0;//记录ID,通过ID删除
		while(lp)
		{
			if(!(strcmp(lp->te.name,deletename)))//打印出相同姓名的联系人
			{
			
				printf("ID      : %d\n",lp->te.id);
				printf("姓名    : %s\n",lp->te.name);
				printf("个人电话: %ld\n",lp->te.pertel);
				printf("公司电话: %ld\n",lp->te.comtel);
				printf("家庭住址:  %s\n",lp->te.address);
				
			}
			
			
			lp = lp->next;
		}
		scanf("%d",&deleteid);//输入ID进行删除
		while(mp->next)//通过ID删除
		{
			if(mp->next->te.id == deleteid)
			{
				Node *p = mp->next;
				mp->next = p->next;
				free(p);
				printf("删除成功\n");
				count_friend--;
				return TRUE;
			}
			mp = mp->next;
		}
	}
	else//联系人姓名唯一,直接进行删除
	{
		while(tp->next)
		{
			if(!(strcmp(tp->next->te.name,deletename)))
			{
				
				Node *p = tp->next;
				tp->next = p->next;
				free(p);
				printf("删除成功\n");
				count_friend--;
				return TRUE;
			
			}
			tp = tp->next;
		}
	}		
	printf("未找到,删除失败\n");
		return FALSE;
		
}
BOOL Find_Friend(List *pList)//查找联系人
{
	if(NULL == pList)
	{
		return ERROR;
	}
	Node *tmp =pList->head->next;
	char searchname[20];
	printf("请输入要查找好友姓名:\n");
	scanf("%s",searchname);
	
	while(tmp!=NULL)
	{
		
		if(!(strcmp(tmp->te.name,searchname)))
		{
			printf("ID  : %d\n",tmp->te.id);
			printf("姓名: %s\n",tmp->te.name);
			printf("个人电话: %ld\n",tmp->te.pertel);
			printf("公司电话: %ld\n",tmp->te.comtel);
			printf("家庭住址:  %s\n",tmp->te.address);
			return TRUE;
		}
		tmp = tmp->next;
	}
	printf("未找到\n");
		return FALSE;
}

void Destory(List *pList)//释放空间
{
	if(NULL==pList)
	{
		return ;
	}
	Node *tmp = pList->head;
	while(tmp->next)
	{
		Node *p = tmp->next;
		tmp->next = p->next;
		free(p);
	}
	free(pList->head);
	free(pList);
}
void Display(List *pList)//显示联系人
{
	if(NULL==pList)
	{
		return ;
	}
	
	Node *tmp = pList->head->next;
	
	while(tmp)
	{
		printf("ID  : %d\n",tmp->te.id);
		printf("姓名: %s\n",tmp->te.name);
		printf("个人电话: %ld\n",tmp->te.pertel);
		printf("公司电话: %ld\n",tmp->te.comtel);
		printf("家庭住址:  %s\n",tmp->te.address);
		tmp = tmp->next;
	}
	
	printf("\n");
}

主函数:

#include <stdio.h>
#include "LinkList.h"
#include <string.h>
int main()
{
	int com = 0;
	List *l = CreateList();
	Load_Friends(l);
	 while(1)
	{
		printf("\t**************\n");
		printf("\t*1.添加好友信息*\n");
		printf("\t*2.列表好友信息*\n");
		printf("\t*3.搜索好友信息*\n");
		printf("\t*4.删除好友信息*\n");
		printf("\t*0. 退出通讯录 *\n");
		printf("\t**************\n");
		scanf("%d",&com);
		switch(com)
		{
			case INSERT:
				system("clear");
				Insert_Friend(l);
				
				break;
			case DISPLAY:
				system("clear");
				Display(l);
				break;
			case SEARCH:
				system("clear");
				Find_Friend(l);
				break;
			case DELETE:
			system("clear");
			Delete_Friend(l);
				break;
			case QUIT:
			Sava_Friends(l);
			printf("谢谢使用!\n");
				return ;
			default:
				printf("请输入正确的选项\n");
				break;
		}
		
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值