舞伴问题(链队)

问题:
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。
跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。
若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
现要求写一算法模拟上述舞伴配对问题
程序功能:
能够使男女依次组合,如若男女相等配对完成,否则输出等待下一轮的男士或者女士。
算法:
学习队列于是采用链队列的数据结构存储数据,结构很好设计,但是其中涉及的一些其他的问题,比如自己添加的输入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");
}

这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值