模拟社会关系

本实例有求设计一个模拟社会关系的数据结构,每个人的信息用结构表示,包含名字,性别和指向父亲,母亲,配偶,子女的指针(设只限两个子女)。要求编写以下函数:

  1. 增加一个新人的函数
  2. 建立人与人之间关系的函数,父子 、母子、配偶等
  3. 检查某两人之间是否是堂兄妹

该实例的主要目的是联系C中结构体的使用,下面是函数的实现:

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

#define CHILDREN 2

/**
 * 设计一个模拟社会关系的数据结构,每个人的信息用结构表示,包含名字,
 * 性别和指向父亲,母亲,配偶,子女的指针(设只限两个子女)。要求编写
 * 以下函数:(1)增加一个新人的函数 (2)建立人与人之间关系的函数,父子
 * 、母子、配偶等 (3)检查某两人之间是否是堂兄妹
 */

struct person{
    char *name; /* 人的姓名 */
    char sex;   /* 性别,‘M‘表示男性,‘F‘表示女性 */
    struct person *father; /* 该人的父亲 */
    struct person *mother; /* 该人的母亲 */
    struct person *mate;  /* 该人的配偶 */
    struct person *childs[CHILDREN]; /* 该人的孩子 */
};

/* [函数] 添加一个新人 */
struct person * newperson(char *name,char sex){
    struct person *p = (struct person *)malloc(sizeof(struct person));
    p->name = (char *)malloc(sizeof(name)+1);
    strcpy(p->name,name);

    p->sex = sex;

    p->father = NULL;
    p->mother = NULL;
    p->mate = NULL;

    int i = 0;
    for(i = 0;i < CHILDREN;i++){
        p->childs[i] = NULL;
    }

    return p;
};

/* [函数] 建立父子关系 */
void father_child(struct person *father,struct person *child){

    int index;

    for(index = 0;index < CHILDREN-1;index++) /* 寻找一个空缺的位置 */
        if(father->childs[index] == NULL)       /* 如果没有,则放到最后 */
            break;

    father->childs[index] = child;
    child->father = father;
}

/* [函数] 建立母子关系 */
void mother_child(struct person *mother,struct person *child){
    int index;

    for(index = 0;index < CHILDREN-1;index++) /* 寻找一个空缺的位置 */
        if(mother->childs[index] == NULL)       /* 如果没有,则放到最后 */
            break;

    mother->childs[index] = child;
    child->mother = mother;
}

/* [函数] mate 建立配偶关系 */
void mate(struct person *h,struct person *w){

    /* 建立配偶关系 */
    h->mate = w;
    w->mate = h;
}

/** [函数] 判断是否为堂兄妹
 *  params:
 *      struct person *p1:被判断的人
 *      struct person *p2:被判断的人
 * return:
 *      0:不是堂兄妹关系
 *      1:是堂兄妹关系
 */

 int brothersinlaw(struct person *p1,struct person *p2)
 {
     struct person *f1,*f2;

     if(p1 == NULL || p2 == NULL || p1 == p2) return 0;

     if(p1->sex == p2->sex) return 0; /* 不可能是堂兄妹*/

     f1 = p1->father;
     f2 = p2->father;

     if(f1 != NULL &&f1 == f1)
        return 0; /* 是兄妹,不是堂兄妹 */

     while(f1 != NULL && f2 != NULL && f1 != f2) /* 远亲 */
     {
        f1 = f1->father;
        f2 = f2->father;

        if(f1 != NULL && f2 != NULL && f1 == f2) return 1;
     }

     return 0;
 }

