用链表和文件编写一个c语言通讯录

用c语言的链表和文件编写一个通讯录,下面是代码


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

//学生节点
struct Address
{
	int id ;
	char name[20] ;
	char number[15];
	char address[20];
	struct Address *next ;
};

typedef struct Address Node ;
typedef struct Address *Link ;


void creat_link(Link *head)
{
	(*head) = (Link)malloc(sizeof(Node));
	(*head)->next = NULL ;
}
//输出提示信息

void myprint()
{
	
	printf ("请输入要选择的编号(0-7)\n");
	printf ("       1--创建通讯录   \n");
	printf ("       2--显示通讯录   \n");
	printf ("       3--修改通讯录   \n");
	printf ("       4--增加通讯录   \n");
	printf ("       5--删除通讯录   \n");
	printf ("       6--查询通讯录   \n");
	printf ("       7--保存到文件   \n");
	printf ("       8--从文件读取   \n");
	printf ("       0--退出通讯录   \n");

	printf ("\n");
}
 //创造通讯录
void creat_address(Link head)
{

	int gg = 1;
	int go  ;
	Link p,nnode ;
	while(gg == 1)
	{


	nnode  = (Link)malloc(sizeof(Node)) ;
	p = head ;
	
	
    	printf("请输入你需要添加的信息\n") ;
    	printf("**********************\n") ;
    	printf("编号 : ") ;
        scanf("%d",&nnode->id) ;
     	printf("姓名 : ") ;
    	scanf("%s",nnode->name) ;
    	printf("电话号码: ") ;
    	scanf("%s",nnode->number) ;
    	printf("地址 : ");
    	scanf("%s",nnode->address) ;
    
    	while(p->next != NULL)
    	{
	    	p = p->next ;
    	}
     	p->next = nnode ;
	    nnode->next = NULL ;
        printf("要结束输出吗?如果结束请输入1,不结束输入0\n") ;
    	scanf("%d",&go) ;
        gg = go ;
     }
}

//显示通讯录
void display_address(Link head)
{
     Link p ;
	 p = head->next ;
	 if(head == NULL)
	 {
		 printf("没有通讯录\n") ;
		 
	 }
	     printf("***编号*************姓名***********电话号码*******地址\n");
	 while(p != NULL)
	 {
		 printf ("*%5d%15s%15s%15s*\n",p->id,p->name,p->number,p->address) ;
		 p = p->next ;
	 }
	     printf("*****************************************************\n") ;
}
//修改通讯录
void modify_address(Link head) 
{
	Link p,q ;
	q = head ;
	p = head->next ;
	char m_name[20] ;
	int a ;
	int m_id ;
	
	printf("1——通过编号修改,2——通过姓名修改") ;
	scanf("%d",&a) ;

	if(a == 1)
	{
		printf("请输入要修改的编号\n") ;
		scanf("%d" ,&m_id);
		while(p != NULL && p->id != m_id)
		{
			q = p ;
			p = p->next ;
		}
        if(p == NULL)
		{
			printf("没有这个编号\n") ;
		}
		else
		{
			printf ("请输入需要改变的数据\n") ;
			printf("编号——将×%d×修改为 : \n",p->id) ;
			scanf("%d",&p->id) ;
			printf("姓名——将×%s×修改为 : \n",p->name) ;
			scanf("%s",p->name) ;
			printf("号码——将×%s×修改为 :\n",p->number) ;
			scanf("%s",p->number) ;
			printf("地址——将×%s×修改为 : \n",p->address) ;
			scanf("%s",p->address) ;
		}

	}
	if(a == 2)
	{
		printf("请输入要修改的名字\n") ;
		scanf("%s",m_name) ;
		while(p != NULL && strcmp(p->name,m_name) != 0)
		{
			q = p ;
			p = p->next ;
		}
		if(p == NULL)
		{
			printf("没有这个名字\n") ;
		}
		else
		{
			printf ("请输入需要改变的数据\n") ;
			printf("编号——将×%d×修改为 : \n",p->id) ;
			scanf("%d",&p->id) ;
			printf("姓名——将×%s×修改为 : \n",p->name) ;
			scanf("%s",p->name) ;
			printf("号码——将×%s×修改为 :\n",p->number) ;
			scanf("%s",p->number) ;
			printf("地址——将×%s×修改为 : \n",p->address) ;
			scanf("%s",p->address) ;
		}
	}
}
//增加通讯录
void add_address(Link head) 
{int gg = 1;
	int go  ;
	Link p,nnode ;
	while(gg == 1)
	{


	nnode  = (Link)malloc(sizeof(Node)) ;
	p = head ;
	
	
    	printf("请输入你需要添加的信息\n") ;
    	printf("**********************\n") ;
    	printf("编号 : ") ;
        scanf("%d",&nnode->id) ;
     	printf("姓名 : ") ;
    	scanf("%s",nnode->name) ;
    	printf("电话号码: ") ;
    	scanf("%s",nnode->number) ;
    	printf("地址 : ");
    	scanf("%s",nnode->address) ;
    
    	while(p->next != NULL)
    	{
	    	p = p->next ;
    	}
     	p->next = nnode ;
	    nnode->next = NULL ;
        printf("要结束输出吗?如果结束请输入1,不结束输入0\n") ;
    	scanf("%d",&go) ;
        gg = go ;
     }
}
// 删除功能实现

