学习中碰到的一个程序,写完执行的时候出错了,麻烦高手求解,感谢!!
代码如下:
程序代码:/* Program 11.6 Basics of a family tree */
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
struct Family *get_person(void); /* Prototype for input function */
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 strcture declaration */
{
struct Date dob;
char name[20];
char father[20];
char mother[20];
struct Family *next;
struct Family *previous;
struct Family *p_to_pa;
struct Family *p_to_ma;
};
int main(void)
{
struct Family *first = NULL;
struct Family *current = NULL;
struct Family *last = NULL;
char more = '\0';
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;
last = current;
}
else
{
last -> next = current;
current -> previous = last;
last = current;
}
}
/* *************************** */
current = first;
while( current -> next != NULL)
{
int parents = 0;
last = current -> next;
while(last != NULL)
{
if(related(current, last))
if(++parents == 2)
break;
last = last -> next;
}
current = current -> next;
}
/* Output Family data in correct order */
current = first;
while (current != NULL)
{
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 birthdate 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;
}
/* Now free the memory */
current = first;
while(current -> next != NULL )
{
last = current;
current = current ->next;
free(last);
}
return 0;
}
/* Function to input data on Family menbers */
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);
printf("\nWho is %s's mother?", temp -> name);
scanf("%s", temp -> mother);
temp -> next = temp -> previous = NULL;
return temp;
};
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);
}
附件里是输入和执行错误的截图:








