学习中碰到的一个程序,写完执行的时候出错了,麻烦高手求解,感谢!!
代码如下:程序代码:
/* 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); }
附件里是输入和执行错误的截图: