📄 chenrunhua.c
字号:
//两个关键:1.不能用scanf函数,否则误打空格,系统将崩溃。2.选择菜单时,不能用简单的int或char输入,否则
//系统也将会崩溃
//一个不常见语句:goto起到输入不合法时,转向重新输入的功能。此语句应注意:此语句内容中不能包含定义
//成分
#include<stdio.h>
#include<conio.h>//引入getche()实现只接受一个字符
#include<string.h>
#include<malloc.h>
#include<ctype.h>
#define DEBUG 0//调试把0改为1
typedef struct PhoneUser{
char username[20];
char useraddress[30];
char num[12];
struct PhoneUser *pnext;//必须
}PhoneUser;
void main()
{
//声明函数部分
PhoneUser *adduser(PhoneUser *phead);
void edituser(PhoneUser *phead);
PhoneUser *deluser(PhoneUser *phead);
void phonefind(PhoneUser *phead);
void namefind(PhoneUser *phead);
void userview(PhoneUser *phead);
//定义变量
PhoneUser * phead=NULL;
char type;
//提示用户信息
printf("\t\t★★★★★★电话号码目录系统★★★★★★\n");
do
{
printf("\n\t\t\t 1:添加新电话用户\n");
printf("\t\t\t 2:修改电话用户的信息\n");
printf("\t\t\t 3:删除已有电话用户的信息\n");
printf("\t\t\t 4:根据电话号码查询电话用户信息\n");
printf("\t\t\t 5:根据用户名称查询电话用户信息\n");
printf("\t\t\t 6:显示所有电话用户信息\n");
printf("\t\t\t 7:退出\n");
printf("请选择:");
//接受第一个字符进行操作
type=getche();
switch(type)
{
//添加新用户
case '1':
phead=adduser(phead);break;
//修改用户信息
case '2':
edituser(phead);break;
//删除用户
case '3':
phead=deluser(phead);break;
//根据电话号码查询
case '4':
phonefind(phead);break;
//根据用户名查询
case '5':
namefind(phead);break;
case '6':
//显示所有用户
userview(phead);break;
//退出
case '7':
printf("\n");
break;
default:
printf("\n输入错误,请重新选择!\n");
}
}while(type!='7');
}
//第二阶段
//1添加新用户函数
PhoneUser *adduser(PhoneUser *phead)
{
PhoneUser *ptemp=NULL,*p;
unsigned int i=0;//unsinged与strlen匹配
char ch;
#if DEBUG
printf("\n现在正在调试添加函数!!!\n");
#endif
//输入用户名不超过20个字符且不含空格
InputUsername:
//每次必须重新分配空间
ptemp=(PhoneUser *)malloc(sizeof(PhoneUser));
//分配不成功,转向主函数
if(ptemp==NULL)
return phead;
printf("\n请输入新增用户名称(最多20个字符且不含空格):");
gets(ptemp->username);
if(strlen(ptemp->username)>20||strlen(ptemp->username)==0)
{
printf("用户名输入错误,请重新输入!\n\n");
goto InputUsername;
}
else
{
for(i=0;i<strlen(ptemp->username);i++)
if(ptemp->username[i]==' ')
{
printf("用户名输入错误,请重新输入!\n\n");
goto InputUsername;
}
}
//输入家庭地址不超30个字符且不含空格
InputUseraddress:
printf("\n请输入新增用户家庭住址(最多30个字符且不含空格):");
gets(ptemp->useraddress);
if(strlen(ptemp->useraddress)>30||strlen(ptemp->useraddress)==0)
{
printf("家庭地址输入错误,请重新输入!\n\n");
goto InputUseraddress;
}
else
{
for(i=0;i<strlen(ptemp->useraddress);i++)
if(ptemp->useraddress[i]==' ')
{
printf("家庭地址输入错误,请重新输入!\n\n");
goto InputUseraddress;
}
}
//严格控制电话号码
//电话号码必须是7位数字且不含空格
InputNum:
printf("\n请输入新增用户电话号码(7位数字):");
gets(ptemp->num);
if(strlen(ptemp->num)!=7)
{
printf("对不起,电话号码必须是7位,请重新输入!\n\n");
goto InputNum;
}
else
{
//电话号码必须全是数字
for(i=0;i<strlen(ptemp->num);i++)
{
if(!(ptemp->num[i]>='0'&&ptemp->num[i]<='9'))
{
printf("对不起,电话号码必须全是数字,请重新输入!\n\n");
goto InputNum;
}
}
//电话号码不能重复
p=phead;
while(p)
{
if(strcmp(p->num,ptemp->num)==0)
{
printf("对不起,电话号码不能重复,请重新输入!\n\n");
goto InputNum;
}
p=p->pnext;
}
}
ptemp->pnext=NULL;
if(phead==NULL)
phead=ptemp;
else
{
p=phead;
while(p->pnext!=NULL)
p=p->pnext;
p->pnext=ptemp;
}
//添加成功后,反溃信息
printf("新用户记录成功添加:");
printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
printf("添加成功!!!\n\n");
//用户可选择退出或继续添加
printf("你还要添加吗?(Y/N或任意键退出):");
ch=getche();
if(ch=='Y'||ch=='y')
goto InputUsername;
else
return phead;
}
//第三阶段
//2修改用户信息函数
//注:电话号码不修改,如你不想要这个号码,你可以删除,再重新添加
void edituser(PhoneUser *phead)
{
PhoneUser *ptemp=phead;
char num[8],ch;
unsigned int i=0;
#if DEBUG
printf("\n现在正在调试修改函数!!!\n");
#endif
//如果暂无用户,则自动退出系统
if(ptemp==NULL)
{
goto out;
}
//电话号码是修改信息的令牌
InputNum:
printf("\n你要修改信息用户的电话号码:");
gets(num);
ptemp=phead;
while(ptemp)
{
if(strcmp(ptemp->num,num)==0)
{
printf("你要修改用户的全部信息:\n");
printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
//得令牌后,进行修改
//修改用户名
InputUsername:
printf("请输入修改后的用户名(小于20位且不含空格):");
gets(ptemp->username);
if(strlen(ptemp->username)>20||strlen(ptemp->username)==0)
{
printf("用户名输入错误,请重新选择添加!\n\n");
goto InputUsername;
}
else
{
for(i=0;i<strlen(ptemp->username);i++)
if(ptemp->username[i]==' ')
{
printf("用户名输入错误,请重新选择添加!\n\n");
goto InputUsername;
}
}
//修改家庭地址
InputUseraddress:
printf("请输入修改后的用户地址(小于30位且不含空格):");
gets(ptemp->useraddress);
if(strlen(ptemp->useraddress)>30||strlen(ptemp->useraddress)==0)
{
printf("家庭地址输入错误,请重新输入!\n\n");
goto InputUseraddress;
}
else
{
for(i=0;i<strlen(ptemp->useraddress);i++)
if(ptemp->useraddress[i]==' ')
{
printf("家庭地址输入错误,请重新输入!\n\n");
goto InputUseraddress;
}
}
//显示修改后信息
printf("你修改的信息为:");
printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
printf("修改成功!!\n\n");
//选择退出或继续修改
printf("你是否继续修改(Y/N或任意键退出):");
ch=getche();
if(ch=='Y'||ch=='y')
goto InputNum;
break;
}
ptemp=ptemp->pnext;
}
//没有得到令牌
if(ptemp==NULL)
{
printf("没有此用户,输入信息有误!!!\n");
printf("你是否继续修改(Y/N或任意键退出):");
ch=getche();
if(ch=='Y'||ch=='y')
goto InputNum;
}
//还没有用户
if(phead==NULL)
{
out:
printf("\n还没有用户!!!\n\n");
}
}
//3删除用户函数
//注:为了避免误删除,在删除前,再进行一次确认
PhoneUser *deluser(PhoneUser *phead)
{
PhoneUser *ptemp=phead,*p;
char num[8],ch;
int flag=0;
#if DEBUG
printf("\n现在正在调试删除函数!!!\n");
#endif
if(phead==NULL)
{
flag=1;
goto out;
}
//确认删除
printf("\n请确实要删除电话用户吗?(Y/N或任意键退出):");
ch=getche();
if(ch=='Y'||ch=='y')
{
//获取令牌
while(ptemp)
{
InputNum:
if(phead==NULL)
{
flag=1;
goto out;
}
ptemp=phead;
printf("\n请输入你要删除用户的电话号码:");
gets(num);
if(strcmp(ptemp->num,num)==0)
{
printf("你要删除用户的全部信息:\n");
printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
p=phead;
if(phead==ptemp)
{
phead=ptemp->pnext;
break;
}
while(1)
{
if(p->pnext==ptemp)
{
p->pnext=ptemp->pnext;
break;
}
p=p->pnext;
}
break;
}
ptemp=ptemp->pnext;
}
//没有令牌
if(ptemp==NULL)
{
printf("没有此用户,输入信息有误!!!\n\n");
//可以再删除,也可以退出
printf("你还要继续删除吗?(Y/N或任意键退出):");
ch=getche();
if(ch=='Y'||ch=='y')
goto InputNum;
}
else
{
printf("删除成功!!!\n\n");
//可以删除,也可以退出
printf("你还要继续删除吗?(Y/N或任意键退出):");
ch=getche();
if(ch=='Y'||ch=='y')
goto InputNum;
}
}
if(flag==1)
{
out:
printf("\n还没有用户!!!\n\n");
}
return phead;
}
//4根据电话号码查询函数
void phonefind(PhoneUser *phead)
{
PhoneUser *ptemp=phead;
char phone[20],ch;
#if DEBUG
printf("\n现在正在调试电话号码查询函数!!!\n");
#endif
if(ptemp==NULL)
{
goto out;
}
InputNum:
printf("\n你要查询用户信息的电话号码:");
gets(phone);
while(ptemp)
{
if(strcmp(ptemp->num,phone)==0)
{
printf("这是你要查询用户的全部信息:\n");
printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
printf("查询成功!!!\n\n");
//选择继续查询或退出
printf("你还继续查询吗?(Y/N或按任意键退出):");
ch=getchar();
if(ch=='Y'||ch=='y')
goto InputNum;
break;
}
ptemp=ptemp->pnext;
}
if(ptemp==NULL)
{
printf("没有此电话号码,输入信息有误!!!\n");
//选择继续查询或退出
printf("你还继续查询吗?(Y/N或按任意键退出):");
ch=getche();
if(ch=='Y'||ch=='y')
goto InputNum;
}
if(phead==NULL)
{
out:
printf("\n还没有用户!!!\n\n");
}
}
//5根据用户名查询函数
void namefind(PhoneUser *phead)
{
PhoneUser *ptemp=phead;
char name[20],ch;
#if DEBUG
printf("\n现在正在调试用户名查询函数!!!\n");
#endif
if(ptemp==NULL)
{
goto out;
}
InputUsername:
printf("\n你要查询用户信息的用户名:");
gets(name);
while(ptemp)
{
if(strcmp(ptemp->username,name)==0)
{
printf("这是你要查询用户的全部信息:\n");
printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
printf("查询成功!!!\n\n");
//选择继续查询或退出
printf("你还继续查询吗?(Y/N或任意键退出):");
ch=getche();
if(ch=='Y'||ch=='y')
goto InputUsername;
break;
}
ptemp=ptemp->pnext;
}
if(ptemp==NULL)
{
printf("没有此用户,输入信息有误!!!\n");
//选择继续查询或退出
printf("你还继续查询吗?(Y/N或任意键退出):");
ch=getche();
if(ch=='Y'||ch=='y')
goto InputUsername;
}
if(phead==NULL)
{
out:
printf("\n还没有用户!!!\n\n");
}
}
//第四阶段
//6显示所有用户函数
void userview(PhoneUser *phead)
{
PhoneUser *ptemp=phead;
#if DEBUG
printf("\n现在正在调试显示用户函数!!!\n");
#endif
//还没有用户,无条件退出
if(ptemp==NULL)
printf("\n还没有用户!!!\n\n");
else
{
printf("\n这是所有用户信息:\n");
while(ptemp)
{
printf("%s\t%s\t%s\n",ptemp->username,ptemp->useraddress,ptemp->num);
ptemp=ptemp->pnext;
}
printf("\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -