- #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 20
#define OK 1
#define Error 0 typedef struct Node //定义一个存储数据的结构体 {
char name[SIZE];
char s;
long int number;
char remark[SIZE];
struct Node *next; } Node; typedef struct Node *LinkList; //定义了结构体指针
/************创建一个空的结点,作为头结点***************/ LinkList
CreateEmptyLinkList() {
LinkList p; //名称名为 p
p=(LinkList)malloc(sizeof(Node)); //手动申请一个堆区的地址,为结点提供空间 (p变量就代表地址长度和Node一样所占内存空间同样大小的Linklist)
if(p==NULL) //判断创建地址是否成功
{
printf("CreateEmptyLinkList Error\n");
exit(0); //表示正常退出
}
p->next=NULL; //指向下一个
return p; }
/************头插法添加新的联系人************************/
int CreateLinkList(LinkList Q) {
LinkList p;
char name[SIZE],s,remark[SIZE];
long int num;
p=(LinkList)malloc(sizeof(Node)); //p变量就代表地址长度和Node一样所占内存空间同样大小的Linklist(获取Node的字段长度,强制转换成LinkList类型,再赋值与p)
if(p==NULL)
{
printf("CreateLinkList Error\n");
return Error;
}
printf("请输入姓名:");
scanf("%s",name);
strcpy(p->name,name); //将输入的name复制到p->name
printf("请输入性别(m/男,f/女):");
scanf("%s",&s);
while(s!='m'&&s!='f') //判断输入性别格式是否正确
{
printf("输入错误\n");
printf("请输入性别(m/男,f/女):");
scanf("%s",&s);
}
printf("请输入电话号码:");
scanf("%ld",&num);
printf("请输入备注:");
scanf("%s",remark);
p->s=s; //s的值赋予p->s
p->number=num; //num的值赋予p->number
strcpy(p->remark,remark); //将remake复制到p->remake
p->next=Q->next; //p节点指向Q的下一个数据
Q->next=p; //p的值赋予Q->next
return OK; } /*********************制作原始联系人信息****************/ int FirstCreateLinkList(LinkList Q) {
LinkList x,y,z,a,b,c,d;
x=(LinkList)malloc(sizeof(Node));
if(x==NULL)
{
printf("CreateLinkList Error\n");
return Error;
}
strcpy(x->name,"yan");
x->s='m';
x->number=10110;
x->next=Q->next;
strcpy(x->remark,"yan");
Q->next=x;
y=(LinkList)malloc(sizeof(Node));
if(y==NULL)
{
printf("CreateLinkList Error\n");
return Error;
}
strcpy(y->name,"shi");
y->s='f';
y->number=11100;
strcpy(y->remark,"shi");
y->next=Q->next;
Q->next=y;
z=(LinkList)malloc(sizeof(Node));
if(z==NULL)
{
printf("CreateLinkList Error\n");
return Error;
}
strcpy(z->name,"思路");
z->s='m';
z->number=10000;
strcpy(z->remark,"思路");
z->next=Q->next;
Q->next=z;
return OK; } /*****************按姓名删除一个联系人****************************/
int DeleteNameLinkList(LinkList L,char name1[SIZE]) {
LinkList p,q;
p=L;
while(p->next && strcmp(p->next->name,name1))
{
p=p->next;
}
if(!p->next)
{
printf("该通讯录没有要删除的联系人,删除失败!\n");
return Error;
}
else
{
q=p->next;
printf("已删除联系人:\n");
printf("姓名:%s\n",q->name);
if(q->s=='m')
printf("性别:男\n");
else
printf("性别:女\n");
printf("电话号码:%ld\n",q->number);
printf("备注:%s\n",q->remark);
p->next=q->next;
free(q);
return OK;
} } /*****************按号码删除一个联系人****************************/
int DeleteNumLinkList(LinkList L,long int j) {
LinkList p,q;
p=L;
while((p->next->number!=j)&&((p->next)!=NULL))
{
p=p->next;
if((p->next)==NULL)
{
printf("该通讯录没有要删除的联系人,删除失败!\n");
return Error;
}
}
q=p->next;
printf("已删除联系人:\n");
printf("姓名:%s\n",q->name);
if(q->s=='m')
printf("性别:男\n");
else
printf("性别:女\n");
printf("电话号码:%ld\n",q->number);
printf("备注:%s\n",q->remark);
p->next=q->next;
free(q);
return OK; }
/******************按姓名查找一个联系人****************************/ int
FindNameLinkList(LinkList L,char name2[SIZE]) {
LinkList p,q;
p=L;
while(strcmp(p->next->name,name2)!=0&&(p->next!=NULL))
{
p=p->next;
if(p->next==NULL)
{
printf("该通讯录没有您要找的人,查找失败\n");
return Error;
}
}
q=p->next;
printf("找到记录:\n");
printf("姓名:%s\n",q->name);
if(q->s=='m')
printf("性别:男\n");
else
printf("性别:女\n");
printf("电话号码:%ld\n",q->number);
printf("备注:%s\n",q->remark);
printf("*********************************\n");
return OK; } /******************按号码查找一个联系人****************************/ int
FindNumLinkList(LinkList L,long int j) {
LinkList p,q;
p=L;
while((p->next->number!=j)&&((p->next)!=NULL))
{
p=p->next;
if((p->next)==NULL)
{
printf("该通讯录没有您要找的人,查找失败\n");
return Error;
}
}
q=p->next;
printf("找到记录:\n");
printf("姓名:%s\n",q->name);
if(q->s=='m')
printf("性别:男\n");
else
printf("性别:女\n");
printf("电话号码:%ld\n",q->number);
printf("备注:%s\n",q->remark);
printf("*********************************\n");
return OK; } /******************查找一个联系人****************************/ int
FindLinkList(LinkList L) {
LinkList head = L;
printf("*********************************\n");
printf("请输入查找联系人的方式:\n");
printf("1:按姓名\n");
printf("2:按号码\n");
printf("0:返回\n");
printf("*********************************\n");
printf("请选择:");
int k=3; //确保下面while循环运行
while(k)
{
scanf("%d",&k);
char Delname1[SIZE];
long int N;
if(k>2||k<0)
{
printf("输入错误,请重新输入:");
scanf("%d",&k);
while(getchar()!='\n')
printf("\n");
}
switch(k)
{
case 1:
printf("请输入姓名:");
scanf("%s",Delname1);
FindNameLinkList(head,Delname1);
k=0;
break;
case 2:
printf("请输入号码:");
scanf("%ld",&N);
FindNumLinkList(head,N);
k=0;
break;
}
} } /********************清空联系人信息*************************/ int ClearLinkList(LinkList L) {
LinkList p,q;
p=L->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
printf("清空所有联系人成功\n");
return OK; } /*********************筛选所有男性联系人**********************/ int
ScreenMaleLinkList(LinkList L) {
LinkList p;
p=L->next;
int i=0;
while(p)
{
if(p->s=='m')
{
printf("姓名:%s\n",p->name);
if(p->s=='m')
printf("性别:男\n");
else
printf("性别:女\n");
printf("电话号码:%ld\n",p->number);
printf("备注:%s\n",p->remark);
printf("*********************************\n");
}
p=p->next;
i++;
}
if(i==0&&!p)
{
printf("无男性联系人\n");
}
return OK; } /*********************筛选所女性联系人**********************/ int
ScreenFemaleLinkList(LinkList L) {
LinkList p;
p=L->next;
int i=0;
while(p)
{
if(p->s=='f')
{
printf("姓名:%s\n",p->name);
if(p->s=='m')
printf("性别:男\n");
else
printf("性别:女\n");
printf("电话号码:%ld\n",p->number);
printf("备注:%s\n",p->remark);
printf("*********************************\n");
}
p=p->next;
i++;
}
if(i==0&&!p)
{
printf("无女性联系人\n");
}
return OK; } /************************通讯录功能界面*****************/ void FunctionalInterface() {
printf(" ******** ********* \n");
printf("********************************* ************ ********* \n");
printf(" 欢迎使用超级玛丽的通讯录! ####....#. ********* \n");
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"); } /*****************删除一个联系人****************************/ int
DeleteLinkList(LinkList L) {
LinkList head = L;
printf("*********************************\n");
printf("请输入删除联系人的方式:\n");
printf("1:按姓名\n");
printf("2:按号码\n");
printf("0:返回\n");
printf("*********************************\n");
printf("请选择:");
int i=3;
while(i)
{
scanf("%d",&i);
char Delname[SIZE];
long int j;
if(i>2||i<0)
{
printf("输入错误,请重新输入:");
scanf("%d",&i);
while(getchar()!='\n')
printf("\n");
}
switch(i)
{
case 1:
printf("请输入姓名:");
scanf("%s",Delname);
DeleteNameLinkList(head,Delname);
i=0;
break;
case 2:
printf("请输入号码:");
scanf("%ld",&j);
DeleteNumLinkList(head,j);
i=0;
break;
}
}
} /*******************遍历打印整个链表**********************/ int
PrintfLinkList(LinkList L) {
LinkList p,q;
q=p=L->next;
int i=0;
while(q)
{
i++;
q=q->next;
if(i==0&&!p)
{
printf("无联系人\n");
}
}
printf("共有%d个联系人\n",i);
while(p)
{
printf("*********************************\n");
printf("姓名:%s\n",p->name);
if(p->s=='m')
printf("性别:男\n");
else
printf("性别:女\n");
printf("电话号码:%ld\n",p->number);
printf("备注:%s\n",p->remark);
p=p->next;
}
printf("*********************************\n");
return OK;
} /*******************主函数控制函数**********************/ int main() {
system("title 超级玛丽的通讯录");//设置标题
system("mode con cols=120 lines=30");//设置界面
system("color 75");//设置颜色
LinkList head;
head=CreateEmptyLinkList();
FirstCreateLinkList(head);
FunctionalInterface();
int a=1;
while(a)
{
printf("请输入您要选择的功能:");
scanf("%d",&a);
if(a>7||a<0)
{
printf("输入错误,请重新输入:");
scanf("%d",&a);
while(getchar()!='\n')
printf("\n");
}
switch(a)
{
case 1:
PrintfLinkList(head);//输入1,就访问功能一的头结点,遍历打印整个链表
break;
case 2:
CreateLinkList(head);//输入2,就访问功能二的头结点,头插法添加新的联系人
break;
case 3:
DeleteLinkList(head);//输入3,就访问功能三的头结点,删除一个联系人
break;
case 4:
FindLinkList(head);//输入4,就访问功能四的头结点,查找一个联系人
break;
case 5:
ClearLinkList(head);//输入5,就访问功能五的头结点,清空联系人信息
break;
case 6:
ScreenMaleLinkList(head);//输入6,就访问功能六的头结点,筛选所有男性联系人
break;
case 7:
ScreenFemaleLinkList(head);//输入7,就访问功能七的头结点,筛选所女性联系人
break;
}
if(a!=0) //输入0,结束应用
{
printf("请按回车键继续:");
getchar();
if(getchar()=='\n')
FunctionalInterface();
}
}
printf(" 超级玛丽:欢迎再次使用\n");
printf(" ********\n");
printf(" ************\n");
printf(" ####....#.\n");
printf(" #..###.....##....\n");
printf(" ###.......###### ### ###\n");
printf(" ........... #...# #...#\n");
printf(" ##*####### #.#.# #.#.#\n");
printf(" ####*******###### #.#.# #.#.#\n");
printf(" ...#***.****.*###.... #...# #...#\n");
printf(" ....**********##..... ### ###\n");
printf(" ....**** *****....\n");
printf(" #### ####\n");
printf(" ###### ######\n");
printf("##############################################################\n");
printf("#...#......#.##...#......#.##...#......#.##------------------#\n");
printf("###########################################------------------#\n");
printf("#..#....#....##..#....#....##..#....#....#####################\n");
printf("########################################## #----------#\n");
printf("#.....#......##.....#......##.....#......# #----------#\n");
printf("########################################## #----------#\n");
printf("#.#..#....#..##.#..#....#..##.#..#....#..# #----------#\n");
printf("########################################## ############\n");
return 0; }