数据结构小小小项目:简易通讯录
程序员文章站
2022-05-22 20:02:10
...
项目描述:
编写简易通讯录,要求使用“链表”这种存储结构,并附带相关操作。
需要功能:
1、使用链表存储联系人的相关信息,包括姓名、性别、电话号码、注释等,链表形式不限(推荐使用单链表,推荐事先准备一些数据)
2、有输出通讯录全部信息的功能
3、有清空通讯录的功能
4、有用户交互界面
5、有插入新联系人信息的功能
6、有查找联系人的功能,包括“按姓名查找”和“按电话号查找”两种
7、有删除联系人的功能,包括“按姓名删除”和“按电话号删除”两种
8、有按性别筛选联系人信息的功能
具体功能请参考示例程序
评分标准:
60+:独立完成,代码运行无错误,具备功能1~3
70+:独立完成,代码运行无错误,具备功能1~4
80+:独立完成,代码运行无错误,具备功能1~7,程序能针对非法输入报错
90+:独立完成,代码运行无错误,具备全部功能,程序能针对非法输入报错,代码书写规范,可读性强,程序与用户的交互性好
自己写的代码:::
/*************************************************************************
> 文件名称: phnum.c
> 为了梦想
> 好好学习
> 创建时间: 2018年07月26日 星期三 9时53分31秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define OK 1
#define ERR 0
/**************结构体声明******************/
typedef struct phnum
{
char name[16];
char sex;
char num[16];
char remark[32];
struct phnum *next;
}LinkList;
/**************创建头节点******************/
LinkList *HeadPoint()
{
LinkList *ll = NULL;
ll = (LinkList *)malloc(sizeof(LinkList));
if(NULL == ll)
{
printf("The HeadPoint Create Was Error\n");
return ERR;
}
else
{
ll->next = NULL;
return ll;
}
}
/**************添加联系人******************/
int AddPoint(LinkList *ll,char *name,char sex, char *num,char *remark,int *sum)
{
LinkList *nd = NULL;
if(NULL == ll)
{
printf("AddPoint's HeadPoint Create Was Error\n");
return ERR;
}
nd = (LinkList *)malloc(sizeof(LinkList));
if(NULL == nd)
{
printf("This Point Create is Error\n");
return ERR;
}
nd->next = ll->next;
ll->next = nd;
strcpy(nd->name,name);
nd->sex = sex;
strcpy(nd->num,num);
strcpy(nd->remark,remark);
*sum++;
return OK;
}
/**************遍历联系人******************/
int PrinLink(LinkList *ll)
{
int i = 1;
LinkList *run = NULL;
run = ll;
if(NULL == ll)
{
printf("PrinLink's HeadPoint Create Was Error\n");
return ERR;
}
if(NULL == ll->next)
{
printf(" This LinkList is Empty\n");
return ERR;
}
while(run->next)
{
run = run->next;
printf("/*******第%d位联系人*******/\n",i);
printf("姓名:%s\n",run->name);
if(run->sex == 'm')
{
printf("性别:男\n");
}
else if(run->sex == 'f')
{
printf("性别:女\n");
}
else
printf("性别:未知\n");
printf("手机号:%s\n",run->num);
printf("备注:%s\n",run->remark);
i++;
}
return OK;
}
/**************匹配姓名******************/
int FindName(LinkList *ll,char *name)
{
LinkList *run = NULL;
int t = 0;
if(NULL == ll)
{
printf("FindName's Head Point Was Error\n");
return ERR;
}
run = ll;
while(run->next)
{
run = run->next;
t++;
if(!strcmp(run->name,name))
{
return t;
}
}
if(!run->next)
{
printf("没有该联系人\n");
return ERR;
}
}
/**************匹配手机号******************/
int FindNum(LinkList *ll,char *num)
{
LinkList *run = NULL;
int t = 0;
if(NULL == ll)
{
printf("FindNum's Head Point Was Error\n");
return ERR;
}
run = ll;
while(run->next)
{
run = run->next;
t++;
if(!strcmp(run->num,num))
{
return t;
}
}
if(!run->next)
{
printf("没有该联系人\n");
return ERR;
}
}
/**************打印节点信息******************/
int PrintPoint(LinkList *ll,int t)
{
LinkList *run = NULL;
int i = 1;
//int i = 0; //或者
run = ll;
while(run && i<t)
//while(run && i<t-1) //或者
{
run = run->next;
i++;
}
run = run->next;
printf("/*******第%d位联系人*******/\n",i);
printf("姓名:%s\n",run->name);
if(run->sex == 'm')
{
printf("性别:男\n");
}
else if(run->sex == 'f')
{
printf("性别:女\n");
}
else
printf("性别:未知\n");
printf("手机号:%s\n",run->num);
printf("备注:%s\n",run->remark);
return OK;
}
/**************删除联系人******************/
int DeletePoint(LinkList *ll,int t,int *sum)
{
LinkList *run = NULL;
LinkList *p = NULL;
char count;
int i = 1;
//int i = 0; //或者
if(NULL == ll)
{
printf("The HeadPoint Create Was Error\n");
return ERR;
}
run = ll;
if(NULL == ll->next)
{
printf("This LinkList is Empty\n");
return ERR;
}
while(run && i<t)
//while(run && i<t-1) //或者
{
run = run->next;
i++;
}
if(!run->next)
{
printf("Delete This Point Wasn't found\n");
return ERR;
}
p = run->next;
run->next = p->next;
printf("/*******第%d位联系人*******/\n",t);
printf("姓名:%s\n",p->name);
if(p->sex == 'm')
{
printf("性别:男\n");
}
else if(p->sex == 'f')
{
printf("性别:女\n");
}
else
printf("性别:未知\n");
printf("手机号:%s\n",p->num);
printf("备注:%s\n",p->remark);
free(p);
p = NULL;
*sum--;
return OK;
}
/**************清空联系人******************/
int CleanLink(LinkList *ll,int *sum)
{
LinkList *run = NULL;
LinkList *p = NULL;
if(NULL == ll)
{
printf("The CleanLink's Head Was Error\n");
return ERR;
}
if(NULL == ll->next)
{
printf("这是一个空表\n");
return OK;
}
run = ll->next;
while(run->next)
{
p = run;
run = run->next;
free(p);
*sum--;
p = NULL;
}
if(!run->next)
{
ll->next = NULL;
return OK;
}
return ERR;
}
/**************遍历男性联系人******************/
int PrinMs(LinkList *ll)
{
int i = 1;
LinkList *run = NULL;
run = ll;
if(NULL == ll)
{
printf("PrinLink's HeadPoint Create Was Error\n");
return ERR;
}
if(NULL == ll->next)
{
printf(" This LinkList is Empty\n");
return ERR;
}
while(run->next)
{
run = run->next;
if(run->sex == 'm')
{
printf("/*******第%d位男性联系人*******/\n",i);
printf("姓名:%s\n",run->name);
printf("性别:男\n");
printf("手机号:%s\n",run->num);
printf("备注:%s\n",run->remark);
i++;
}
}
if(1 == i)
{
printf("无男性联系人\n");
return OK;
}
return OK;
}
/**************遍历女性联系人******************/
int PrinFs(LinkList *ll)
{
int i = 1;
LinkList *run = NULL;
run = ll;
if(NULL == ll)
{
printf("PrinLink's HeadPoint Create Was Error\n");
return ERR;
}
if(NULL == ll->next)
{
printf(" This LinkList is Empty\n");
return ERR;
}
while(run->next)
{
run = run->next;
if(run->sex == 'f')
{
printf("/*******第%d位女性联系人*******/\n",i);
printf("姓名:%s\n",run->name);
printf("性别:女\n");
printf("手机号:%s\n",run->num);
printf("备注:%s\n",run->remark);
i++;
}
}
if(1 == i)
{
printf("无男性联系人\n");
return OK;
}
return OK;
}
int main()
{
/**************数据定义******************/
LinkList *ll = NULL;
int sum = 0; //联系人总数
int sign; //操作是否成功的标志位
char name[16]; //联系人的姓名
char sex; //性别
char num[16]; //手机号
char remark[32]; //备注
int dt; //要删除的位置
int act1; //操作命令
int act2;
int act3;
/**************数据操作******************/
//初始化
ll = HeadPoint();
AddPoint(ll,"Jiang",'m',"123456789","shuai",&sum);
AddPoint(ll,"Yang",'f',"98765432100","mei",&sum);
AddPoint(ll,"Liu",'f',"123456654321","hao",&sum);
AddPoint(ll,"Zhang",'x',"12345123450","huai",&sum);
//更新数据
while(1)
{
printf("/*****************************\n");
printf("1:输出所有联系人\n");
printf("2:插入联系人\n");
printf("3:删除一个联系人\n");
printf("4:查找联系人\n");
printf("5:筛选所有男性联系人\n");
printf("6:筛选所有女性联系人\n");
printf("7:清空联系人信息\n");
printf("0:退出\n");
printf("*****************************/\n");
printf("请输入命令:");
while(1)
{
scanf("%d",&act1);
if(act1<0 || act1>7)
{
printf("无效指令,请重新输入:");
continue;
}
else
break;
}
printf("\n");
switch(act1)
{
//功能1
case 1:
PrinLink(ll);
break;
//功能2
case 2:
printf("请输入联系人姓名:");
scanf("%s",name);
printf("请输入联系人性别m(男)/f(女):");
setbuf(stdin,NULL);
while(1)
{
scanf("%c",&sex);
if(sex =='m' || sex == 'f')
break;
else
{
printf("输入错误,请重新输入:");
continue;
}
}
printf("请输入联系人手机号:");
scanf("%s",num);
printf("请输入联系人备注:");
scanf("%s",remark);
AddPoint(ll,name,sex,num,remark,&sum);
break;
//功能3
case 3:
printf("1:按姓名删除\n");
printf("2:按手机号删除\n");
printf("请输入命令:");
scanf("%d",&act2);
switch(act2)
{
case 1:
printf("请输入联系人姓名:");
scanf("%s",name);
dt = FindName(ll,name);
if(dt == 0)
break;
DeletePoint(ll,dt,&sum);
break;
case 2:
printf("请输入联系人手机号:");
scanf("%s",num);
dt = FindNum(ll,num);
if(dt == 0)
break;
DeletePoint(ll,dt,&sum);
break;
}
break;
//功能4
case 4:
printf("1:按姓名查询\n");
printf("2:按手机号查询\n");
printf("请输入命令:");
scanf("%d",&act3);
switch(act3)
{
case 1:
printf("请输入联系人姓名:");
scanf("%s",name);
dt = FindName(ll,name);
if(dt == 0)
break;
PrintPoint(ll,dt);
break;
case 2:
printf("请输入联系人手机号:");
scanf("%s",num);
dt = FindNum(ll,num);
if(dt == 0)
break;
PrintPoint(ll,dt);
break;
}
break;
//功能5
case 5:
PrinMs(ll);
break;
//功能6
case 6:
PrinFs(ll);
break;
//功能7
case 7:
sign = CleanLink(ll,&sum);
if(1 == sign)
printf("清空完毕!\n");
else
printf("清空失败!\n");
break;
//退出
case 0:
break;
}
if(0 == act1)
{
printf("欢迎下次使用!\n");
break;
}
else
continue;
}
printf("\n");
return 0;
}
上一篇: Spring bean 的生命周期