一、实验目的及实验环境
实验目的:熟练运用并且掌握结构体的各项操作,并将结构体与链表结合在一起,练习链表的创建、插入、删除、遍历、查找、排序等各项操作,练习用文件来存储数据和读取数据。
实验环境:Windows 8.1,Visual C++
二、实验内容
1.用链表来创建QQ好友分组;
2.用链表来储存QQ好友的各种信息;
3.用链表来实现QQ好友的添加、删除、查询,排序等功能;
4.注册或者登陆QQ用户,并将用户的各项信息存储在文件中;
三、方案设计
这个程序具有的特点:
1.在用链表来存储QQ好友的各种信息时,采用了尾插法。
2.在添加QQ好友时,可以由用户自己来定义好友的位置。
3.在查询好友信息时,设计了模糊查询和精确查询两种方式,来方便用户在不了解对方的所有确切信息时,可以顺利查询到想要加的好友。
4.排序,提供了按照好友分组、好友年龄、好友昵称多种排序方式,方便用户的选择与使用。
5.用户可以自己注册自己的账户,并且将信息存储在文件中,可以在下次登录时,直接从文件中读取信息,登陆。
6.界面简洁明白,提示信息详细准确,方便用户的使用。
代码如下:
# include<stdio.h>
# include<stdlib.h>
# include<io.h>
# include<string.h>
# include<conio.h>
# define N 30
# define M 100
struct shengfen
{
char country[N];
char province[N];
char city[N];
};
struct birthday
{
int year;
int month;
int day;
};
typedef struct yonghu
{
char name[N];
char sex[N];
char yonghuming[N];
char mask[N];
struct birthday yong;
struct shengfen xinxi;
}xinxi;
struct message
{
char group[N];
char name[N];
char sex[N];
char age[N];
char qianming[M];
char beizhu[N];
struct shengfen diqu;
};
typedef struct node
{
struct message data;
struct node * pNext;
}ME,* PME;
typedef struct group1
{
char group[N];
struct group1 * pNext;
}Xinxi,* pXinxi;
pXinxi make_group()
{
int n,i;
pXinxi head1=(pXinxi)malloc(sizeof(Xinxi));
if(head1==NULL)
{
printf("分配失败,程序终止,请按任意键退出\n");
getch();
exit(1);
}
pXinxi tail=head1;
tail->pNext=NULL;
printf("请输入你想要创建的分组的个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
pXinxi pNew=(pXinxi)malloc(sizeof(Xinxi));
if(pNew==NULL)
{
printf("分配失败,程序终止");
exit(1);
}
printf("请输入你想要创建的第%d个分组的名称:",i+1);
fflush(stdin);
gets(pNew->group);
tail->pNext=pNew;
pNew->pNext=NULL;
tail=pNew;
}
free(tail);
return head1;
}
PME make_list()
{
PME head=(PME)malloc(sizeof(ME));
if(head==NULL)
{
printf("分配失败,程序中止");
exit(-1);
}
PME tail=head;
tail->pNext=NULL;
int i,len;
printf("请输入你想要创建的通讯录的联系人数量:");
scanf("%d",&len);
for(i=0;i<len;i++)
{
PME pNew=(PME)malloc(sizeof(ME));
if(pNew==NULL)
{
printf("分配失败,程序中止");
exit(1);
}
fflush(stdin);
printf("请输入第%d个人的信息:\n",i+1);
printf("请输入好友的分组:");
gets(pNew->data.group);
fflush(stdin);
printf("请输入好友的年龄:");
gets(pNew->data.age);
fflush(stdin);
printf("请输入好友的昵称:");
gets(pNew->data.name);
fflush(stdin);
printf("请输入好友的性别:");
gets(pNew->data.sex);
fflush(stdin);
printf("请输入好友的签名:");
gets(pNew->data.qianming);
fflush(stdin);
printf("请输入好友的备注名:");
gets(pNew->data.beizhu);
fflush(stdin);
printf("请输入好友的所在地:");
scanf("%s%s%s",pNew->data.diqu.country,pNew->data.diqu.province,pNew->data.diqu.city);
tail->pNext=pNew;
pNew->pNext=NULL;
tail=pNew;
}
return head;
}
PME insert_list(PME head)
{
int n,m,i,j=0;
printf("请输入你想要插入几个好友的信息:");
scanf("%d",&n);
system("cls");
for(i=0;i<n;i++)
{
printf("请输入你想要在第几个好友信息前面插入新的好友信息:");
scanf("%d",&m);
system("cls");
PME p=head;
while(j<m-1&&p!=NULL)
{
p=p->pNext;
j++;
}
if(j>m-1||p==NULL)
return head;
PME pNew=(PME)malloc(sizeof(ME));
if(pNew==NULL)
{
printf("分配失败,程序中止");
exit(-1);
}
fflush(stdin);
printf("请输入新添加的第%d个好友的信息:\n",i+1);
printf("请输入好友的分组:");
gets(pNew->data.group);
fflush(stdin);
printf("请输入好友的年龄:");
gets(pNew->data.age);
fflush(stdin);
printf("请输入好友的昵称:");
gets(pNew->data.name);
fflush(stdin);
printf("请输入好友的性别:");
gets(pNew->data.sex);
fflush(stdin);
printf("请输入好友的签名:");
gets(pNew->data.qianming);
fflush(stdin);
printf("请输入好友的备注名:");
gets(pNew->data.beizhu);
fflush(stdin);
printf("请输入好友的所在地:");
scanf("%s%s%s",pNew->data.diqu.country,pNew->data.diqu.province,pNew->data.diqu.city);
PME q=p->pNext;
p->pNext=pNew;
pNew->pNext=q;
}
return head;
}
void trave_list(PME head)
{
PME p=head->pNext;
int i=1;
while(p!=NULL)
{
printf("第%d个好友的信息是:\n",i);
printf("好友分组是:");
puts(p->data.group);
printf("好友昵称是:");
puts(p->data.name);
printf("好友的年龄是:");
puts(p->data.age);
printf("好友的性别是:");
puts(p->data.sex);
printf("好友的签名是:");
puts(p->data.qianming);
printf("好友的备注名是:");
puts(p->data.beizhu);
printf("好友的所在地是:%s%s%s\n",p->data.diqu.country,p->data.diqu.province,p->data.diqu.city);
i++;
p=p->pNext;
}
}
PME delete_list(PME head)
{
char a[N];
int i,n;
printf("请输入你想要删除的好友的数量:");
scanf("%d",&n);
system("cls");
for(i=0;i<n;i++)
{
PME p=head->pNext;
PME q;
fflush(stdin);
printf("请输入你想要删除的第%d个好友的昵称:",i+1);
gets(a);
while(p!=NULL)
{
if(strcmp(a,p->data.name)==0)
q=p;
p=p->pNext;
}
PME t=head;
while(t!=NULL&&t->pNext!=q)
{
t=t->pNext;
}
t->pNext=q->pNext;
free(q);
q=NULL;
}
return head;
}
void check_list(PME head)
{
int i,n,len=0;
PME t=head->pNext;
while(t!=NULL)
{
t=t->pNext;
len++;
}
printf("1.精确查找\n2.模糊查找\n");
printf("请输入你想要进行查找的方式:");
scanf("%d",&n);
system("cls");
if(n==1)
{
int m;
printf("1.按照昵称查找\n2.按照备注名查找\n");
printf("请选择你想要使用的查找方式:");
scanf("%d",&m);
system("cls");
if(m==1)
{
char a[N];
PME p=head->pNext;
fflush(stdin);
printf("请输入你想要查找的昵称:");
gets(a);
system("cls");
while(p!=NULL)
{
if(strcmp(p->data.name,a)==0)
break;
p=p->pNext;
}
if(p==NULL)
printf("你查找的昵称不存在!\n");
else
{
printf("这个好友的信息是:\n");
printf("好友分组是:");
puts(p->data.group);
printf("好友昵称是:");
puts(p->data.name);
printf("好友的年龄是:");
puts(p->data.age);
printf("好友的性别是:");
puts(p->data.sex);
printf("好友的签名是:");
puts(p->data.qianming);
printf("好友的备注名是:");
puts(p->data.beizhu);
printf("好友的所在地是:%s%s%s\n",p->data.diqu.country,p->data.diqu.province,p->data.diqu.city);
}
}
if(m==2)
{
char a[N];
PME p=head->pNext;
fflush(stdin);
printf("请输入你想要查找的备选名是:");
gets(a);
system("cls");
while(p!=NULL)
{
if(strcmp(p->data.beizhu,a)==0)
break;
p=p->pNext;
}
if(p==NULL)
printf("你查找的昵称不存在!\n");
else
{
printf("这个好友的信息是:\n");
printf("好友分组是:");
puts(p->data.group);
printf("好友昵称是:");
puts(p->data.name);
printf("好友的年龄是:");
puts(p->data.age);
printf("好友的性别是:");
puts(p->data.sex);
printf("好友的签名是:");
puts(p->data.qianming);
printf("好友的备注名是:");
puts(p->data.beizhu);
printf("好友的所在地是:%s%s%s\n",p->data.diqu.country,p->data.diqu.province,p->data.diqu.city);
}
}
}
if(n==2)
{
int m;
printf("1.按照好友性别查找\n2.按照好友所在地查找\n3.按照好友分组查找\n");
printf("请选择你想要使用的查找方式:");
scanf("%d",&m);
system("cls");
if(m==1)
{
char a[N];
PME p=head->pNext;
fflush(stdin);
printf("请输入你想要查找好友的性别:");
gets(a);
system("cls");
for(i=0;i<len;i++)
{
if(strcmp(p->data.sex,a)==0)
{
printf("这个好友的信息可能是:\n");
printf("好友分组是:");
puts(p->data.group);
printf("好友昵称是:");
puts(p->data.name);
printf("好友的年龄是:");
puts(p->data.age);
printf("好友的性别是:");
puts(p->data.sex);
printf("好友的签名是:");
puts(p->data.qianming);
printf("好友的备注名是:");
puts(p->data.beizhu);
printf("好友的所在地是:%s%s%s\n",p->data.diqu.country,p->data.diqu.province,p->data.diqu.city);
}
p=p->pNext;
}
}
if(m==2)
{
struct shengfen a;
PME p=head->pNext;
fflush(stdin);
printf("请输入你想要查找好友的所在地:\n");
scanf("%s%s%s",a.country,a.province,a.city);
system("cls");
for(i=0;i<len;i++)
{
if(strcmp(p->data.diqu.province,a.province)==0||strcmp(p->data.diqu.city,a.city)==0)
{
printf("这个好友的信息可能是:\n");
printf("好友分组是:");
puts(p->data.group);
printf("好友昵称是:");
puts(p->data.name);
printf("好友的年龄是:");
puts(p->data.age);
printf("好友的性别是:");
puts(p->data.sex);
printf("好友的签名是:");
puts(p->data.qianming);
printf("好友的备注名是:");
puts(p->data.beizhu);
printf("好友的所在地是:%s%s%s\n",p->data.diqu.country,p->data.diqu.province,p->data.diqu.city);
}
p=p->pNext;
}
}
if(m==3)
{
char a[N];
PME p=head->pNext;
fflush(stdin);
printf("请输入你想要查找好友所在的分组:");
gets(a);
system("cls");
for(i=0;i<len;i++)
{
if(strcmp(p->data.group,a)==0)
{
printf("这个好友的信息可能是:\n");
printf("好友分组是:");
puts(p->data.group);
printf("好友昵称是:");
puts(p->data.name);
printf("好友的年龄是:");
puts(p->data.age);
printf("好友的性别是:");
puts(p->data.sex);
printf("好友的签名是:");
puts(p->data.qianming);
printf("好友的备注名是:");
puts(p->data.beizhu);
printf("好友的所在地是:%s%s%s\n",p->data.diqu.country,p->data.diqu.province,p->data.diqu.city);
}
p=p->pNext;
}
}
}
}
PME sort_list(PME head)
{
int i,j,n,len=0;
PME k=head->pNext;
while(k!=NULL)
{
k=k->pNext;
len++;
}
printf("1.按照年龄排序\n2.按照好友分组排序\n3.按照好友昵称排序\n");
printf("请选择排序方式:");
scanf("%d",&n);
system("cls");
PME p,q,t;
t=(PME)malloc(sizeof(ME));
if(t==NULL)
{
printf("分配失败,程序中止");
exit(-1);
}
if(n==1)
{
for(i=0,p=head->pNext;i<len-1;i++,p=p->pNext)
for(j=i+1,q=p->pNext;j<len;j++,q=q->pNext)
{
if(strcmp(p->data.age,q->data.age)>0)
{
t->data=p->data;
p->data=q->data;
q->data=t->data;
}
}
}
if(n==2)
{
for(i=0,p=head->pNext;i<len-1;i++,p=p->pNext)
for(j=i+1,q=p->pNext;j<len;j++,q=q->pNext)
{
if(strcmp(p->data.group,q->data.group)>0)
{
t->data=p->data;
p->data=q->data;
q->data=t->data;
}
}
}
if(n==3)
{
for(i=0,p=head->pNext;i<len-1;i++,p=p->pNext)
for(j=i+1,q=p->pNext;j<len;j++,q=q->pNext)
{
if(strcmp(p->data.name,q->data.name)>0)
{
t->data=p->data;
p->data=q->data;
q->data=t->data;
}
}
}
return head;
}
int main(void)
{
int n,m;
char a[N],b[N];
FILE * fp;
PME head=NULL;
xinxi yonghu;
pXinxi head1=NULL;
printf("欢迎来到QQ!\n");
printf("如果有账号,请输入1直接进入登陆界面,如果没有账号,请输入2进入注册界面,输入3关闭并退出:");
scanf("%d",&n);
system("cls");
if(n==1)
{
fp=fopen("D:/keshe/用户的账号信息.txt","r");
fseek(fp,47,0);
if(fp==NULL)
{
printf("文件打开失败!\n按任意键退出!");
getch();
exit(1);
}
printf("用户名:");
fflush(stdin);
gets(a);
fscanf(fp,"%s",yonghu.yonghuming);
if(strcmp(a,yonghu.yonghuming)==0)
printf("用户名正确!\n");
else
printf("不存在此用户\n");
printf("密码:");
gets(b);
fseek(fp,62,0);
fscanf(fp,"%s",yonghu.mask);
if(strcmp(a,yonghu.mask)==0)
{
printf("密码正确!\n");
printf("登陆成功!");
}
else
printf("密码错误\n");
fflush(stdin);
gets(b);
fclose(fp);
system("cls");
}
if(n==2)
{
fp=fopen("G:/keshe/用户的账号信息.txt","a+");
if(fp==NULL)
{
printf("文件打开失败!\n按任意键退出!");
getch();
exit(1);
}
fflush(stdin);
printf("昵称:");
gets(yonghu.name);
fflush(stdin);
printf("用户名:");
gets(yonghu.yonghuming);
fflush(stdin);
printf("密码:");
gets(yonghu.mask);
fflush(stdin);
printf("性别:");
gets(yonghu.sex);
fflush(stdin);
printf("生日:");
scanf("%d-%d-%d",&yonghu.yong.year,&yonghu.yong.month,&yonghu.yong.day);
fflush(stdin);
printf("所在地:");
scanf("%s%s%s",&yonghu.xinxi.country,&yonghu.xinxi.province,&yonghu.xinxi.city);
fprintf(fp,"用户的昵称是:%s 用户的性别是:%s 用户的用户名是:%s 用户的密码是:%s ",yonghu.name,yonghu.sex,yonghu.yonghuming,yonghu.mask);
fprintf(fp,"用户的出生日期是:%d-%d-%d ",yonghu.yong.year,yonghu.yong.month,yonghu.yong.day);
fprintf(fp,"用户的所在地是:%s%s%s",yonghu.xinxi.country,yonghu.xinxi.province,yonghu.xinxi.city);
fclose(fp);
system("cls");
}
if(n==3)
return 0;
for(;;)
{
printf("1.新建分组\n2.新建好友列表\n3.添加好友\n4.删除好友\n5.查找好友\n6.排序\n7.退出\n");
printf("请输入你想要执行的功能:");
scanf("%d",&m);
switch(m)
{
case 1:system("cls");head1=make_group();printf("按任意键继续\n");getch();system("cls");break;
case 2:system("cls");head=make_list();printf("按任意键继续\n");getch();system("cls");break;
case 3:system("cls");head=insert_list(head);trave_list(head);printf("按任意键继续\n");getch();system("cls");break;
case 4:system("cls");head=delete_list(head);trave_list(head);printf("按任意键继续\n");getch();system("cls");break;
case 5:system("cls");check_list(head);printf("按任意键继续\n");getch();system("cls");break;
case 6:system("cls");head=sort_list(head);trave_list(head);printf("按任意键继续\n");getch();system("cls");break;
case 7:return 0;
}
}
return 0;
}