⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program11_06a.c

📁 [C语言入门经典(第4版)]整本书的源码!值得推荐!全部是最简单的源码!
💻 C
字号:
/* Program 11.6A An extended family tree */
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

/* Function prototypes */
struct Family *get_person(void);
bool set_ancestry(struct Family *pmember1, struct Family *pmember2);
bool related (struct Family *pmember1, struct Family *pmember2);

struct Date
{
  int day;
   int month;
  int year;
};

struct Family                          /* Family structure declaration  */
{
  struct Date dob;
  char name[20];
  char father[20];
  char mother[20];
  struct Family *next;                 /* Pointer to next structure     */
  struct Family *previous;             /* Pointer to previous structure */
  struct Family *p_to_pa;              /* Pointer to father structure   */
  struct Family *p_to_ma;              /* Pointer to mother structure   */
};


int main(void)
{
  struct Family *first = NULL;        /* Pointer to first person      */
  struct Family *current = NULL;      /* Pointer to current person    */
  struct Family *last = NULL;         /* Pointer to previous person   */
  char more = '\0';                   /* Test value for ending input  */

  for( ; ; )
  {
    printf("\nDo you want to enter details of a%s person (Y or N)? ",
                                        first != NULL ? "nother" : "" );
    scanf(" %c", &more);
    if(tolower(more) == 'n')
      break;

    current = get_person();

    if(first == NULL)
    {
      first = current;                /* Set pointer to first Family  */
      last = current;                 /* Remember for next iteration  */
    }
    else
    {
      last->next = current;   /* Set next address for previous Family */
      current->previous = last;   /* Set previous address for current */
      last = current;             /* Remember for next iteration      */
    }
  }

	  current = first;

  while(current->next != NULL) /* Check for relation for each person in */
  {                            /* the list up to second to last         */
    int parents = 0;        /* Declare parent count local to this block */
    last = current->next;   /* Get the pointer to the next              */

    while(last != NULL)     /* This loop tests current person           */
    {                       /* against all the remainder in the list    */
      if(related(current, last))           /* Found a parent ?          */
        if(++parents == 2)     /* Yes, update count and check it        */
          break;               /* Exit inner loop if both parents found */

      last = last->next;       /* Get the address of the next           */
    }
    current = current->next;   /* Next in the list to check             */
  }

  /* Now tell them what we know */

  /* Output Family data in correct order */
  current = first;

  while (current != NULL)             /* Output Family data in correct order */
  {
    printf("\n%s was born %d/%d/%d, and has %s and %s as parents.",
                  current->name, current->dob.day, current->dob.month,
               current->dob. year, current->father,  current->mother);
    if(current->p_to_pa != NULL )
      printf("\n\t%s's birth date is %d/%d/%d  ",
                current->father, current->p_to_pa->dob.day,
                               current->p_to_pa->dob.month,
                               current->p_to_pa->dob.year);
    if(current->p_to_ma != NULL)
      printf("and %s's birth date is %d/%d/%d.\n  ",
                current->mother, current->p_to_ma->dob.day,
                               current->p_to_ma->dob.month,
                               current->p_to_ma->dob.year);

    current = current->next;          /* current points to next in list      */
  }

  /* Now free the memory */
  current = first;
  while(current != NULL)
  {
    last = current;     /* Save pointer to enable memory to be freed */
    current = current->next; /* current points to next in list       */
    free(last);         /* Free memory for last                      */
  }

  return 0;
}

/*   Function to input data on Family members   */
struct Family *get_person(void)
{
  struct Family *temp;          /* Define temporary structure pointer */

  /* Allocate memory for a structure */
  temp = (struct Family*) malloc(sizeof(struct Family));

  printf("\nEnter the name of the person: ");
  scanf("%s", temp -> name );         /* Read the Family's name       */

  printf("\nEnter %s's date of birth (day month year); ", temp->name);
  scanf("%d %d %d", &temp->dob.day, &temp->dob.month, &temp->dob.year);

  printf("\nWho is %s's father? ", temp->name );
  scanf("%s", temp->father );         /* Get the father's name        */

  printf("\nWho is %s's mother? ", temp->name );
  scanf("%s", temp -> mother );       /* Get the mother's name        */

  temp->next = temp->previous = NULL; /* Set pointers to NULL         */

  temp->p_to_pa = temp->p_to_ma = NULL;       /* Set pointers to NULL  */
  return temp;                   /* Return address of Family structure */
}

bool set_ancestry(struct Family *pmember1, struct Family *pmember2)
{
  if(strcmp(pmember1->father, pmember2->name) == 0)
  {
    pmember1->p_to_pa = pmember2;
    return true;
  }

  if( strcmp(pmember1->mother, pmember2->name) == 0)
  {
    pmember1->p_to_ma = pmember2;
    return true;
  }
  else
    return false;
}

/* Fill in pointers for mother or father relationships */
bool related (struct Family *pmember1, struct Family *pmember2)
{
  return set_ancestry(pmember1, pmember2) ||
                           set_ancestry(pmember2, pmember1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -