Linux_C练习:单向链表实现通讯录

#ifndef _ADDRESSLIST_H_
#define _ADDRESSLIST_H_

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
enum
{
	SUCCESS = 10000,
	FAILURE,
	TRUE,
	FALSE,
};

struct addresslist
{
    int  num;
	char *name;
	char *address;
	char *phonenum;
	char *callnum;
	struct addresslist *next;
};
typedef struct addresslist AL;

int InitAl(AL **l);
int InsertAl(AL *l, int index);
int Menue();
int QueryMenue();
int Welcome();
int DeleteAl(AL *l, int *index);
int ModifyAl(AL *l);
int ShowAl(AL *l);

#endif

#include"AddressList.h"

int InitAl(AL **l)
{
	if(NULL == *l)
	{
		return FAILURE;
	}
	
	(*l) -> next = NULL;
	return SUCCESS;
}

int Welcome()
{
	printf("\t\t\t**************************\n");
	printf("\t\t\t**************************\n");
	printf("\t\t\t****欢迎进入***通讯录*****\n");
	printf("\t\t\t**************************\n");
	printf("\t\t\t**************************\n");
	sleep(2);
	return 0;
}

int Menue()
{
	int choice;
	printf("\t\t\t1、添加成员        2、删除成员\n");
	printf("\t\t\t3、查询成员        4、修改信息\n");
	printf("\t\t\t5、显示所有        6、退出系统\n");
	scanf("%d", &choice);
	return choice;
}

//确认是否有重名
int CheckName(AL *l, char *name, int *count)
{
	if(NULL == l)
	{
		printf("没有初始化,NULL错误\n");
		exit(1);
	}
    if(NULL == l -> next)
	{
		return FALSE;
	}
	*count = 0;
	AL *p = l -> next;
	while(NULL != p)
	{
		if(strcmp(p -> name, name) == 0)
		{
			(*count) ++;
		}
		p = p -> next;
	}
	if(*count != 0)
	{
		return TRUE;
	}
	return FALSE;
}

//确认地址是否与之前相同
int CheckAddress(AL *l, char *address)
{
	if(NULL == l)
	{
		printf("没有初始化,NULL错误\n");
		exit(1);
	}
	AL *p = l -> next;
	while(p)
	{
		if(strcmp(p -> address, address) == 0)
		{
			printf("已经存在该地址\n");
			return TRUE;
		}
		p = p -> next;
	}
	return FALSE;
}

//确认是否有重座机号码,座机号码是否为7位号码
int CheckCallnum(AL *l, char *callnum)
{
	int length;
	if(NULL == l)
	{
		printf("没有初始化,NULL错误\n");
		exit(1);
	}
	AL *p = l -> next;
	while(p)
	{
		if(strcmp(p -> callnum, callnum) == 0)
		{
			printf("已经存在该号码了\n");
			return TRUE; 
		}
		p = p -> next;
	}
	length = strlen(callnum);
	if(8 != length)
	{
		printf("输入的号码不是8位\n");
		return TRUE;
	} 
	while(*callnum != '\0')
	{
		if(*callnum < '0' || *callnum > '9')
		{
			printf("电话为请输  入0-9的数字\n");
			return TRUE;
		}
		callnum ++;
	}
	return FALSE;
}
//确认输入的是否与之前的手机号码重复,是否为11位,是否为13, 14, 15, 17, 18

int CheckPhonenum(AL *l, char *phonenum)
{
	int length;
	if(NULL == l)
	{
		printf("没有初始化,NULL错误\n");
		exit(1);
	}
	AL *p = l -> next;
	while(p)
	{
		if(strcmp(p -> phonenum, phonenum) == 0)
		{
			printf("已经存在这个手机号码了\n");
			return TRUE;
		}
		p = p -> next;
	}
	length = strlen(phonenum);
	if(11 != length)
	{
		printf("手机号为11位数字\n");
		return TRUE; 
	}
	if(*phonenum++ != '1')
	{
		printf("第一位为1\n");
		return TRUE; 
	}
	else if(*phonenum != '3' && *phonenum != '4' && *phonenum != '5' && *phonenum != '7' && *phonenum != '8')
	{
		printf("第二位数应为3,4,5,7,8\n");
		return TRUE;
	}
	while(*(++phonenum) != '\0')
	{
		if(*phonenum >= '0' && *phonenum <= '9')
		{
			
		}
		else
		{
			printf("输入的数应为0-9\n");
			return TRUE;
		}
	}
	return FALSE;
}


