A doubly linked list can go through a list in either direction.
We need an extra pointer in each structure to store the address of the previous structure in addition to the pointer to the next.
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
//w w w . j av a 2 s . c o m
typedef struct Dog Dog; // Define Dog as a type name
struct Dog // Structure type definition
{
int age;
int height;
char name[20];
char father[20];
char mother[20];
Dog *next; // Pointer to next structure
Dog *previous; // Pointer to previous structure
};
int main(void) {
Dog *first = NULL; // Pointer to first Dog
Dog *current = NULL; // Pointer to current Dog
Dog *last = NULL; // Pointer to previous Dog
char test = '\0'; // Test value for ending input
for( ; ; ) {
printf_s("Do you want to enter details of a%s Dog (Y or N)? ", first != NULL?"nother" : "");
scanf_s(" %c", &test, sizeof(test));
if(tolower(test) == 'n')
break;
// Allocate memory for each new Dog structure
current = (Dog*) malloc(sizeof(Dog));
if(first == NULL){
first = current; // Set pointer to first Dog
current->previous = NULL;
} else {
last->next = current; // Set next address for previous Dog
current->previous = last; // Previous address for current Dog
}
printf_s("Enter the name of the Dog: ");
scanf_s("%s", current->name, sizeof(current->name));
printf_s("How old is %s? ", current->name);
scanf_s("%d", ¤t->age);
printf_s("How high is %s ( in hands )? ", current -> name );
scanf_s("%d", ¤t->height);
printf_s("Who is %s's father? ", current->name);
scanf_s("%s", current->father,sizeof(current->father));
printf_s("Who is %s's mother? ", current->name);
scanf_s("%s", current->mother, sizeof(current->mother));
current->next = NULL; // In case it's the last...
last = current; // ...save its address
}
// Now tell them what we know.
printf_s("\n");
while(current != NULL) // Output Dog data in reverse order
{
printf_s("%s is %d years old, %d hands high,",
current->name, current->age, current->height);
printf_s(" and has %s and %s as parents.\n", current->father,
current->mother);
last = current; // Save pointer to enable memory to be freed
current = current->previous; // current points to previous in list
free(last); // Free memory for the Dog we output
last = NULL;
}
first = NULL;
return 0;
}
The code above generates the following result.