Linux c 通讯录

编程思路:使用链表编写,使用文件保存数据;

程序流程:

  1. 建立或打开一个通讯录
  2. 进入通讯录界面,在通讯录界面里进行通讯录功能的选择和通讯录的退出

具体过程:

通讯录的创建:

         变量设置:头指针(用于指向链表的头结点)

typedef struct 			//定义头指针
{
	Node *Lptr;		//指向头结点			
	int len;                //链表长度即联系人个数
}Ltop;

                         联系人结构体(用于保存联系人的信息)

typedef struct Node			//定义联系人的结构体
{
	char name[lenthofname];         //保存联系人姓名       
	char number[lenthofnumber];    //保存联系人号码
	cahr addr[lenthofaddr];        //保存联系人地址
	struct Node *next;            //指向下一个联系人
}Node;

        通讯录初始化函数建立:

//通讯录初始化函数
Status Initcontact(Ltop *L)			
{
	Node *p=(Node *)malloc(sizeof(Node));//申请一个头结点
	L->Lptr=p;			//头指针指向头结点
	FILE *file;			//打开通讯录数据文件
	Node buf[1024];
	file=fopen("contact.txt","r");
	if(file==NULL)
	{
		perror("fopen");
		return 1;
	}
	int count=fread(buf,sizeof(Node),1024,file);//把数据读取到缓存区里,count为读到联系人个数
	if(count==EOF)
	{
		perror("fread");
		fclose(file);
		return 3;
	}
	fclose(file);					//关闭文件
	int i;
	for(i=0;i<count;i++)				//由头节点开始建立链表
	{
		p->next=&buf[i];
		p=p->next;
	}
	p->next=NULL;
	L->len=count;					//保存联系人个数
	printf("初始化通讯录成功!\n");
	return OK;
}

 对通讯录的操作:

添加联系人:

//添加联系人
Status Add(Ltop *L,Elemtype *name,Elemtype *number,Elemtype *addr)//传入通讯录的头指针,新建联系人的姓名,号码,地址
{
	Node *p=(Node *)malloc(sizeof(Node));//为新建联系人申请空间
	if(p==NULL)
	{
		printf("添加联系人失败!\n");
		return ERROR;
	}
	int i;
	for(i=0;i<lenthofname;i++)		//清空姓名
	{
		p->name[i]='\0';
	}
	for(i=0;i<lenthofnumber;i++)		//清空号码
	{
		p->number[i]='\0';
	}
	for(i=0;i<lenthofaddr;i++)		//清空地址
	{
		p->addr[i]='\0';
	}
	for(i=0;i<lenthofname&&name[i]!='\0';i++)		//新建联系人的姓名
	{
		p->name[i]=name[i];
	}
	for(i=0;i<lenthofnumber&&number[i]!='\0';i++)		//新建联系人的号码
	{
		p->number[i]=number[i];
	}
	for(i=0;i<lenthofaddr&&addr[i]!='\0';i++)		//新建联系人的地址
	{
		p->addr[i]=addr[i];
	}
	Node *tmp=L->Lptr;
	while(tmp->next!=NULL)				//将tmp指针移到通讯录最后面
	{
		tmp=tmp->next;
	}
	tmp->next=p;					//将新建联系人添加到通讯录最后面
	p->next=NULL;
	L->len++;					//通讯录长度加一
	return OK;	
}

删除联系人 :

//删除联系人
Status Delete(Ltop *L,Elemtype *name)
{
	if(L->len==0)
	{
		printf("当前通讯录为空,删除失败!\n");
		return ERROR;
	}
	Node *tmp=L->Lptr ;						//tmp指向头结点
	while(strcmp(tmp->next->name,name)!=0)
	{	
		tmp=tmp->next;
		if(tmp->next==NULL)
		{
			printf("无该联系人,删除失败!\n");
			return ERROR;
		}
	}				//tmp指向待删除联系人的前一个联系人或头结点
	int i;
	Node *tmp1;
	tmp1=tmp->next;					//tmp1指向待删除联系人
	strcpy(name,tmp1->name);			//获取待删除联系人的姓名
	tmp->next=tmp1->next;				//删除待删除联系人
	//free(tmp1);									
	L->len--;
	printf("已经删除联系人:%s",name);
	return OK;											
}

 根据姓名查找号码:

