源码如下,稍后上分析:
#include<stdio.h>
#include<stdlib.h>
#define SIZE 10
#define FREE -1
void get_mem(int [][SIZE],int ,int ***,int **,int **);
void release_mem(int **,int *,int *);
void stable_marriage(int man[][SIZE],int woman[][SIZE],int n,int m_eng[],int w_eng[])
{
int **rank;
int *waiting;
int *next;
int boy,girl,top;
get_mem(woman,n,&rank,&waiting,&next);
for(girl = 0;girl < n;girl++)
w_eng[girl] = -1;
for(top = n - 1;top >= 0;)
{
boy = waiting[top];
girl = man[boy][(next[boy]) ++];
printf("boy:%d girl:%d\n",boy,girl);
if(w_eng[girl] == FREE)
{
w_eng[girl] = boy;
m_eng[boy] = girl;
top--;
printf("succeed 1\n");
}
else if(rank[girl][boy] < rank[girl][w_eng[girl]])
{
waiting[top] = w_eng[girl];
w_eng[girl] = boy;
m_eng[boy] = girl;
printf("succeed 2\n");
}
else
printf("failed\n");
}
release_mem(rank,waiting,next);
}
void get_mem(int w[][SIZE],int n,int ***rank,int **wait,int **next)
{
int i,j;
*rank = (int **)malloc(sizeof(int *) * n);
*wait = (int *)malloc(sizeof(int) * n);
*next = (int *)malloc(sizeof(int) * n);
(*rank)[0] = (int *)malloc(sizeof(int) * n * n);
for(i = 1;i < n;i++)
(*rank)[i] = (*rank)[i - 1] + n;
for(i = 0;i < n;i++)
{
(*wait)[i] = n - 1 - i;
(*next)[i] = 0;
for(j = 0;j < n;j++)
(*rank)[i][w[i][j]] = j;
}
}
void release_mem(int **rank,int *wait,int *next)
{
free(rank[0]);
free(rank);
free(wait);
free(next);
}
int main()
{
int i;
int boy[][SIZE] = {{0},{2,4,1,3},{3,1,4,2},{2,3,1,4},{4,1,3,2}};
int girl[][SIZE] = {{0},{2,1,4,3},{4,3,1,2},{1,4,3,2},{2,1,4,3}};
int m_eng[5];
int w_eng[5];
stable_marriage(boy,girl,5,m_eng,w_eng);
for(i = 1;i <= 4;i++)
printf("%d\t%d\n",i,m_eng[i]);
return 0;
}
替换主函数中的boy和girl数组可以实现不同的男女组合。