C语言通讯录文件保存

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>

#define MALLOC_OK 1
#define MALLOC_NO 0
#define CREATE_OK 1
#define CREATE_NO 0

struct node
{ 
    int num;
	char name[20];
	char sex[5];
	char phone[20];

	struct node *next;
	
};


typedef struct node Node;

typedef Node * Hlink;


int is_malloc_ok(Hlink new_node)
{
    if(NULL == new_node)
	{
		printf("malloc error!\n");
		return MALLOC_NO;
	}

	return MALLOC_OK;
}

void read_file(Hlink head)
{
    int fp;
    int ret;
   
    //打开文件  调用open函数
    fp = open("textbook", O_RDWR | O_CREAT, 0644);
  
    if( fp < 0)
    {
        perror("open error!\n");
        exit(1);
    }
   
    while(1)
    {
        Hlink new_node = (Hlink)malloc(sizeof(Node));

        ret = read(fp,new_node,sizeof(Node));

        if(ret == 0)
        {
            break;
        }    

        if(ret = -2)
        {
            perror("error");
        }

        new_node->next = head->next;
        head->next = new_node;
    }
    

    close(fp);


}

int  create_node(Hlink *new_node)    //通讯录节点建立
{
	*new_node = (Hlink)malloc(sizeof(Node));

	if(MALLOC_OK == is_malloc_ok(*new_node))
	{
		return CREATE_OK;
	}

	return CREATE_NO;

}

void create_link(Hlink *head)   //通讯录链表建立
{	
	create_node(head);	
	(*head) -> next = NULL;	
}

void address_save(Hlink head)
{   
    int fd;
    Hlink p = NULL;
    p = head->next;

   //打开文件  调用open函数
   fd = open("textbook", O_RDWR | O_CREAT, 0644);

   if( fd < 0)
   {
       perror("open error!\n");
       exit(1);
   }

   if(p == NULL)
   {	
	   truncate("textbook",0);   //
       printf("通讯录空空如也!\n");
   } 

   while(p != NULL)
   {     
       write(fd, p ,sizeof(Node));  
          
       p = p->next;
   }

   printf("保存成功!\n");

   
   close(fd);


}

void address_read(Hlink head)
{
    int fp;
    int ret;
   
    //打开文件  调用open函数
    fp = open("textbook", O_RDWR | O_CREAT, 0644);
  
    if( fp < 0)
    {
        perror("open error!\n");
        exit(1);
    }
   
    while(1)
    {
        Hlink new_node = (Hlink)malloc(sizeof(Node));

        ret = read(fp,new_node,sizeof(Node));

        if(ret == 0)
        {
            break;
        }    

        if(ret = -2)
        {
            perror("error");
        }

        new_node->next = head->next;
        head->next = new_node;
    }
    

    close(fp);


}

void display_link(Hlink head)   //输出全部通讯录
{

	Hlink p = NULL;
	p  = head -> next;
		
	if(head -> next == NULL)
	{
		printf("通讯录为空!\n");
	}
	while(p != NULL)	
	{
		printf("编号:%d\n姓名:%s\n性别:%s\n电话:%s\n",
				p -> num,p -> name,p -> sex,p -> phone);

		p = p->next;
	}
	
}


void insert_node_tail(Hlink head,Hlink new_node)
{
	Hlink p = NULL;
	p = head;
	
	while(p -> next != NULL)
	{
		p = p -> next;
	}

	p -> next = new_node;
	new_node -> next = NULL;
	
}


void insert_node_location(Hlink head,Hlink new_node,int loc) //选择位置插入
{
	int count = 1;
	Hlink p = NULL;
	Hlink q = NULL;

	q = head;
	p = head -> next;

	while( p != NULL && count != loc)    //没找到这个数就放在末尾,找到了就放在这个数的前面
	{
		q = p;
		p = p->next;
		count++;
	}

    q->next = new_node;
    new_node->next = p;	
}


void clear_link(Hlink head)   //通讯录全部删除
{
	Hlink p = NULL;
	p = head -> next;

	if(p == NULL)
	{
		printf("通讯录是空的!\n");
		return;
	}
	else
	{
		while(p != NULL)
		{
			head -> next = p -> next;
			free(p);
			p = head -> next;
		}
	
		printf("通讯录已经全部删除!\n");
	}
}