/* [函数] 输出人物关系 */
void print_relate(struct person *p)
{
    int index,i;

    if(p->name == NULL)
        return;

    if(p->sex == ‘M‘)
        printf("%s is male.\n",p->name);
    else
        printf("%s is female.\n",p->name);

    if(p->father != NULL)
        printf("%s‘s father is %s.\n",p->name,p->father->name);
    if(p->mother != NULL)
        printf("%s‘s mother is %s.\n",p->name,p->mother->name);

    if(p->mate != NULL)
        if(p->sex == ‘M‘)
            printf("His wife is %s.\n",p->mate->name);
        else
            printf("Her husband is %s.\n",p->mate->name);

    if(p->childs != NULL){
        for(index = 0;index <CHILDREN-1;index++)
            if(p->childs[index] == NULL)
                break;

        if(index > 0)
            printf(" Children are : ");
        for(i = 0;i < index;i++)
            printf("%s\t",p->childs[i]->name);
    }

    printf("\n");
}

int main()
{
    char *name[8]={"John","Kate","Maggie","Herry","Jason","Peter","Marry","Jenny"};
    char male=‘M‘,female=‘F‘;
    struct person *pGrandfather,*pFather1,*pFather2,*pMother1,*pMother2,*pSon,*pDaughter,*pCousin;

    pGrandfather = newperson(name[0],male);
    pFather1 = newperson(name[3],male);
    pFather2 = newperson(name[4],male);
    pMother1 = newperson(name[1],female);
    pMother2 = newperson(name[2],female);
    pSon = newperson(name[5],male);
    pDaughter = newperson(name[6],female);
    pCousin = newperson(name[7],female);
    father_child(pGrandfather,pFather1);
    father_child(pGrandfather,pFather2);
    father_child(pFather1,pSon);
    father_child(pFather1,pDaughter);
    father_child(pFather2,pCousin);
    mate(pFather1,pMother1);
    mate(pFather2,pMother2);
    mother_child(pMother1,pSon);
    mother_child(pMother1,pDaughter);
    mother_child(pMother2,pCousin);
    /* 输出各种关系 */
    print_relate(pGrandfather);
    print_relate(pFather1);
    print_relate(pFather2);
    print_relate(pMother1);
    print_relate(pMother2);
    print_relate(pSon);
    print_relate(pDaughter);
    print_relate(pCousin);

    if(!brothersinlaw(pDaughter,pCousin))
        printf("%s and %s are not brothers (sisters) in law.\n",pDaughter->name,pCousin->name);
    else
        printf("%s and %s are brothers (sisters) in law.\n",pDaughter->name,pCousin->name);
    if(!brothersinlaw(pSon,pCousin))
        printf("%s and %s are not brothers (sisters) in law.\n",pSon->name,pCousin->name);
    else
        printf("%s and %s are brothers (sisters) in law.\n",pSon->name,pCousin->name);
    if(!brothersinlaw(pSon,pDaughter))
        printf("%s and %s are not brothers (sisters) in law.\n",pSon->name,pDaughter->name);
    else
        printf("%s and %s are brothers (sisters) in law.\n",pSon->name,pDaughter->name);

    return 0;
}

总体来说,该实例并不难,并没有涉及到比较复杂的算法,其中稍微有些需要考虑的地方就是在判断两个人是否是堂兄妹的时候,用到了一点小方法,也不是很难。

下面我们来看一下程序的运行结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 20:10:59

模拟社会关系的相关文章

CentOS系统启动及内核大破坏模拟实验