/*
插入新成员信息
*/
int InsertAl(AL *l, int index)
{
	AL *p = l;
	AL *q = l;
	int flag, ret;
	
	AL *l1 = (AL *)malloc(sizeof(AL));//创建空间存放用户信息
	l1 -> name = (char *)malloc(sizeof(char) * 20);
	l1 -> callnum = (char *)malloc(sizeof(char) * 8);
	l1 -> phonenum = (char *)malloc(sizeof(char) * 11);
	l1 -> address = (char *)malloc(sizeof(char) * 50);
		

	if(NULL == l1 -> name || NULL == l1 -> callnum || NULL == l1 -> phonenum 
		|| NULL == l1 -> address || NULL == l1)
	{
		printf("NULL ERROR\n");
		exit(1);
	}
	
	while(p -> next)
	{
		p = p ->  next;//将链表指针移向最后
	}
/*
输入姓名,如果与之前姓名重复则重新输入
*/
	printf("请输入姓名\n");
	scanf("%s", l1 -> name);
	if(20 < strlen(l1 -> name))
	{
		printf("too long\n");
		return FALSE;
	}
	//ret = CheckName(q, l1 -> name)//
/*
输入电话号码,如果输入的电话与之前相同则重新输入8位
*/	

	printf("请输入8为座机号码\n");
	scanf("%s", l1 -> callnum);
	getchar();
	ret = CheckCallnum(q, l1 -> callnum);
	if(TRUE == ret)
	{
		flag = 1;
		while(1 == flag)
		{
			memset(l1 -> callnum, 0, 8);
			printf("请输入正确的号码\n");
			scanf("%s", l1 -> callnum);
			ret = CheckCallnum(q, l1 -> callnum);
			if(FALSE == ret)
			{
				flag = 0;
			}
		}
	}
/*
输入手机号码,如果输入与之前相同则要求重新输入,且为11位;开头为13,14,15,17,18
*/	

	printf("请输入11位的手机号\n");
	scanf("%s", l1 -> phonenum);
	ret = CheckPhonenum(q, l1 -> phonenum);
	if(TRUE == ret)
	{
		flag = 1;
		while(1 == flag)
		{
			memset(l1 -> phonenum, 0, 11);
			printf("请输入正确的号码\n");
			scanf("%s", l1 -> phonenum);
			ret = CheckPhonenum(q, l1 -> phonenum);
			if(FALSE == ret)
			{
				flag = 0;
			}
		}
	}
/*
输入地址
*/

	printf("请输入地址\n");
	scanf("%s", l1 -> address);
	if(strlen(l1 -> address) > 50)
	{
		printf("too long");
		return FALSE;
	}

/*
编号自动配置
*/	
	AL *tmp = q;
	l1 -> num = index + 201800; 
	
	if(q -> next == NULL)
	{
		q -> next = l1;
		l1 -> next = NULL;
		return SUCCESS;
	}
	else
	{
		q = q -> next;
		
		if(strcmp(q -> name, l1 -> name) >= 0)
		{
			tmp -> next = l1;
			l1 -> next = q;
			return SUCCESS;
		}
		while(q)
		{
			if(q -> next != NULL && strcmp(l1 -> name, q -> name) > 0 && !(strcmp(l1 -> name, q -> next -> name) > 0))
			{
				l1 -> next = q -> next;
				q -> next = l1;
				return SUCCESS;
			}
			if(q -> next == NULL && strcmp(q -> name, l1 -> name) <= 0)
			{
				q -> next = l1;
				l1 -> next = NULL;
				return SUCCESS;
			}
			q = q -> next;
		}
	}
	return FAILURE;
}
//根据姓名查找
int QueryByName(AL *l, char *name)
{
	int flag = 0;
	if(NULL == l)
	{
		printf("NULL ERROR\n");
		exit(1);
	}
	AL *p = l -> next;
	while(p)
	{
		if(strcmp(p -> name, name) == 0)
		{
			printf("num :%d\nname :%s\ncallnum :%s\nphonenum :%s\naddress :%s\n", 
			p -> num, p -> name, p -> callnum, p -> phonenum, p -> address);
			flag = 1;
			printf("-------------\n");
		}
		p = p -> next;
	}
	return (flag == 1) ? SUCCESS : FAILURE;
}
//根据编号查找
int QueryByNum(AL *l, int num)
{
	if(NULL == l)
	{
		printf("NULL ERROR\n");
		exit(1);
	}
	AL *p = l -> next;
	
	while(p)
	{
		if(num == p -> num)
		{	
			printf("num :%d\nname :%s\ncallnum :%s\nphonenum :%s\naddress :%s\n", 
			p -> num, p -> name, p -> callnum, p -> phonenum, p -> address);
			printf("------------\n");
		}
		p = p -> next;
	}
	return SUCCESS;

}
//Query Menue 

