#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;
}