通讯录save版

LinkList.h

#ifndef _LINKLIST_H_
#define _LINKLIST_H_



typedef enum {TRUE, FALSE, ERROR }  BOOL;

typedef struct data
{
	int id;
	char name[20];
	char addr[20];
	long long tel;
	long long off;
}Data;

typedef struct node
{
	Data data;
	struct node *next;
}Node;

typedef struct _list
{
	Node *head;
}List;


// 创建链表
List* CreateList();


//尾插
BOOL Insert_Last(List *ls,Data data);



//删除特定位置的数据
//pos:第pos个结点位置
BOOL Delete_Data(List *ls);



void Destroy(List *ls);

void Display(List *ls);




#endif // _LINKLIST_H_


LinkList.c

#include "LinkList.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

List* CreateList()
{
	List *ls = (List*)malloc(sizeof(List)/sizeof(char));
	if (NULL == ls)
		return NULL;
	
	// 创建头节点
	ls->head = (Node*)malloc(sizeof(Node)/sizeof(char));
	if(NULL == ls->head)
	{
		free(ls);
		return NULL;
	}
	
	ls->head->next=NULL;//空链表
	
	
	return ls;
}




BOOL Insert_Last(List *ls,Data data)
{
	if (NULL == ls)
		return ERROR;
	
	Node *node =(Node*)malloc(sizeof(Node)/sizeof(char));
	
	if(NULL==node)
		return ERROR;
	
	node->data=data;
	
	node->next=NULL;
	
	Node *tmp=ls->head;
	
	while(tmp->next)//while里面是tmp->next,设定tmp=ls->hesd
	{
		tmp=tmp->next;
	}
	tmp->next=node;
	return TRUE;
}


BOOL Delete_Data(List *ls)
{
	if (NULL == ls)
		return ERROR;
	
	char g_name[20];
	printf("\t\t请输入你想要删除的好友姓名\n\t\t");
	scanf("%s", g_name);
	
	// if (flag==0)
	// {
		// printf("删除成功!\n");
	// }
		
	Node *tmp=ls->head;
	
	while(tmp->next)
	{
		if(strcmp(tmp->next->data.name, g_name)==0)
		{
			Node *p=tmp->next;
			tmp->next=p->next;
			free(p);
			return TRUE;
		}
		tmp=tmp->next;
	}
	
	return TRUE;
}

void Display(List *ls)
{
	if (NULL == ls)
		return ;
	
	Node *tmp=ls->head;//while里面是tmp,设定tmp=ls->hesd->next
	printf("\t\t列表好友信息如下\n");
	
	while(tmp->next != NULL)
	{
		printf("\t\t----------------------------------------------------------------------\n");
		printf("\t\tid: %d\t",tmp->next->data.id);
		printf(" 姓名: %s\t",tmp->next->data.name);
		printf(" 家庭住址:%s\t",tmp->next->data.addr);
		printf(" 手机号码:%lld\t",tmp->next->data.tel);
		printf(" 公司电话:%lld\n",tmp->next->data.off);

		tmp=tmp->next;
	}
	printf("\t\t----------------------------------------------------------------------\n");
}
	
	
void Destroy(List* ls)
{
	if (NULL == ls)
		return;
	
	Node *tmp=ls->head;
	
	while(tmp->next)
	{
		Node *p=tmp->next;
		tmp->next=p->next;
		free(p);
	}
	
	free(ls->head);
	free(ls);
}

main.c

#include <stdio.h>
#include "LinkList.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int g_id=1;
enum menu{ADD = '1', DISPLAY, SEARCH, DELETE, QUIT };

int read_file(List *ls)
{
	int fd = open("tmp.txt", O_RDONLY);
	if (-1 == fd)
	{
		perror("打开tmp.txt文件失败");
		return -1;
	}

	// 获取文件大小
	off_t ret1 = lseek(fd, 0, SEEK_END);
	if(0 == ret1)
	{
		return;
	}
	lseek(fd, 0, SEEK_SET);
	Node *tmp = ls->head->next;
	ssize_t ret2;
	Data data;
	
	while((ret2 = read(fd, &data, sizeof(Data))) != 0)
	{
		if (-1 == ret2)
		{
			perror("读失败");
			return -1;
		}
		Insert_Last(ls,data);
	}
	close(fd);
}
	

int save_file(List *ls)
{
	if (NULL == ls)
		return ;
	if(ls->head->next==NULL)
	{
		return;
	}
	Node *tmp=ls->head;
	int fd = open("tmp.txt", O_WRONLY|O_CREAT | O_TRUNC, 0766);
	
	if (-1 == fd)
	{
		perror("打开tmp.txt文件失败");
		return -1;
	}
	
	while(tmp->next != NULL)
	{
		
		ssize_t ret = write(fd, &(tmp->next->data), sizeof(Data));
		if (-1 == ret)
		{
			perror("写入失败");
			return -1;
		}
		tmp=tmp->next;
	}
	close(fd);
}
		
	
	

void add(List *ls)
{
	Data data;
	data.id=g_id++;
	
	printf("\t\t 请输入好友姓名: ");
	scanf("%s",data.name);
	printf("\t\t 请输入好友家庭住址: ");
	scanf("%s",data.addr);
	printf("\t\t 请输入好友手机号码: ");
	scanf("%lld",&data.tel);
	printf("\t\t 请输入好友公司电话: ");
	scanf("%lld",&data.off);
	
	Insert_Last(ls, data);
	
	printf("\t\t好友添加成功\n");
	
}


	

void find(List *ls)
{
	char g_name[20];
	printf("\t\t请输入你想要查找的好友姓名\n");
	printf("\t\t");
	scanf("%s",g_name);
	getchar();
	
	Node *tmp=ls->head;
	printf("\t\t");
	while(tmp->next)
	{
		if(strcmp(tmp->next->data.name, g_name)==0)
		{
			printf("-------------------\n");
			printf("\t\t您查找的好友信息如下\n");
			printf("\t\t id: %d\n",tmp->next->data.id);
			printf("\t\t 姓名: %s\n",tmp->next->data.name);
			printf("\t\t 家庭住址:%s\n",tmp->next->data.addr);
			printf("\t\t 手机号码:%lld\n",tmp->next->data.tel);
			printf("\t\t 公司电话:%lld\n",tmp->next->data.off);
			printf("\t\t--------------------\n");
			break;
		}
	}
}	
	
int main()
{
	List *ls = CreateList();
	if (NULL == ls)
	{
		printf ("创建链表失败\n");
	}
	
	printf ("创建链表成功\n");
	read_file(ls);
	
	char order[10];
	while(1)
	{
		system("clear");
		printf("\t\t--------------\n");
		printf("\t\t 1:添加好友信息\n");
		printf("\t\t 2:列表好友信息\n");
		printf("\t\t 3:搜索好友\n");
		printf("\t\t 4:删除好友\n");
		printf("\t\t 5: 退出\n");
		printf("\t\t--------------\n");
		
		printf("\t\t请输入你需要操作的指令序号\n");
		printf("\t\t");
		fgets(order,10, stdin);
		system("clear");
		
		
		switch(order[0])
		{
			case ADD:
				add(ls);
				break;
			case DISPLAY:
				Display(ls);
				break;
			case SEARCH:
				find(ls);
				break;
			case DELETE:
				Delete_Data(ls);
				break;
			case QUIT:
				save_file(ls);
				return 0;
			default:
				printf ("\t\t指令错误\n");
				break;
		}
		printf ("\t\t按Enter键返回\n");
		getchar();
	}

	return 0;
}


“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值