通讯录2.0(文件存储)

这是一个实现了通讯录管理功能的C语言程序,包括读取、保存、插入、删除和查找联系人信息。程序使用链表存储数据,并通过`address_list.h`头文件定义数据结构和函数原型。`function.c`文件包含了具体的功能实现,如创建节点、插入数据、按序号和姓名查找等。`main.c`文件是主程序,提供用户交互界面。程序能够从文件`address.txt`中读取数据并保存数据。
摘要由CSDN通过智能技术生成

三个文件 :address_list.h  function.c  main.c

核心文件存储:

//读数据
int readfiledata(ADDRESS *address)
{
    int fd;
    int bytes_read;
    NODE node;
    ADDRESS new_node = NULL;
    
    if(CREATE_NO == create_address_list(address))  //创建通讯录
    {
        return READ_NO;
    }

    if((fd = open("address.txt", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) == -1)
    {
	perror("open file error!");
	return READ_NO;
    }
    
    while(bytes_read = read(fd,&node,sizeof(node)))
    {
	if(bytes_read == -1)
	{
	    perror("read error!");
	    return READ_NO;
	}
	else if(bytes_read < sizeof(node))
	{
	    continue;
	}
	else if(bytes_read == sizeof(node))
	{
	    if(CREATE_OK == create_node(&new_node))  //创建节点
	    {  
		new_node->num = node.num;
                strcpy(new_node->name, node.name);
                strcpy(new_node->sex, node.sex);
                strcpy(new_node->number, node.number);

                insert_mid_front(*address, new_node);  //节点前插入
	    }
	    else
	    {
		return READ_NO;
	    }
	}
    }

    close(fd);
    return READ_OK;
}

void save_data(ADDRESS address)  //保存数据
{
    int fd;
    int bytes_write;
    NODE *ptr;
    NODE node;
    ADDRESS p = NULL;
    p = address->next;

    if((fd = open("address.txt", O_RDWR)) == -1)
    {
	perror("open error!");
    }

    while(p != NULL)
    {
	node.num = p->num;
	strcpy(node.name, p->name);
	strcpy(node.sex, p->sex);
	strcpy(node.number, p->number);
        
	ptr = &node;
      	while(bytes_write = write(fd, ptr, sizeof(node)))
	{
	    if(bytes_write == -1)
	    {
		perror("write error!");
		break;
	    }
	    else if(bytes_write == sizeof(node))
	    {
		break;
	    }
	    else if(bytes_write < sizeof(node))
	    {
		ptr -= bytes_write;
	    }
        
	}
        if(bytes_write == -1)
	{
	    break;
	}
	p = p->next;
    }
    if(NULL == p)
    {
	printf("    ");
        printf("保存成功!\n");
    }


    close(fd);
}

address_list.h

#ifndef _ADDRESS_LIST_H_
#define _ADDRESS_LIST_H_

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>

#define NAME_SIZE 10
#define SEX_SIZE 6
#define NUM_SIZE 11

enum return_val{
    CREATE_OK = 100,
    CREATE_NO,
    MALLOC_OK,
    MALLOC_NO,
    DELETE_OK,
    DELETE_NO,
    READ_NO,
    READ_OK,
};

typedef struct address_node
{
    int num;
    char name[NAME_SIZE];
    char sex[SEX_SIZE];
    char number[NUM_SIZE];

    struct address_node *next;
}*ADDRESS;

typedef struct node_data
{
    int num;
    char name[NAME_SIZE];
    char sex[SEX_SIZE];
    char number[NUM_SIZE];
}NODE;


extern void welcome();   //欢迎界面

extern void interface();  //目录

extern int is_malloc_ok(ADDRESS address);  //内存分配

extern int create_node(ADDRESS *address);  //创建节点

extern int create_address_list(ADDRESS *address);  //创建通讯录

extern void insert_mid_front(ADDRESS address, ADDRESS new_node);  //节点前插入

extern ADDRESS seek_node_num(ADDRESS address, int num);  //按序号查找

//按姓名查找
extern ADDRESS seek_node_name(ADDRESS address, char *name);

//按姓名删除
extern int delete_node(ADDRESS address, char name[]);

extern void select_function(int *select);  //选择功能

//遍历链表
extern void display_data(ADDRESS address);

extern void make_empty(ADDRESS address);  //清空数据

extern void exit_address_list(ADDRESS *address);  //退出通讯录

//单个输入
extern void insert_one(ADDRESS address);

//多个输入
extern void insert_more(ADDRESS address);

extern void insert_infro(ADDRESS address);   //输入数据

extern void seek_data(ADDRESS address);   //查找数据

extern void delete_data(ADDRESS address);  //删除数据

extern void save_data(ADDRESS address);  //保存数据


extern int readfiledata(ADDRESS *address);

#endif

function.c

#include "address_list.h"




void welcome()   //欢迎界面
{
    printf("    ");
    printf("*******************************************************");
    printf("\n\n");

    printf("                       Welcome you!");
    printf("\n\n");

    printf("    ");
    printf("*******************************************************");
    printf("\n\n");
}
    
//通讯录界面
void interface()
{
    printf("    ");
    printf("*******************************************************");
    printf("\n\n");
    
    printf("    ");
    printf("*************************目录**************************");
    printf("\n\n");
    
    printf("    ");
    printf("******************* 1、输入数据 ***********************");
    printf("\n\n");

    printf("    ");
    printf("******************* 2、显示数据 ***********************");
    printf("\n\n");

    printf("    ");
    printf("******************* 3、查找数据 ***********************");
    printf("\n\n");

    printf("    ");
    printf("******************* 4、删除数据 ***********************");
    printf("\n\n");

    printf("    ");
    printf("******************* 5、清空数据 ***********************");
    printf("\n\n");
    
    printf("    ");
    printf("******************* 6、保存数据 ***********************");
    printf("\n\n");

    printf("    ");
    printf("****************** 7、退出通讯录 **********************");
    printf("\n\n");

    printf("    ");
    printf("*******************************************************");
    printf("\n\n");
}

/*********但链表**********/

int is_malloc_ok(ADDRESS address)  //内存分配
{
    if(NULL == address)
    {
        return MALLOC_NO;
    }
    return MALLOC_OK;
}

int create_node(ADDRESS *address)  //创建节点
{
    *address = (ADDRESS)malloc(sizeof(struct address_node));
    if(MALLOC_OK == is_malloc_ok(*address))
    {
        return CREATE_OK;
    }
    return CREATE_NO;
}

int create_address_list(ADDRESS *address)  //创建通讯录
{
    if(CREATE_OK == create_node(address)) 
    {
	(*address)->next = NULL;
	return CREATE_OK;
    }   
    return CREATE_NO;
}

void insert_mid_front(ADDRESS address, ADDRESS new_node)  //节点前插入
{
    ADDRESS p = NULL;
    ADDRESS q = NULL;
    q = address;
    p = address->next;

    while((p != NULL) && (p->num < new_node->num))
    {
	q = p;
	p = p->next;
    }
    
        new_node->next = p;
	q->next = new_node;
}

//按序号查找
ADDRESS seek_node_num(ADDRESS address, int num)
{
    ADDRESS p = NULL;
    p = address->next;

    while(NULL != p)
    {
        if(num == p->num)
	{
            return p;
	}
	p = p->next;
    }
    return NULL;
}

//按姓名查找
ADDRESS seek_node_name(ADDRESS address, char *name)
{
    
    ADDRESS p = NULL;
    p = address->next;

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

//按姓名删除
int delete_node(ADDRESS address, char name[])
{
    ADDRESS p = NULL;
    ADDRESS q = NULL;
    q = address;
    p = address->next;
    
    while((NULL != p) &&(0 != strcmp(name, p->name)))
    {
       q = p;
       p = p->next;
    }

    if(NULL == p)
    {
	return DELETE_NO;
    }
    else
    {
        q->next = p->next;
	free(p);
	return DELETE_OK;
    }

}

/********通讯录功能**********/

//遍历链表
void display_data(ADDRESS address)
{
    ADDRESS p = NULL;
    p = address->next;
    
    system("clear");
    interface();

    if(NULL == address)
    {
	printf("    ");
	printf("通讯录不存在!\n");
	return ;
    }

    if(NULL == p)
    {
	printf("    ");
        printf("通讯录为空!\n");
	return ;
    }

    while(NULL != p)
    {
	printf("    ");
	printf("序号:%2d", p->num);
	printf("  ");
	printf("姓名:%8s", p->name);
	printf("  ");
	printf("性别:%4s", p->sex);
	printf("  ");
	printf("电话:%15s", p->number);
	printf("\n");

	p = p->next;
    }
}	
	 
void make_empty(ADDRESS address)  //清空数据
{
    ADDRESS p = NULL;
    p = address->next;
    
    system("clear");
    interface();

    while(NULL != p)
    {
	address->next = p->next;
	free(p);
	p = p->next;
    }
    
    printf("    ");
    printf("数据清空成功!\n");
}

void exit_address_list(ADDRESS *address)  //退出通讯录
{
    
    make_empty(*address);  //清空数据
    free(*address);
    *address = NULL;
    
    printf("    ");
    printf("退出成功!\n");
}

void select_function(int *select)  //选择功能
{
    printf("\n\n    ");
    printf("请选择您的功能:\n");
    printf("    ");
    scanf("%d", select);
}

//单个输入
void insert_one(ADDRESS address)
{
    ADDRESS new_node = NULL;
    
    system("clear");
    interface();

    printf("    ");
    printf("请输入成员信息!\n\n");

    if(CREATE_OK == create_node(&new_node))
    {
	printf("    ");
        printf("请输入序号(如12):");
	scanf("%d", &(new_node->num));

	printf("\n    ");
	printf("请输入姓名(如张三):");
	scanf("%s", new_node->name);
	
	printf("\n    ");
	printf("请输入性别(如男):");
	scanf("%s", new_node->sex);
	
	printf("\n    ");
	printf("请输入电话(如 1234567891):");
	scanf("%s", new_node->number);
        
        insert_mid_front(address, new_node);  //节点前插入
    }
    else
    {
	printf("输入信息失败!\n");
	return ;
    }
}

//多个输入
void insert_more(ADDRESS address)
{
    ADDRESS new_node = NULL;
    int num;
    int i;
    
    system("clear");
    interface();

    printf("    ");
    printf("请输入成员个数:");
    scanf("%d", &num);
    
    for(i = 0; i < num; i++)
    {
        if(CREATE_OK == create_node(&new_node))
        {
	    printf("    ");
            printf("请输入序号(如12):");
	    scanf("%d", &(new_node->num));

	    printf("\n    ");
	    printf("请输入姓名(如张三):");
	    scanf("%s", new_node->name);
	
	    printf("\n    ");
	    printf("请输入性别(如男):");
	    scanf("%s", new_node->sex);
	
	    printf("\n    ");
	    printf("请输入电话(如 1234567891):");
 	    scanf("%s", new_node->number);
        
            insert_mid_front(address, new_node);  //节点前插入
        }
        else
        {
	    printf("输入信息失败!\n");
	    return ;
        }

        system("clear");
        interface();
    }

    
}

void insert_infro(ADDRESS address)   //输入数据
{
    int i;
    
    system("clear");
    interface();

    printf("    ");
    printf("请选择输入方式:\n");

    printf("    ");
    printf("1、单项输入\n");
    printf("    ");
    printf("2、多项输入\n");
    printf("    ");
    printf("输入:");
    scanf("%d", &i);

    if(1 == i)
    {
	insert_one(address);
    }
    
    if(2 == i)
    {
	insert_more(address);
    }


}

void seek_data(ADDRESS address)   //查找数据
{
    ADDRESS p = NULL;
    int i;
    int num;
    char name[NAME_SIZE];
    
    system("clear");
    interface();

    printf("    ");
    printf("请选择查找方式:\n");

    printf("    ");
    printf("1、序号查找\n");
    printf("    ");
    printf("2、姓名查找\n");
    printf("    ");
    printf("输入:");
    scanf("%d", &i);

    if(1 == i)
    {   
	printf("    ");
	printf("请输入查找的序号:");
	scanf("%d", &num);
	p = seek_node_num(address, num);

	printf("    ");
	printf("序号:%2d", p->num);
	printf("  ");
	printf("姓名:%8s", p->name);
	printf("  ");
	printf("性别:%4s", p->sex);
	printf("  ");
	printf("电话:%15s", p->number);
	printf("\n");
    }
    
    if(2 == i)
    {
	printf("    ");
	printf("请输入查找的姓名:");
	scanf("%s", name);
	p = seek_node_name(address, name);

	printf("    ");
	printf("序号:%2d", p->num);
	printf("  ");
	printf("姓名:%8s", p->name);
	printf("  ");
	printf("性别:%4s", p->sex);
	printf("  ");
	printf("电话:%15s", p->number);
	printf("\n");
    }

}

void delete_data(ADDRESS address)  //删除数据
{
    char name[NAME_SIZE];
    
    system("clear");
    interface();

    printf("    ");
    printf("请输入删除的姓名:");
    scanf("%s", name);

    if(DELETE_OK == delete_node(address, name))
    {
	printf("    ");
	printf("删除成功!\n");
    }
    else
    {
	printf("    ");
	printf("删除失败!\n");
    }
}

//读数据
int readfiledata(ADDRESS *address)
{
    int fd;
    int bytes_read;
    NODE node;
    ADDRESS new_node = NULL;
    
    if(CREATE_NO == create_address_list(address))  //创建通讯录
    {
        return READ_NO;
    }

    if((fd = open("address.txt", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) == -1)
    {
	perror("open file error!");
	return READ_NO;
    }
    
    while(bytes_read = read(fd,&node,sizeof(node)))
    {
	if(bytes_read == -1)
	{
	    perror("read error!");
	    return READ_NO;
	}
	else if(bytes_read < sizeof(node))
	{
	    continue;
	}
	else if(bytes_read == sizeof(node))
	{
	    if(CREATE_OK == create_node(&new_node))  //创建节点
	    {  
		new_node->num = node.num;
                strcpy(new_node->name, node.name);
                strcpy(new_node->sex, node.sex);
                strcpy(new_node->number, node.number);

                insert_mid_front(*address, new_node);  //节点前插入
	    }
	    else
	    {
		return READ_NO;
	    }
	}
    }

    close(fd);
    return READ_OK;
}

void save_data(ADDRESS address)  //保存数据
{
    int fd;
    int bytes_write;
    NODE *ptr;
    NODE node;
    ADDRESS p = NULL;
    p = address->next;

    if((fd = open("address.txt", O_RDWR)) == -1)
    {
	perror("open error!");
    }

    while(p != NULL)
    {
	node.num = p->num;
	strcpy(node.name, p->name);
	strcpy(node.sex, p->sex);
	strcpy(node.number, p->number);
        
	ptr = &node;
      	while(bytes_write = write(fd, ptr, sizeof(node)))
	{
	    if(bytes_write == -1)
	    {
		perror("write error!");
		break;
	    }
	    else if(bytes_write == sizeof(node))
	    {
		break;
	    }
	    else if(bytes_write < sizeof(node))
	    {
		ptr -= bytes_write;
	    }
        
	}
        if(bytes_write == -1)
	{
	    break;
	}
	p = p->next;
    }
    if(NULL == p)
    {
	printf("    ");
        printf("保存成功!\n");
    }


    close(fd);
}

main.c

#include "address_list.h"

int main(int argc, char *argv[])
{
    int select;
    ADDRESS address = NULL;

    system("clear");
    welcome();
    sleep(1);
    
    system("clear");
    interface();

    if(READ_NO == readfiledata(&address))
    {
	return 0;
    }

    /*if(CREATE_NO == create_address_list(&address))  //创建通讯录
    {
        return 0;
    }*/

    while(1)
    {
	select_function(&select);

        switch(select)
	{
	    case 1:
	    insert_infro(address);   //输入数据
	    break;

	    case 2:
            display_data(address);  //显示数据
	    break;

	    case 3:
	    seek_data(address);   //查找数据
	    break;

	    case 4:
	    delete_data(address);  //删除数据
	    break;

	    case 5:
	    make_empty(address);  //清空数据
	    break;
	    
	    case 6:
	    save_data(address);  //保存数据
	    break;

	    case 7:
	    exit_address_list(&address);  //退出通讯录
	    break;

	    default :
	    printf("您输入错误!请重新输入!\n");
	    break;
	}

	if(7 == select)
	{
	    goto key;
	}
    }

    key:    

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值