1. 舞伴问题(包含菜单) C语言数据结构

  1. 舞伴问题
    功能:
    假设在周末舞会上,男士和女士进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。
    功能:
  2. 先建立一个所有到达现场的舞者(不分男女)的队列,并依次进队;
  3. 将上述队列中的来宾按性别分别安排进入男队或女队
  4. 分别从男队和女队出队队首元素并配对输出相应舞伴信息;
  5. 将还有客人等待的队列的队首客人输出(名称)。
  6. 设计至少4项相关信息查询或统计功能(查询某人是否在舞会现场、查询他是否正在跳舞、统计到会人数、统计男女人数、统计正在等待的人数等)
    要求:
  7. 用循环队列组织数据,实现程序功能。
  8. 用链式结构的单循环队列组织数据,实现程序功能。

回答:这边给出半成品了,写的不好,仅供参考(采用单链表编写,实现循环链表功能,用单链表去实现,效率会降低许多的感觉)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define ERROR -1

typedef struct Dancer {
    char name[20];
    int sex;                   //性别,1表示男,2表示女
    int status;                //状态,1表示在跳舞,2表示在等待
    struct Dancer* next;
}Dancer;

Dancer* Male_init_head() {
    Dancer* head = (Dancer*)malloc(sizeof(Dancer));

    strcpy(head->name, "");
    head->sex = 1;
    head->next = NULL;

    return head;
}

Dancer* Female_init_head() {
    Dancer* head = (Dancer*)malloc(sizeof(Dancer));

    strcpy(head->name, "");
    head->sex = 2;
    head->next = NULL;

    return head;
}

Dancer* Init_head() {
    Dancer* head = (Dancer*)malloc(sizeof(Dancer));

    strcpy(head->name, "");
    head->sex = 2;
    head->next = NULL;

    return head;
}

/*
这里采用尾插法,符合先来的排在前面的规则
*/
void Init_list(Dancer* head, int num) {
    Dancer* current = head;
    int i = 0;

    while (i < num) {
        Dancer* new_node = (Dancer*)malloc(sizeof(Dancer));

        scanf("%s", new_node->name);
        scanf("%d", &new_node->sex);
        new_node->status = 2;
        new_node->next = NULL;

        while (current->next)    
            current = current->next;
        current->next = new_node;
        i++;        
    }
}

/*
插入新节点,采用尾插法
*/
void Insert_list(Dancer* head, Dancer* new_node) {
    Dancer* current = head;

    while (current->next)
        current = current->next;
    current->next = new_node;
}

void Divide_list(Dancer* head, Dancer* Male_head, Dancer* Female_head) {
    Dancer* current = head->next;

    while (current)
    {
        if (current->sex == 1)
            Insert_list(Male_head, current);
        if (current->sex == 2)
            Insert_list(Female_head, current);

        current = current->next;
    }
}

/*
判断某人是否参加了party,参加了则返回1,没参加返回0
*/
int Is_in_party(Dancer* head, char* name) {
    Dancer* current = head->next;

    while (current)
    {
        if (strcmp(current->name, name) == 0)
            return 1;
        current = current->next;
    }
    return 0;
}

/*
查询某人是否在跳舞,若该人不存在,返回错误代码ERROR,在跳舞返回1,在等待返回0
*/
int Is_dancing(Dancer* head, char* name) {
    Dancer* current = head->next;

    while (current)
    {
        if (strcmp(current->name, name) == 0) {
            if (current->status == 1)
                return 1;
            if (current->status == 2)
                return 0;
        }            
        current = current->next;
    }
    return ERROR;
}

int Attend_num(Dancer* head) {
    Dancer* current = head->next;
    int count = 0;

    while (current)
    {
        count++;
        current = current->next;
    }
    return count;
}

int Get_Male_num(Dancer* Male_head) {
    Dancer* current = Male_head->next;
    int count = 0;

    while (current)
    {
        count++;
        current = current->next;
    }
    return count;
}

int Get_Female_num(Dancer* Female_head) {
    Dancer* current = Female_head->next;
    int count = 0;

    while (current)
    {
        count++;
        current = current->next;
    }
    return count;
}

int Get_waitting_num(Dancer* Male_head, Dancer* Female_head) {
    Dancer* current = Male_head->next;
    int count = 0;

    while (current)
    {
        if(current->status==2)
            count++;        
        current = current->next;
    }

    current = Female_head->next;
    while (current)
    {
        if (current->status == 2)
            count++;
        current = current->next;
    }
    return count;
}

/*
采用循环队列是很好的思想,可以很好的分配每个人匹配的机会,但这边采用类似于操作系统中NFA的思想进行分配,代码可能会有点重复
这边其实对于曲子的分配会比较复杂,但不考虑曲子的时间之类的,默认一个单位时间后,匹配则结束,上一轮的就接在之前没匹配完的后面
很容易可以知道,对于数量少的一方,每一次都会匹配完,但也按照一般算法实施分配了
*/
void Match_dancer(Dancer* Male_head, Dancer* Female_head) {
    Dancer* male_current = Male_head->next;
    Dancer* female_current = Female_head->next;

    

}

/*
进行链表的测试
*/
void Print_list(Dancer* head) {
    Dancer* current = head->next;

    while (current)
    {
        printf("%s\t", current->name);
        printf("%d\t", current->sex);
        printf("%d", current->status);
        current = current->next;
        printf("\n");
    }
}

int main() {
    Dancer* head = Init_head();
    Dancer* Male_head = Male_init_head();
    Dancer* Female_head = Female_init_head();


    Init_list(head, 2);
    Print_list(head);
}