简易QQ通讯录

一、实验目的及实验环境

 

 

实验目的:熟练运用并且掌握结构体的各项操作,并将结构体与链表结合在一起,练习链表的创建、插入、删除、遍历、查找、排序等各项操作,练习用文件来存储数据和读取数据。

实验环境: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值