int QueryMenue(AL *l)
{
	int choice, num;
	char *name =( char *)malloc(sizeof(char) * 20);
	if(NULL == name)
	{
		printf("NULL ERROR\n");
		exit(1);
	}
	printf("\t\t\t1、姓名查找        2、编号查找\n");
	printf("\t\t\t3、返回上一个界面             \n");
	scanf("%d", &choice);
	switch(choice)
	{
		case 1: printf("input name for query\n");
				scanf("%s", name);
				QueryByName(l, name);
				break;
		case 2: printf("input num for query\n");
				scanf("%d", &num);
				QueryByNum(l, num);
				break;
		case 3: return SUCCESS;
				break;
		default: return FAILURE;
				break;
	}
	return SUCCESS;
}

/*
删除指定的成员,如果名字相同则,选择编号,再删除
*/
int DeleteAl(AL *l, int *index)
{
	if(NULL == l)
	{
		printf("NULL 错误\n");
		exit(1);
	}
	AL *p = l;
//	AL *q = l;
	AL *temp;
	int count;
	int ret;
	int num;
	char *name = (char *)malloc(sizeof(char) * 20);
	if(NULL == name)
	{
		printf("NULL ERROR\n");
		exit(1);
	}
	printf("please input name\n");
	scanf("%s", name);
	if(TRUE != CheckName(p, name, &count))
	{
		printf("name wrong\n");
	}
	else
	{
		p = p -> next;
		if(count == 1)
		{
			if(strcmp(p -> name, name) == 0)
			{
				l -> next = p -> next;
				free(p);  
				index --;
				//p = NULL;
				printf("delete success\n");
				return SUCCESS;
			}
			while(p && p -> next)
			{
				if(strcmp(p -> next -> name, name) == 0)
				{
					temp = p -> next;
					p -> next = temp -> next;
					free(temp);
	                index --;
					printf("delete success\n");
					return SUCCESS;
				}
				p = p -> next;
			}
				         	   
		}
		else
		{
			ret = QueryByName(l, name);
			if(SUCCESS == ret)
			{
				 
				printf("please choose num\n");
				scanf("%d", &num);
				if(p -> num - num == 0)
				{
					l -> next = p -> next;
					free(p);
					return SUCCESS;
				}					
				while(p && p -> next)
				{
					if(p -> next -> num - num == 0)
					{
						temp = p -> next;
						p -> next = temp -> next;
					 	free(temp);
	                    index --;
					    printf("delete success\n");
						return SUCCESS;
					}
					p = p -> next;
				}
				return FAILURE;
			}
		}
	}
	return FAILURE;
}

