#include<stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define MAX 200
#define MAXNAME 20
typedef struct LNode
{
int num;//编号
charname[MAXNAME];
char sex; //性别,'F'表示女性,'M'表示男性
struct LNode*next;
}LNode, *LinkList;
void sleep( clock_t wait ) //延迟函数
{
clock_t goal;
goal = wait + clock();
while( goal > clock() ) ;
}
void CreateList_L(LinkList &L1,LinkList &L2,int&m,int &n)
{
printf("\n\n\t\t\t\t^o^参加舞会学生名单^o^\n");
printf("\n\n\t\t请输入女生数量:");
scanf("%d",&m);
while(m<1)
{
printf("\n\n\t\t\t\tERROR\n\n\t\t\t请重新输入女生数量");
sleep(1000);//void sleep( clock_t wait ) 放在前
system("CLS");
printf("\n\n\t\t\t\t^o^参加舞会学生名单^o^\n");
printf("\n\n\t\t请输入女生数量:");
scanf("%d",&m);
}
printf("\t\t请输入男生数量:");
scanf("%d",&n);
while(n<1)
{
printf("\n\n\t\t\t\tERROR\n\n\t\t\t请重新输入男生数量");
sleep(1000);
system("CLS");
printf("\n\n\t\t\t\t^o^参加舞会学生名单^o^\n");
printf("\n\n\t\t请输入女生数量:%d",m);
printf("\n\t\t请输入男生数量:");
scanf("%d",&n);
}
inti,choice,numw,numn,b[MAX],j;
numw=numn=0;
chara[MAX][MAXNAME];
LinkListp1,p2,q;//,,不,一,样的
p1=p2=L1=L2=NULL;
printf(" \t\t\t ************** ");
printf("\n \t\t\t *欢迎参加舞会*\n");
printf("\t \t\t ************** \n");
printf("\t\t请输入学生的情况\n");
for(i=0;i<(m+n)&&i<MAX;i++)
{
if(i>=5)
{
sleep(500);
system("CLS");
printf("\n\n\t\t\t\t^o^参加舞会学生名单^o^\n");
printf("\n\n\t\t请输入女生数量:%d",m);
printf("\n\t\t请输入男生数量:%d\n",n);
printf(" \t\t\t ************** ");
printf("\n \t\t\t *欢迎参加舞会*\n");
printf("\t \t\t ************** \n");
printf("\t\t请输入学生的情况\n");
for(j=i-4;j<i;j++)
{printf("\t\t第%d个人姓名:%s\n",j+1,a[j]);
printf("\t\t 性别<1 girl,2 boy>:%d\n",b[j]);
}
}
printf("\t\t第%d个人姓名:",i+1);
scanf("%s",a[i]);
printf("\t\t 性别<1 girl,2 boy>:");
scanf("%d",&choice);///////////////scanf("sex:%d",&choice);错错
b[i]=choice;
q=(LinkList)malloc(sizeof(LNode));
if(q==NULL)exit(-1);
strcpy(q->name,a[i]);
if(choice==1)
{numw++;
q->num=numw;
if(L1==NULL)
{
L1=q;
p1=q;
}//不带头结点
else
{
p1->next=q;
p1=q;
}
p1->next=L1;//循环
}
else
{numn++;
q->num=numn;
if(L2==NULL){L2=q;p2=q;}//不带头结点
else{p2->next=q;p2=q;}
p2->next=L2;//循环
}
}
}
void Print1(LinkList L,int m)
{
LinkList p;
int i;
p=L;
for(i=1;i<=m;i++)
{
printf("%s",p->name);
printf("%3c",' ');
p=p->next;
}
}
void Print2(LinkList &p,int m,int n)
{
int i;
LinkList q;
for(i=1;i<=m;i++)
{printf("%s",p->name);
printf("%3c",' ');
p=p->next;
}
q=p;
for(;i<=n;i++)
{printf("%s",q->name);
printf("%3c",' ');
q=q->next;
}
}
void Match(LinkList L1,LinkList L2,int m,int n)
{
int k,i,j;
LinkList p;
printf("\n\n\n\n\t\t\t\t ^o^每曲配对情况^o^");
printf("\n\n\t\t请输入歌曲的编号:< ");
scanf("%d",&k);
printf(" >");
while(k<=0)
{
printf("\n\t\t\tERROR!!!\n\t\t请重新输入歌曲的编号 ");
sleep(1000);
system("CLS");
printf("\n\n\n\n\t\t\t\t ^o^每曲配对情况^o^");
printf("\n\n\t\t请输入歌曲的编号:< ");
scanf("%d",&k);
printf(" >");
}
if(m<n)
{
p=L2;
for(i=1;i<=k;i++)
{
system("CLS");
printf("\n\n\n\n\t\t\t\t ^o^每曲配对情况^o^");
printf("\n\n\t\t请输入曲子编号:< %d >",k);
printf("\n\n\n\n\n\t\t\t\t第<%2d>曲配对情况\n\n\n",i);
printf("\t\t");
Print1(L1,m);
printf("\n\t\t");
for(j=1;j<=m;j++) printf(" | ");
printf("\n\t\t");
Print2(p,m,n);
printf("\n\n");
sleep(1000);
}
}
else
{
p=L1;
for(i=1;i<=k;i++)
{
system("CLS");
printf("\n\n\n\n\t\t\t\t ^o^每曲配对情况^o^");
printf("\n\n\t\t请输入曲子编号:< %d >",k);
printf("\n\n\n\n\n\t\t\t\t第<%2d>曲配对情况\n\n\n",i);
printf("\t\t");
Print2(p,n,m);
printf("\n\t\t");
for(j=1;j<=n;j++) printf(" | ");
printf("\n\t\t");
Print1(L2,n);
sleep(1000);
printf("\n\n");
}
}
}
void XXXXXX(LinkList L,int loc,LinkList &p)
{
int i;
if(loc==1) p=L;
else
{
p=L;
for(i=1;i<loc;i++)
{
p=p->next;
}
}
}
void XHEY(LinkList L1,LinkList L2,int m, int n)
{
intx,y,flag=1,k,loc1,loc2,last;
LinkListp1,p2,p11,p22;
while(flag!=2)
{system("CLS");
printf("\n\n\n\t\t\t\t^o^查找配对跳舞情况^o^\n\n");
printf("\n\t\t请输入你想知道的女生和男生的编号\n\t\t女生的编号:");
scanf("%d",&y);
while(y>m||y<1)
{
printf("\t\t\tERROR!!!\n\t\t请重新输入女生的编号");
sleep(1000);
system("CLS");
printf("\n\n\n\t\t\t\t^o^查找配对跳舞情况^o^\n");
printf("\n\t\t请输入你想知道的女生和男生的编号\n\t\t女生的编号:");
scanf("%d",&y);
}
printf("\t\t男生的编号:");
scanf("%d",&x);
while(x>n||x<1)
{
printf("\t\t\tERROR!!!\n\t\t请重新输入男生的编号");
sleep(1000);
system("CLS");
printf("\n\n\n\t\t\t\t^o^查找配对跳舞情况^o^\n");
printf("\n\t\t请输入你想知道的女生和男生的编号\n\t\t女生的编号:%d\n",y);
printf("\t\t男生的编号:");
scanf("%d",&x);
}
printf("\n\t\t歌曲的编号:");
scanf("%d",&k);
while(k<1)
{
printf("\t\t\tERROR!!!\n\t\t请重新输入歌曲的编号");
sleep(1000);
system("CLS");
printf("\n\n\n\t\t\t\t^o^查找配对跳舞情况^o^\n");
printf("\n\t\t请输入你想知道的女生和男生的编号\n\t\t女生的编号:%d\n",y);
printf("\t\t男生的编号:%d\n",x);
scanf("%d",&k);
}
printf("\n\n\n");
if(m<n)
{
last=((k-1)*m)%n;
loc1=(x-last+n)%n;
XXXXXX(L2,x,p1);
if(loc1>0&&loc1<=m)
{
XXXXXX(L1,loc1,p11);
}
elseprintf("\t\t在第<%4d>曲编号为<%4d>的男生( %s )没有舞伴\n\n",k,x,p1->name);
XXXXXX(L1,y,p2);
loc2=(last+y)%m;
XXXXXX(L2,loc2,p22);
if(loc2==x||loc1==y)
printf("\t\t编号为<%4d>的男生( %s )和编号为<%4d>的女生( %s )在第(%4d)首歌配对跳舞\n\n\n",x,p1->name,y,p2->name,k);
else
{
if(loc1>0&&loc1<=m)
printf("\t编号为<%4d>的男生( %s )在第(%4d)首歌和编号为<%4d>的女生( %s )配对跳舞\n\n",x,p1->name,k,y,p11->name);
printf("\t编号为<%4d>的女生( %s )在第(%4d)首歌和编号为<%4d>的男生( %s )配对跳舞\n\n",x,p2->name,k,y,p22->name);
}
}
else
{
last=((k-1)*n)%m;
loc1=(y-last+m)%m;
XXXXXX(L1,y,p1);
if(loc1>0&&loc1<=n)
{
XXXXXX(L1,loc1,p11);
}
elseprintf("\t\t在第<%4d>曲编号为<%4d>的女生( %s )没有舞伴\n\n",k,x,p1->name);
XXXXXX(L2,x,p2);
loc2=(last+x)%m;
XXXXXX(L1,loc2,p22);
if(loc2==y||loc1==x)
printf("\t\t编号为<%4d>的男生( %s )和编号为<%4d>的女生( %s )在第(%4d)首歌配对跳舞\n\n\n",x,p1->name,y,p2->name,k);
else
{
printf("\t编号为<%4d>的男生( %s )在第(%4d)首歌和编号为<%4d>的女生( %s )配对跳舞\n\n",x,p2->name,k,y,p22->name);
if(loc1>0&&loc1<=m)
printf("\t编号为<%4d>的女生( %s )在第(%4d)首歌和编号为<%4d>的男生( %s )配对跳舞\n\n",x,p1->name,k,y,p11->name);
}
}
printf("\n\n\t是否继续找配对情况<想1,不想2>:");
scanf("%d",&flag);
}
}
int EmptyL(LinkList L)
{
if(L==NULL)return 1;
else return 0;
}
void DestroyL(LinkList &L)
{
LinkList p;
if(!EmptyL(L))
{
p=L->next;
while(p!=L)
{
L->next=p->next;
free(p);
p=L->next;
}
free(L);
}
}
void JieMian()
{
for(inti=1;i<=50;i++)
{//system("color CF");/*设置背景/字体颜色,1为背景,7为前景,其值可随便设,系统默认为07*/
system("CLS");
printf("\n\n\n\n");
printf("\t\t\t ^o^学生搭配问题^o^ \n\n");
printf("\t\t\t╔*═*═*═*═*═*═*═*═*═*═*╗\n");
printf("\t\t\t║ ║\n");
printf("\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╚*═*═*═*═*═*═*═*═*═*═*╝\n");
printf("\n\n\t\t\t\t\t -----倪彗森数据结构课程设计\n");
printf("\t\t\t\t\t\t\t ----2017020170\n");
printf("\n\n 输入选择的项目:");
sleep(1);
}
}
void Jiemian2()
{
int i;
system("CLS");
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^");
sleep(200);
system("CLS");
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^欢");
sleep(200);
system("CLS");
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^欢迎");
sleep(200);
system("CLS");
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^欢迎下");
sleep(200);
system("CLS");
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^欢迎下次");
sleep(200);
system("CLS");
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^欢迎下次使^");
sleep(200);
system("CLS");
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^欢迎下次使用");
sleep(200);
system("CLS");
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^欢迎下次使用^o^");
sleep(200);
system("CLS");
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^欢迎下次使用^o^\n\n\t\t\t\t -----");
sleep(200);
system("CLS");
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^欢迎下次使用^o^\n\n\t\t\t\t -----GoodBye!");
sleep(200);
system("CLS");
for(i=1;i<=100;i++)
{
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^欢迎下次使用^o^\n\n\t\t\t\t -----GoodBye!");
sleep(5);
system("CLS");
}
printf("\n\n\n\n\n\n\n\n\t\t\t ^o^欢迎下次使用^o^\n\n\t\t\t\t -----GoodBye!");
}
int Quit()
{
getchar();
return 0;
}
int main()
{
intm,n,choice;//int m=n=choice=0;错错错
m=n=choice=0;
LinkListL1=NULL,L2=NULL; //L1=L2=NULL两个指针连等空错错
system("title学生搭配问题----倪彗森 "); //标题
while(choice!=4){
JieMian();
scanf("%d",&choice);
while((m==0||n==0)&&choice!=1&&choice!=4)//想清楚再写
{
printf("\t\t ERROR!!!\n\t\t (请先选择<1>输入学生名单或选择<4>退出)!");
sleep(3000);
system("CLS");
JieMian();
scanf("%d",&choice);
}
while(m!=0&&n!=0&&(choice<1||choice>4))
{
printf("\t\t ERROR!!!\n\t\t (请选择<1--4>)!");
sleep(3000);
system("CLS");
JieMian();
scanf("%d",&choice);
}
sleep(1000);
system("CLS");
switch(choice)
{
case 1:CreateList_L(L1,L2,m,n);
break; //输入名单
case2:system("color F");
Match(L1,L2,m,n);
sleep(5000);
break; //输出每曲配对情况
case3:system("color F");
XHEY(L1,L2,m,n);
break; //求满足条件的曲目
case4:system("color F");
system("CLS");
Jiemian2();
sleep(1000);
Quit();
break; //退出
}
}
DestroyL(L1);
DestroyL(L2);
printf("\n\n");
getchar();
return 0;
}