C语言通信录小项目

#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
#include<string.h>


/*定义节点*/
struct node
{
char name[20];
int age;
char phone[12];
char address[30];
struct node *next;
};
/*创建头节点*/
int init(struct node **pheader)
{
int i=1;
struct node *pnode=(struct node*)malloc(sizeof(struct node));//给结点分配空间;
if(pnode==NULL)
{
printf("create error\n");
while(i)
{
printf("请输入0,然后按Enter键退出\n");
       scanf("%d",&i);
   }
   return 0;
}
bzero(pnode,sizeof(struct node));//清理堆空间
// pnode->name[20]=" ";              //对于字符数组赋值一般调用库函数strcpy()
pnode->age=0;
// pnode->phone[12]=" ";
// pnode->address[30]=" ";
strcpy(pnode->name,"0");
strcpy(pnode->phone,"0");
strcpy(pnode->address,"0");
pnode->next=NULL;
(*pheader)=pnode;
return 0;
}




/*增加联系人*/
int add_person(struct node *pheader)
{
char a = 0;
int n=0;
struct node *pnode=(struct node*)malloc(sizeof(struct node));    //给结点分配空间;
if(pnode==NULL)
{
printf("create error\n");
printf("输入enter键退出");
   getchar();
   return 0;
}
bzero(pnode,sizeof(struct node));       //清理堆空间
printf("请输入联系人姓名(不要加空格)\n");
gets(pnode->name);
printf("请输入年龄(整数)\n");
/*while(1)部分避免非法数据的输入*/
while(1)
{   
        n=scanf("%d",&pnode->age);
if(n!=1)
{
while(getchar()!='\n')  //getchar()用于清除scanf函数的缓存区
{
continue;
   }
printf("输入有误,重新输入:");
}
else
break;
}

getchar();
printf("请输入联系电话\n");
gets(pnode->phone);
printf("请输入家庭住址\n");
gets(pnode->address);
pnode->next=NULL;

while(pheader->next!=NULL)
{
pheader=pheader->next;
}
pheader->next=pnode;
printf("\n");

printf("是否继续输入,是输入y,否输入n:");
scanf("%c",&a);
getchar();

if(a == 'y')
{
add_person(pheader);
}
else
{
printf("输入enter键退出");
getchar();
system("clear");
return 0;
}



}


/*修改联系人*/
int update(struct node *pheader)
{
struct node *p=pheader;
struct node *p1=pheader;
int flag=0;
int i=0;
int n=0;
char b='y';
char name1[20]={0};
if(p->next==NULL)
{
printf("通讯录为空\n");
printf("输入enter键退出");
   getchar();
   return 0;
}

printf("联系人有这些:\n");
while(p1->next!=NULL)
{
p1=p1->next;
printf("姓名为:%s\t",p1->name);
}

printf("\n");
printf("输入要修改的人的姓名\n");
scanf("%s",name1);
getchar();

while(p->next!=NULL)
{
if(strcmp(p->next->name,name1)==0)
{
printf("1 姓名为:%s\n",p->next->name);
printf("2 年龄为:%d\n",p->next->age);
printf("3 联系电话为:%s\n",p->next->phone);
printf("4 家庭住址为:%s\n",p->next->address);
   while(b=='y')
{
printf("输入要改内容的标号\n");
while(1)
{
n=scanf("%d",&i);
           if(n!=1)
{
   while(getchar()!='\n')  //getchar()用于清除scanf函数的缓存区
{
continue;
               }
           printf("输入有误,重新输入:");
           }
           else
   break;
           }
   getchar();
   switch(i)
{
case 1:printf("请输入联系人姓名(不要加空格)\n");
                  scanf("%s",p->next->name);getchar();break;
  
               case 2:printf("请输入年龄\n");
while(1)
{
n=scanf("%d",&p->next->age);
               if(n!=1)
{
while(getchar()!='\n')  //getchar()用于清除scanf函数的缓存区
{
continue;
                   }
               printf("输入有误,重新输入:");
               }
               else
break;
               }
               getchar();break;
               case 3:printf("请输入联系电话\n");
                  scanf("%s",p->next->phone);getchar();break;
               case 4:printf("请输入家庭住址\n");
                  scanf("%s",p->next->address);getchar();break;
   default:printf("请重新输入\n");break;
   }
   printf("是否继续修改,是输入y,否输入任意值:");
           scanf("%c",&b);
   getchar();
}

printf("\n");
printf("修改后为\n");
printf("姓名为:%s\n",p->next->name);
printf("年龄为:%d\n",p->next->age);
printf("联系电话为:%s\n",p->next->phone);
printf("家庭住址为:%s\n",p->next->address);
flag=1;
}
p=p->next;
}
if(flag==0)
{
printf("查无此人\n");
}
printf("输入enter键退出");
getchar();
system("clear");
return 0;


}