int delete_node(Hlink head,char ch[])   //删除联系人
{
	Hlink p = NULL,q = NULL;

	q = head;
	p = head -> next;

	
	while(p != NULL && strcmp(p -> name,ch) != 0)   //p是要删除的节点
	{
		q = p;
		p = p -> next;
	}

    if(p == NULL)
	{
		printf("no find!\n");
	}
	else
	{
		printf("编号:%d\n姓名:%s\n性别:%s\n电话:%s\n",
				p -> num,p -> name,p -> sex,p -> phone);
			
		q -> next = p -> next;
		free(p);
		printf("联系人已删除!\n");
	}
	
	
}

int seek_link(Hlink head,char ch[])  //查找联系人
{
	Hlink p = NULL;
	p = head -> next;

	while(p != NULL && strcmp(p -> name,ch) != 0)
	{
		p = p -> next;		
	}

	if(p == NULL)
	{
		printf("没有这个联系人!\n");
		return 0;
	}
	else
	{	
		printf("编号:%d\n姓名:%s\n性别:%s\n电话:%s\n",
				p -> num,p -> name,p -> sex,p -> phone);
		return 1;
	}
}


int length_link(Hlink head)  //输出联系人总数
{
	int len = 0;
	Hlink p = NULL;
	p = head -> next;

	while(p != NULL)
	{
		len++;
		p = p -> next;
	}

	return len;
}


void menu()
{
	printf("***************************************************************************\n");
	printf("*******************************通讯录管理界面******************************\n");
	printf("===========================================================================\n");
	printf("*               1.创建通讯录                    2.插入联系人              *\n");
	printf("*               3.查询联系人                    4.删除联系人              *\n");
	printf("*               5.显示联系人                    6.查看联系人数量          *\n");
	printf("*               7.删除所有联系人                8.保存所有联系人          *\n");
	printf("*               0.退出管理界面                                            *\n");
	printf("*                                   选择0-8                               *\n");
	printf("===========================================================================\n");
	printf("***************************************************************************\n");
}


int main()
{
	Hlink head = NULL;
	Hlink new_node = NULL;
	Hlink p = NULL;

	int i,m;
	int loc;
	int choose;
    char ch[20];

	int num;
	char name[20];
	char sex[10];
	char phone[20];

	create_link(&head);
	address_read(head);

	menu();
	while(1)
	{
		printf("请输入你的选项:");
		scanf("%d",&choose);

		switch(choose)
		{
			case 1:
			{
				printf("输入通讯录人数:");
				scanf("%d",&m);
		
				for(i = 0;i < m;i++)
				{
					create_node(&new_node);
					insert_node_tail(head,new_node);
					p = new_node;			

					printf("输入第%d位编号:",i + 1);
					scanf("%d",&num);
					p -> num = num;
					getchar();
	
					printf("输入姓名:");
					gets(name);
					strcpy(p->name,name);
		
					printf("输入性别:");
					gets(sex);	
					strcpy(p->sex,sex);
				
					printf("输入电话:");
				//	scanf("%s",p -> phone);
					gets(phone);
					strcpy(p->phone,phone);
					
					printf("\n");
				}
				break;
			}

			case 2:
			{
				create_node(&new_node);
				p = new_node;
			
				printf("输入要插入的位置:");
				scanf("%d",&loc);
				
				printf("输入插入人员的编号:");
				scanf("%d",&p -> num);
				
				printf("输入姓名:");
				scanf("%s",p -> name);
				
				printf("输入性别:");
				scanf("%s",p -> sex);
			
				printf("输入电话:");
				scanf("%s",p -> phone);
		
				insert_node_location(head,new_node,loc);
				
				printf("\n");
				break;
			}
		
			case 3:
			{		
				printf("输入查询的姓名:");
				scanf("%s",ch);
		
				printf("查询到的信息为:\n");		
				seek_link(head,ch);
				printf("\n");
	
				break;
			}

			case 4:
			{	
				printf("输入删除联系人姓名:");
				scanf("%s",ch);
		
				printf("删除的信息为:\n");		
				delete_node(head,ch);
				printf("\n");
		
				break;
			}
		

			case 5:
			{	
				printf("显示所有联系人:\n");		
				display_link(head);
			
				printf("\n");
				break;
			}
		

			case 6:
			{
				printf("联系人的总数是:");
				int len=length_link(head);
				printf("%d",len);
			
				printf("\n");
				break;
			}

			case 7:
			{
				clear_link(head);
	
				printf("\n");
				break;
			}
			
			case 8:
			{
				address_save(head);
				printf("\n");
				break;
			}
			case 0:
			{
				printf("系统已退出!\n");
				exit(0);
				break;
			}

			default:
			{
				printf("输入有误,请重新输入!\n");
				break;		
			}
		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值