问题:
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。
跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。
若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
现要求写一算法模拟上述舞伴配对问题
程序功能:
能够使男女依次组合,如若男女相等配对完成,否则输出等待下一轮的男士或者女士。
算法:
学习队列于是采用链队列的数据结构存储数据,结构很好设计,但是其中涉及的一些其他的问题,比如自己添加的输入0结束;
总结:
1.当使用指向结构体的指针时候,不要忘记对它进行初始化。
是指向一个已经存在的结构体也好 ,还是指向一个new动态分配的内存也好 ; 都必须要对该指针初始化,千万不要上来就用,否则会造成引用出错。
2.其次还要注意的就是要注意野指针,本程序就因为提前释放了后边还在引用,导致运行出错,造成了调试的困难。为了尽量避免出现野指针要注意释放后要置空NULL;
3.最后本程序是自己根据c语言数据结构的教材,自己用c++实现的,个人感觉程序很长,啰嗦不精!欢迎各位指导批评,给出建议!
#include<iostream>
using namespace std;
#define NULL 0
//////////////////////////////定义结构类型//////////////////
typedef struct Men_Node//男士队列类型
{
char name[10];
struct Men_Node *next;
}Men_Node;
typedef struct Women_Node//女士队列类型
{
char name[10];
struct Women_Node *next;
}Women_Node;
typedef struct//指向男士的头尾指针类型
{
Men_Node *Head , *Tail;
}Men_Q;
typedef struct//指向女士的头尾指针类型
{
Women_Node *Head , *Tail;
}Women_Q;
//////////////////////////////类///////////////////////
class Queue
{
public:
Queue();//构造函数
Men_Node *create_men();//创建队列
Women_Node *create_women();
int Empty(Men_Q *Qm);//判断队空与否
int Empty(Women_Q *Qw);
void In_Queue(Men_Q *Qm);//入队操作
void In_Queue(Women_Q *Qw);
void Out_Queue(Men_Q *Qm , char ch[]);//出队操作
void Out_Queue(Women_Q *Qw , char ch[]);
int Over_manname(Men_Q *Qm);//如果读取到0结束,返回1结束输入
int Over_womenname(Women_Q *Qw);//如果读取到0结束,返回1结束输入
char *Get_Failname(Men_Q *Qm);//取得未配对的第一个人
char *Get_Failname(Women_Q *Qw);
void show(Men_Q *Qm ,Women_Q *Qw );//显示输出结果
private:
Men_Q *QM ;//指向男士结构体的指针
Women_Q *QW ;//指向女士结构体的指针
Men_Node *Mflag;//指向男士节点的指针
Women_Node *Wflag;//指向女士节点的指针
char manname[10] ;//判断男士是否输入0
char womenname[10];//判断女士是否输入0
};
//////////////////////////////构造函数函数///////////////////////
Queue::Queue()
{
Mflag = NULL;//标记男士最后一个存储0节点的上一个节点
QM = new Men_Q;
Wflag = NULL ;///标记女士最后一个存储0节点的上一个节点
QW = new Women_Q ;
char name[10] = {'0'};//临时创建只用于下面的操作
strcpy(manname , name);
strcpy(womenname , name);
}
//////////////////////////////初始化函数///////////////////////
Men_Node *Queue::create_men()//初始化男士队列
{
QM->Head = QM->Tail = new Men_Node;
QM->Head->next = NULL;
return QM->Head;
}
Women_Node *Queue::create_women()//初始化女士队列
{
QW->Head = QW->Tail = new Women_Node;
QW->Head->next = NULL;
return QW->Head;
}
//////////////////////////////判断是否队空///////////////////////
int Queue::Empty(Men_Q *Qm)//男士队空
{
if (strcmp(Qm->Head->next->name ,manname) == 0)
{
return 1;
}
else
{
return 0;
}
}
int Queue::Empty(Women_Q *Qw)//女士队空
{
if (strcmp(Qw->Head->next->name ,womenname) == 0)
{
return 1;
}
else
{
return 0;
}
}
//////////////////////////////入队操作///////////////////////
void Queue::In_Queue(Men_Q *Qm)//男士入队
{
Mflag = Qm->Tail;//标记存储0节点的上一个节点
Men_Node *p = new Men_Node;
cin>>p->name;
Qm->Tail->next= p;
Qm->Tail = p;
p->next = NULL;
}
void Queue::In_Queue(Women_Q *Qw)//女士入队
{
Wflag = Qw->Tail;//标记存储0节点的上一个节点
Women_Node *p = new Women_Node;
cin>>p->name;
Qw->Tail->next = p;
Qw->Tail = p;
p->next = NULL;
}
//////////////////////////////出队操作///////////////////////
void Queue::Out_Queue(Men_Q *Qm , char ch[])//男士出队
{
Men_Node *p = Qm->Head->next;
strcpy(ch , p->name);
Qm->Head->next = p->next;
delete p;
}
void Queue::Out_Queue(Women_Q *Qw , char ch[])//女士出队
{
Women_Node *p = Qw->Head->next;
strcpy(ch , p->name);
Qw->Head->next = p->next;
delete p;
}
//////////////////////////////如果读取到0结束输入,返回1///////////////////////
int Queue::Over_manname(Men_Q *Qm)//男士队列
{
int i = 1;
i = strcmp(manname , Qm->Tail->name);
if (i == 0)
return 1;//存储的最后一个节点字符串为"0"结束(按0结束)
else
return 0;//
}
int Queue::Over_womenname(Women_Q *Qw)//女士队列
{
int i = 1;
i = strcmp(womenname , Qw->Tail->name);
if (i == 0)
return 1;//存储的最后一个节点字符串为"0"结束(按0结束)
else
return 0;//
}
//////////////////////////////取得未配对的第一人///////////////////////
char *Queue::Get_Failname(Men_Q *Qm)//取得男士未配对的第一人
{
return Qm->Head->next->name;
}
char *Queue::Get_Failname(Women_Q *Qw)//取得女士未配对的第一人
{
return Qw->Head->next->name;
}
//////////////////////////////显示输出结果///////////////////////
void Queue::show(Men_Q *Qm ,Women_Q *Qw )
{
cout<<endl;
if (Empty(Qm) == 1 && Empty(Qw) == 1)//配对完成
{
cout<<"配对完成"<<endl;
}
else if (Empty(Qw) == 1)//女士出队完成,输出下一次出现的第一个男士
{
cout<<"女士配对完,剩余男士!!!"<<endl;
cout<<"第二轮出场的第一个男士为:"<<Get_Failname(Qm)<<endl;
}
else //男士出队完成,输出下次出现的第一个女士
{
cout<<"男士配对完,剩余女士!!!"<<endl;
cout<<"第二轮出场的第一个女士为:"<<Get_Failname(Qw)<<endl;
}
}
//////////////////////////////主函数///////////////////////
int main()
{
Queue m;//Queue m(Men_Q *Qm , Women_Q *Qw);这种形式是m函数重定义返回类型为Queue;
Men_Q *Qm = new Men_Q ;//指向男士的指针(包含指向头尾节点)
Women_Q *Qw = new Women_Q;//指向女士的指针(包含指向头尾节点)
Qm->Head = Qm->Tail = m.create_men();
Qw->Head = Qw->Tail = m.create_women();
int flag = 0;
cout<<"提示:按0结束输入"<<endl<<"先输入男士队列:"<<endl;
while (1)//男士入队
{
m.In_Queue(Qm);
flag = m.Over_manname(Qm);
if (flag == 1)
break;
}
cout<<endl;
cout<<"下面输入女士队列"<<endl;
while (1)//女士入队
{
m.In_Queue(Qw);
flag = m.Over_womenname(Qw);
if (flag == 1)
{
break;
}
}
char wanName[10] , womenName[10] , temp[10] = {'0'};
int count = 1;
cout<<endl<<"舞会的舞伴搭配序列为:"<<endl<<endl;
while (m.Empty(Qm) == 0 && m.Empty(Qw) == 0)//男女出队
{
m.Out_Queue(Qm , wanName);
m.Out_Queue(Qw , womenName);
if (strcmp(wanName , temp) == 0 || strcmp(womenName , temp) == 0)//当出现其中一个队伍出队完毕结束;
break;
cout<<"第"<<count<<"组:"<<wanName<<" "<<womenName<<endl;
count++;
}
m.show(Qm ,Qw);//输出结果
cout<<endl<<endl;
system ("pause");
}