void delete_address(Link head)
{
	Link q,p ;
	q = head ;
	p = head->next ;
	int a ;
	char d_name[20] ;
    int d_id ;

	printf("1——根据编号删除,2——根据姓名删除") ;
	scanf("%d",&a) ;
	if(a == 1) 
	{
		printf("请输入要删除的编号\n") ;
		scanf("%d",&d_id) ;
		while(p != NULL && p->id != d_id)
		{
			q = p ;
			p = p->next ;
		}
		if(p == NULL) 
		{
			printf("没有这个编号\n") ;
		}
		else
		{
			q->next = p->next ;
			free(p) ;
		}
		printf("删除了\n") ;

	}
	if(a == 2)
	{
		printf("请输入要删除的名字\n") ;
		scanf("%s",d_name) ;
		while(p != NULL && strcmp(p->name,d_name) != 0) 
		{
			q = p ;
			p = p->next ;
		}
		if(p == NULL)
		{
			printf("没有这个姓名\n") ;
		}
		else
		{
			q->next = p->next ;
			free(p) ;
		}
		printf("删除了\n") ;

	}

}

//查询功能

void inquire_address(Link head)
{
    Link p,q ;
	q = head ;
	p = head->next ;
	char i_name[20] ;
	int a ;
	int i_id ;
	
	printf("1——通过编号查询,2——通过姓名查询") ;
	scanf("%d",&a) ;

	if(a == 1)
	{
		printf("请输入要查询的编号\n") ;
		scanf("%d" ,&i_id);
		while(p != NULL && p->id != i_id)
		{
			q = p ;
			p = p->next ;
		}
        if(p == NULL)
		{
			printf("没有这个编号\n") ;
		}
		else
		{
			printf("***编号*************姓名***********电话号码*******地址\n");
	        printf ("*%5d%15s%15s%15s*\n",p->id,p->name,p->number,p->address) ;
			printf("*****************************************************\n") ;
	    }
	}
	if(a == 2)
	{
		printf("请输入要修改的名字\n") ;
		scanf("%s",i_name) ;
		while(p != NULL && strcmp(p->name,i_name) != 0)
		{
			q = p ;
			p = p->next ;
		}
		if(p == NULL)
		{
			printf("没有这个名字\n") ;
		}
		else
		{
			printf("***编号*************姓名***********电话号码*******地址\n");
	        printf ("*%5d%15s%15s%15s*\n",p->id,p->name,p->number,p->address) ;
		    printf("*****************************************************\n") ;
		}
	}
}
//保存到文件中

void save_address(Link head) 
{
	FILE *fp;
	fp = fopen("通讯录.txt","wb+") ;
	if(NULL == fp)
	{
		printf("没有这个文件\n") ;
		return ;
	}
	Link p ;
	p = head->next ;
	while(p != NULL)
	{
		fwrite(p,sizeof(Node)-4,1,fp) ;
		fputc('\n',fp) ;
		p = p->next;
	}
	printf("保存了\n") ;
	fclose(fp) ;
}
 //从文件中读取
void read_address(Link head) 
{
	FILE *fp ;
	fp = fopen("通讯录.txt","r+") ;
	if(NULL == fp)
	{
       printf("没有这个文件\n") ;
	   return ;
	}
	Link p,nnode ;
	p = (Link)malloc(sizeof(Node)) ;
	while((fread(p,sizeof(Node)-3,1,fp)) != 0)
	{
		while(p->next != NULL)
		{
			p = p->next ;
		}
		nnode = (Link)malloc(sizeof(Node)) ;
		p->next = nnode ;
		nnode->next = NULL ;
	}
}
int main()
{
	int x ;
	Link head ;
	creat_link(&head) ;
	while(1)
	{
		
    	myprint();
        printf("请输入数字——");
     	scanf("%d",&x) ;
     	switch(x)
    	{
	     	case 1 :
				printf("********************\n") ;
		    	printf("****通讯录的创建****\n") ;
		    	printf("********************\n") ;
		    	creat_address(head) ;
		        break;
            case 2 :
				printf("××××××××××××××××××××\n") ;
				printf("××××通讯录的显示××××\n") ;
				printf("××××××××××××××××××××\n") ;
				display_address(head) ;
			    break ;
		    case 3 :
				printf("********************\n") ;
				printf("****通讯录的修改****\n") ;
				printf("********************\n") ;
				modify_address(head) ;
				break ;
			case 4 :
                printf("********************\n") ;
				printf("****通讯录的增加****\n") ;
				printf("********************\n") ;
				add_address(head) ;
				break ;

			case 5 :
				printf("********************\n") ;
				printf("****通讯录的删除****\n") ;
				printf("********************\n") ;
				delete_address(head) ;
				break ;
			case 6 :
				printf("********************\n") ;
				printf("****通讯录的查询****\n") ;
				printf("********************\n") ;
				inquire_address(head) ;
				break ;
			case 7 :
			    printf("********************\n") ;
				printf("****保存到文件中****\n") ;
				printf("********************\n") ;
				save_address(head) ;
				break ;
			case 8 :
	            printf("********************\n") ;
			    printf("****从文件中读取****\n") ;
				printf("********************\n") ;
				read_address(head) ;
				break ;
			case 0 :
				return 0 ;
			default :
				printf("输入错误\n") ;
			    break;
    	}
	}
	save_address(head) ;
}	

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值