//根据姓名查找号码
Status Getnumber(Ltop *L,Elemtype *name)
{
	if(L->len==0)
	{
		printf("当前通讯录为空,查找失败!\n");
		return ERROR;
	}
	Node *tmp=L->Lptr ;						//tmp指向头结点
	while(strcmp(tmp->next->name,name)!=0)
	{	
		tmp=tmp->next;
		if(tmp->next==NULL)
		{
			printf("无该联系人,查找失败!\n");
			return ERROR;
		}		
	}			//tmp指向所查找联系人的前一个联系人或头结点
	printf("该联系人号码:%s\n",tmp->next->number);
	return OK;
}

按联系人姓名首字母排序显示联系人 :

//选择排序函数
void swap(Node * a[],int i,int j)
{
	Node * tmp;
	tmp=a[i];
	a[i]=a[j];
	a[j]=tmp;
}
void Selsct_sort(Node * a[],int len)
{
	int i,j,min;
	for(i=1;i<=len-1;i++)
	{
		min=i-1;
		for(j=i;j<len;j++)
		{
			if(strcmp(a[min]->name,a[j]->name)>0)
			{
				min=j;
			}
		}
		if(min!=i-1)
		{
			swap(a,min,i-1);
		}
	}
}
//按联系人姓名首字母排序显示联系人
Status Selsct_sort_linkman(Ltop *L)
{
	if(L->len==0)
	{
		printf("当前通讯录为空!\n");
		return ERROR;
	}
	Node *tmp=L->Lptr->next;				//tmp指向第一个联系人
	Node *  address[MAXSIZE]={NULL};		//定义联系人首地址数组,并初始化
	int i;
	for(i=0;i<L->len&&i<MAXSIZE;i++)		//对联系人首地址数组赋值
	{
		address[i]=tmp;
		tmp=tmp->next;
	}
	Selsct_sort(address,i);					//排序
	printf("联系人个数:%d\n",L->len);		//显示联系人
	for(i=0;i<L->len;i++)					
	{
		printf("\n");
		printf("姓名:");
		puts(address[i]->name);
		printf("号码:");
		puts(address[i]->number);
		printf("地址:");
		puts(address[i]->addr);
	}
	return OK;
}

显示全部联系人:

//显示全部联系人
Status Display(Ltop *L)				//传入通讯录的头指针
{
	printf("联系人个数:%d\n",L->len);
	if(L->len==0)
	{
		printf("当前通讯录为空!\n");
		return ERROR;
	}
	int i;
	Node *tmp=L->Lptr->next ;				//指向第一个联系人
	for(i=1;i<=L->len;i++)
	{
		printf("\n");
		printf("姓名:");
		puts(tmp->name);
		printf("号码:");
		puts(tmp->number);
		printf("地址:");
		puts(tmp->addr);
		tmp=tmp->next;					//指向下一个联系人
	}
	
	return OK;
}

退出通讯录:

Status Exitcontact(Ltop *L)
{
	Node buf[1024];
	Node *tmp=L->Lptr->next;
	int i;
	for(i=0;tmp!=NULL&&i<1024;i++)
	{
		strcpy(buf[i].name,tmp->name);
		strcpy(buf[i].number,tmp->number);
		strcpy(buf[i].addr,tmp->addr);
		tmp=tmp->next;	
	}
	FILE *file;
	file=fopen("contact.txt","w+");
	if(file==NULL)
	{	
		perror("fopen");
		return 1;
	}
	int count=fwrite(buf,sizeof(Node),L->len,file);
	if(EOF==count)
	{
		error("fwrite");
		fclose(file);
		return 2;
	}
	fclose(file);
	return OK;
}

查看源代码

运行结果部分截图

                          

猜你喜欢

转载自blog.csdn.net/li_Xing666/article/details/81081812