/*删除联系人*/
int delate(struct node *pheader)
{
struct node *p=pheader;
struct node *p1=pheader;
struct node *pprev=NULL;
int flag=0;
char name1[20]={0};
if(p->next==NULL)
{
printf("通讯录为空\n");
printf("输入enter键退出");
   getchar();
   return 0;
}
printf("联系人有这些:\n");
while(p1->next!=NULL)
{
p1=p1->next;
printf("姓名为:%s\t",p1->name);
}
printf("\n");
printf("输入要删除的人的姓名\n");
scanf("%s",name1);
while(p->next!=NULL)
{
pprev=p;
p=p->next;
if(strcmp(p->name,name1)==0)
{
pprev->next=p->next;
free(p); //释放被删的节点的空间
flag=1;
}
}
if(flag==0)
{
printf("没有要删除的人\n");
}
else
{
printf("删除成功\n");
}
getchar();
printf("输入enter键退出");
getchar();
system("clear");
return 0;
}


/*遍历所有联系人*/
int display(struct node *pheader)
{
//system("clear");
struct node *p=pheader;
//int i=1;
if(p->next==NULL)
{
printf("通讯录为空\n");
printf("输入enter键退出");
   getchar();
   return 0;
}
while(p->next!=NULL)
{
p=p->next;
printf("姓名为:%s\n",p->name);
printf("年龄为:%d\n",p->age);
printf("联系电话为:%s\n",p->phone);
printf("家庭住址为:%s\n",p->address);
printf("\n");
}
printf("\n");
printf("输入enter键退出");
getchar();
system("clear");
}


/*查找联系人*/
int look(struct node *pheader)
{
int flag=0;                   //立flag当找到要查找的人姓名,赋值为1,
struct node *p=pheader;
struct node *p1=pheader;
char name1[20]={0};
if(p->next==NULL)
{
printf("通讯录为空\n");
printf("输入enter键退出");
   getchar();
   return 0;
}
while(p1->next!=NULL)
{
p1=p1->next;
printf("姓名为:%s\t",p1->name);
}
printf("\n");
printf("输入要查找的人的姓名\n");
scanf("%s",name1);
while(p->next!=NULL)
{

if(strcmp(p->next->name,name1)==0)                 //strcmp()函数比较两个字符串的大小,相等返回值为0
{
printf("姓名为:%s\n",p->next->name);
printf("年龄为:%d\n",p->next->age);
printf("联系电话为:%s\n",p->next->phone);
printf("家庭住址为:%s\n",p->next->address);
flag=1;
}
p=p->next;
}
if(flag==0)
{
printf("查无此人\n");
}
getchar();
printf("输入enter键退出");
getchar();
system("clear");
//return 0;
}




/*主菜单*/
void menu()
{
printf("\033[1;25H\033[1;5;31m通讯录管理系统\033[0m");
printf("\n");
printf("\033[4;15H\033[1;5;31m1 查找联系人\033[0m");
printf("\n");
printf("\033[10;15H\033[1;5;31m2 删除联系人\033[0m");
printf("\n");
printf("\033[16;15H\033[1;5;31m3 修改联系人\033[0m");
printf("\n");
printf("\033[4;35H\033[1;5;31m4 增加联系人\033[0m");
printf("\n");
printf("\033[10;35H\033[1;5;31m5 遍历联系人\033[0m");
printf("\n");
printf("\033[16;35H\033[1;5;31m6 退出主菜单\033[0m");
printf("\n");
}


/*主函数,执行的入口*/
int main()
{
int i=0;
int n=0;
struct node *pheader=NULL;
init(&pheader);
do
{
system("clear");
menu();
printf("\033[23;1H\033[1;5;31m选择操作方式(选序号)\033[0m");
   /*避免输入错误数据类型*/
while(1)
{
n=scanf("%d",&i);             //scanf函数正确执行返回值为1,否则为0
   if(n!=1)
{
   while(getchar()!='\n')  //getchar()用于清除scanf函数的缓存区
{
continue;            //继续循环直到scanf函数的缓存区为空
       }
   printf("输入有误,重新输入:");
   }
   else
{
break;
}
   }
getchar(); 
system("clear");
switch(i)
{
case 1:look(pheader);break;

   case 2:delate(pheader);break;

   case 3:update(pheader);break;

   case 4:add_person(pheader);break;

   case 5:display(pheader);break;

   case 6:printf("成功退出系统!\n"); 
  return 0;
 
   default:printf("输入有误,过1秒自动跳转主页面\n"); 
       sleep(1);
break;
   }
}while(i!=6);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值