讲过了centos的启动流程,此时是不是想来点破坏呢?那就尽情的玩耍吧,记得在实验之前拍个快照,万一哪个环节错误恢复不回来了呢,毕竟数据无价,话不多说,开始. 一.删除伪系统根.(ramdisk文件) (1)模拟误操作删除ramdisk文件. ①模拟误删除initramfs-3.10.0-514.el7.x86_64.img文件. ②为当前正在使用的内核重新制作ramdisk文件 格式为:mkinitrd /boot/initramfs-$(uname -r).img $(uname -r) (

NYOJ 2356: 哈希计划【模拟】

题目描述 众所周知,LLM的算法之所以菜,就是因为成天打游戏,最近LLM突然想玩<金庸群侠传X>,结果进去后各种被虐,LLM就开始研究这个游戏的代码,顺便还学会了一点点点点lua语言,然后就开始了伟大的改游戏代码之旅,然后LLM发现自己too young了,这个游戏把所有的文本都进行了哈希,如果自己改了代码或者剧情文本的话它哈希出来的值就会和原来的哈希值不一样......然后游戏就会打不开.....,现在LLM发现了文本的哈希函数,要求你写个程序,功能为: 输入一段字符串,输出一个哈希值 为了

爬虫——模拟点击动态页面

动态页面的模拟点击: 以斗鱼直播为例:http://www.douyu.com/directory/all 爬取每页的房间名.直播类型.主播名称.在线人数等数据,然后模拟点击下一页,继续爬取 #!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' """ 动态页面的模拟点击: 模拟点击斗鱼直播:http://www.douyu.com/directory/all 爬取每页房间名.直播类型.主播名称.在线人数

爬虫——网站模拟登录

使用Selenium与PhantomJS模拟登录豆瓣:https://www.douban.com/ #!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' """ 模拟登录豆瓣:https://www.douban.com/ """ from selenium import webdriver # 调用环境变量指定的PhantomJS浏览器创建浏览器对象,executable

python爬虫 模拟登陆校园网-初级

最近跟同学学习爬虫的时候看到网上有个帖子,好像是山大校园网不稳定,用py做了个模拟登陆很有趣,于是我走上了一条不归路..... 先上一张校园网截图 首先弄清一下模拟登陆的原理: 1:服务器判定浏览器登录使用浏览器标识,需要模拟登陆 2: 需要post账号,密码,以及学校id python走起,我用的2.7版本,用notepad++写的,绑定python可以直接运行 由于是模拟网页登陆,需要导入urllib urllib2 cookielib库,前两个有与网页直接的接口,cookielib就是用来

Android模拟位置信息

Android模拟位置程序,俗称GPS欺骗,只能修改采用GPS定位的软件. 手机定位方式目前有4种:基站定位,WIFI定位,GPS定位,AGPS定位 常见的修改手法: 1. 抓包欺骗法,抓包改包欺骗服务器端, 但是得专门去针对某款app,而且现在很多app数据包都加密了 2. hook java层经纬度获取函数, 这个方法以前可以用,现在不行了 3. hook native层经纬度获取函数 4. 使用允许模拟地址位置信息(不是很通用有版本限制) 为了修改微信朋友圈地理位置信息,为了好玩 试过了上

CSU 1112: 机器人的指令【模拟题】

1112: 机器人的指令 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1858  Solved: 682 [Submit][Status][Web Board] Description 数轴原点有一个机器人.该机器人将执行一系列指令,你的任务是预测所有指令执行完毕之后它的位置. ·LEFT:往左移动一个单位 ·RIGHT: 往右移动一个单位 ·SAME AS i: 和第i 条执行相同的动作.输入保证i 是一个正整数,且不超过之前执行指令数 In

Regionals 2015 &gt;&gt; Europe - Central &gt;&gt;7325 - Book Borders【模拟】

Europe - Central >>7325 - Book Borders 题目链接:7325 题目大意:给你一个字符串(含空格),每行x个字符,将单词排列进去,单词不能断开,问每行第一个单词的长度时多少,注意加空格 题目思路:直接模拟.第一个for遍历[a,b],第二个大致为n/a.复杂度大概为nlogn. 开两个数组,v[i]记录i这个位置所属的单词开始位置,e[v[i]]记录第i个位置所属的单词的结束位置. 然后每次判断这一行结尾,所在位置.如果在两个单词中间,则将该单词视为下一行开始

GNS 3模拟防火墙ASA

[模拟环境] 所使用的GNS3版本为0.7.4,如果低于这个版本,有些版本会缺少些选项无法支持. [ASA]     ASA有2种模式的编译文件,分别为单模式和多模式,可选择使用.我使用的是单模式,我试用过多模式,不太好用. [配置] 打开GNS3,编辑→首选项→Qemu→ASA:     添加单模式:Identifier name:asa802-k8-sing(自己填名称,但不能是中文)RAM:256(使用默认的256)Number of NICs:6(网卡数量,默认是6)NIC model: