69,336
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
struct Date
{
int day;
int month;
int year;
};
struct Family
{
struct Date dob;
char name[20];
char father[20];
char mother[20];
struct Family *next;
struct Family *previous;
struct Family *p_to_pa; //Pointer to father structure
struct Family *p_to_ma; //Pointer to mother structure
};
struct Family *get_person(void)
{
struct Family *temp;
temp=(struct Family *)malloc(sizeof(struct Family));
printf("\nEnter the name of the person: ");
scanf("%s",temp->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;
temp->p_to_pa=temp->p_to_ma=NULL;
return temp;
}
char set_ancestry(struct Family *pmember1,struct Family *pmember2)
{
if(strcmp(pmember1->father,pmember2->name)==0)
{
pmember1->p_to_pa=pmember2;
return 1;
}
if(strcmp(pmember1->mother,pmember2->name)==0)
{
pmember1->p_to_ma=pmember2;
return 1;
}
else
return 0;
}
//Fill in pointers for mother or father relationships
char related(struct Family *pmember1,struct Family *pmember2)
{
return set_ancestry(pmember1,pmember2)||
set_ancestry(pmember2,pmember1);
}
void main()
{
struct Family *first=NULL;
struct Family *current=NULL;
struct Family *last=NULL; //Pointer to previous person
char more='\0'; //Test value for ending input
for(;;)
{
printf("\nDo you want to enter the details of a%s person(Y or N)? ",
first!=NULL?"nother":"");
scanf(" %c",&more);
if(tolower(more)=='n')
break;
// current=get_person(); //这里按F11和F10都不能调试
if(first==NULL)
{
first=current;
last=current; //Remember for next iteration
}
else
{
last->next=current; //Set next address for previous Family
current->previous=last;
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
{
if(related(current,last)) //Found a parent?
if(++parents==2) //Yes,update count and check it
break;
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)
{
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("\n\t%s's birth date is %d/%d/%d ",
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!=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
}
}