int ModifyAl(AL *l)
{
	int ret;
	int count;
	int flag = 0;
	int num, length, length1;
	if(NULL == l)
	{
		return FAILURE;
	}
	char *name = (char *)malloc(sizeof(char) * 20);
	char *name1 = (char *)malloc(sizeof(char) * 20);
	char *callnum = (char *)malloc(sizeof(char) * 8);
	char *phonenum = (char *)malloc(sizeof(char) * 11);
	AL *p = l;
	AL *q = l;
	if(NULL == name || NULL == callnum || NULL == phonenum || NULL == name1)
	{
		printf("NULL ERROR\n");
	}
	printf("please input name\n");
	scanf("%s", name);
	ret = CheckName(q, name, &count); 
	if(FAILURE == ret)
	{
		printf("wrong name\n");
		return FAILURE; 
	}
	p = p -> next;
	if(1 == count)
	{
		while(p)
		{
			if(strcmp(p -> name, name) == 0)
			{      
/*
输入姓名,如果与之前姓名重复则重新输入
*/
				printf("请输入姓名\n");
				scanf("%s", name1);
				length = strlen(name1);
				length1 = strlen(p -> name);
				
				if(20 < strlen(name1))
				{
					printf("too long\n");
					return FALSE;
				}
				if(length1 > length)
				{
					strcpy(p -> name, name1);
					memset(p -> name + length, 0, length1 - length);
				}
				else
				{
					strcpy(p -> name, name1);
				}

/*
输入电话号码,如果输入的电话与之前相同则重新输入8位
*/	

				printf("请输入8为座机号码\n");
				memset(p -> callnum, 0, 8);
				scanf("%s", callnum);
				getchar();
				ret = CheckCallnum(q, callnum);
				if(TRUE == ret)
				{
					flag = 1;
					while(1 == flag)
					{
						memset(callnum, 0, 8);
						printf("请输入正确的号码\n");
						scanf("%s", callnum);
						ret = CheckCallnum(q, callnum);
						if(FALSE == ret)
						{
							flag = 0;
						}
					}
				}
				strcpy(p -> callnum, callnum);
/*
输入手机号码,如果输入与之前相同则要求重新输入,且为11位;开头为13,14,15,17,18
*/	

				printf("请输入11位的手机号\n");
				memset(p -> phonenum, 0, 11);
				scanf("%s", phonenum);
				ret = CheckPhonenum(q, phonenum);
				if(TRUE == ret)
				{
					flag = 1;
					while(1 == flag)
					{
						memset(phonenum, 0, 11);
						printf("请输入正确的号码\n");
						scanf("%s", phonenum);
						ret = CheckPhonenum(q, phonenum);
						if(FALSE == ret)
						{
							flag = 0;
						}
					}
				} 
				strcpy(p -> phonenum, phonenum);
/*
输入地址
*/

				printf("请输入地址\n");
				memset(p -> address, 0, 50);
				scanf("%s", p -> address);
				if(strlen(p -> address) > 50)
				{
					printf("too long \n");
					return FALSE;
				}
			}
		p = p -> next;
		
		}
	}
	else if(count > 1)
	{
		QueryByName(q, name);
		printf("please input num for modify\n");
		scanf("%d", &num);
		while(p)
		{
			if(p -> num - num == 0)
			{
/*
输入姓名,如果与之前姓名重复则重新输入
*/
				printf("请输入姓名\n");
				scanf("%s", name1);
				length = strlen(name1);
				length1 = strlen(p -> name);
				
				if(20 < strlen(name1))
				{
					printf("too long\n");
					return FALSE;
				}
				if(length1 > length)
				{
					strcpy(p -> name, name1);
					memset(p -> name + length, 0, length1 - length);
				}
				else
				{
					strcpy(p -> name, name1);
				}
/*
输入电话号码,如果输入的电话与之前相同则重新输入8位
*/	

				printf("请输入8为座机号码\n");
				memset(p -> callnum, 0, 8);
				scanf("%s", callnum);
				getchar();
				ret = CheckCallnum(q, callnum);
				if(TRUE == ret)
				{
					flag = 1;
					while(1 == flag)
					{
						memset(callnum, 0, 8);
						printf("请输入正确的号码\n");
						scanf("%s", callnum);
						ret = CheckCallnum(q, callnum);
						if(FALSE == ret)
						{
							flag = 0;
						}
					}
				}
				strcpy(p -> callnum, callnum);
/*
输入手机号码,如果输入与之前相同则要求重新输入,且为11位;开头为13,14,15,17,18
*/	

				printf("请输入11位的手机号\n");
				memset(p -> phonenum, 0, 11);
				scanf("%s", phonenum);
				ret = CheckPhonenum(q, phonenum);
				if(TRUE == ret)
				{
					flag = 1;
					while(1 == flag)
					{
						memset(phonenum, 0, 11);
						printf("请输入正确的号码\n");
						scanf("%s", phonenum);
						ret = CheckPhonenum(q, phonenum);
						if(FALSE == ret)
						{
							flag = 0;
						}
					}
				}
				strcpy(p -> phonenum, phonenum);
/*
输入地址
*/

				printf("请输入地址\n");
				memset(p -> address, 0, 50);
				scanf("%s", p -> address);
				if(strlen(p -> address) > 50)
				{
					return FALSE;
				}

			}
		p = p -> next;
		}
	}
	printf("----End-----Modify------\n");
	return SUCCESS;
}

/*

*/
int ShowAl(AL *l)
{
	if(NULL == l)
	{
		printf("NULL ERROR\n");
		return FALSE;
	}
	AL *p = l;
	p  = p -> next;
	if(p -> next == NULL && p != NULL)
	{
		  printf("num :%d\nname :%s\ncallnum :%s\nphonenum :%s\naddress :%s\n", 
		  p -> num, p -> name, p -> callnum, p -> phonenum, p -> address);
		  printf("------------\n");
	}
	else if(p == NULL)
	{
		return FAILURE;
	}
	else
	{
		while(p)
		{
			 printf("num :%d\nname :%s\ncallnum :%s\nphonenum :%s\naddress :%s\n", 
			 p -> num, p -> name, p -> callnum, p -> phonenum, p -> address);
			 printf("------------\n");
			 p = p -> next;	
		}
	}
	return SUCCESS;
}

#include"AddressList.h"

int main()
{
	int ret, choice;
	int count = 0;
	AL *l = (AL *)malloc(sizeof(AL));
	if(NULL == l)
	{
		printf("NULL ERROR\n");

	}
	
	
	ret = InitAl(&l);
	if(FAILURE == ret)
	{
		printf("init failure\n");
		exit(1);
	}
	else
	{
		printf("init success\n");
	}
 	   
	Welcome();
	system("clear");
	while(1)
	{
		choice = Menue();
		system("clear");
		switch(choice)
		{
			case 1:	InsertAl(l, count ++);
					break;
			case 2: DeleteAl(l, &count);
					break;
			case 3: QueryMenue(l);
					break;
			case 4: ModifyAl(l);
					break;
			case 5: ShowAl(l);
					break;
			case 6:	printf("\t\t\t-------BYE----BYE---------\n");
					exit(1);
					break;
			default:printf("\t\t\twrong choice!!!\n");
			        exit(1);

		}
	}


	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值