I was just wondering how to change this singly linked list code into a doubly linked list. I know i have to use:
struct Node{
char d;
Node *next;
Node *prev;
}
i just want to be able to move forward and backwards in the list.
i am confused....![]()
and by book doesn't cover it, it just basically says doubly linked list are useful to move forward and backwards
Code:#include <stdio.h> #include <stdlib.h> struct listNode { char data; struct listNode *nextPtr; }; typedef struct listNode ListNode; typedef ListNode *ListNodePtr; void insert( ListNodePtr *sPtr, char value ); char delete( ListNodePtr *sPtr, char value ); int isEmpty( ListNodePtr sPtr ); void printList( ListNodePtr currentPtr ); void instructions( void ); int main() { ListNodePtr startPtr = NULL; int choice; char item; instructions(); printf( "? " ); scanf( "%d", &choice ); while ( choice != 3 ) { switch ( choice ) { case 1: printf( "Enter a character: " ); scanf( "\n%c", &item ); insert( &startPtr, item ); printList( startPtr ); break; case 2: if ( !isEmpty( startPtr ) ) { printf( "Enter character to be deleted: " ); scanf( "\n%c", &item ); if ( delete( &startPtr, item ) ) { printf( "%c deleted.\n", item ); printList( startPtr ); } else { printf( "%c not found.\n\n", item ); } } else { printf( "List is empty.\n\n" ); } break; default: printf( "Invalid choice.\n\n" ); instructions(); break; } printf( "? " ); scanf( "%d", &choice ); } printf( "End of run.\n" ); return 0; } void instructions( void ) { printf( "Enter your choice:\n" " 1 to insert an element into the list.\n" " 2 to delete an element from the list.\n" " 3 to end.\n" ); } void insert( ListNodePtr *sPtr, char value ) { ListNodePtr newPtr; ListNodePtr previousPtr; ListNodePtr currentPtr; newPtr = malloc( sizeof( ListNode ) ); if ( newPtr != NULL ) { newPtr->data = value; newPtr->nextPtr = NULL; previousPtr = NULL; currentPtr = *sPtr; while ( currentPtr != NULL && value > currentPtr->data ) { previousPtr = currentPtr; currentPtr = currentPtr->nextPtr; } if ( previousPtr == NULL ) { newPtr->nextPtr = *sPtr; *sPtr = newPtr; } else { previousPtr->nextPtr = newPtr; newPtr->nextPtr = currentPtr; } } else { printf( "%c not inserted. No memory available.\n", value ); } } char delete( ListNodePtr *sPtr, char value ) { ListNodePtr previousPtr; ListNodePtr currentPtr; ListNodePtr tempPtr; if ( value == ( *sPtr )->data ) { tempPtr = *sPtr; *sPtr = ( *sPtr )->nextPtr; free( tempPtr ); return value; } else { previousPtr = *sPtr; currentPtr = ( *sPtr )->nextPtr; while ( currentPtr != NULL && currentPtr->data != value ) { previousPtr = currentPtr; currentPtr = currentPtr->nextPtr; } if ( currentPtr != NULL ) { tempPtr = currentPtr; previousPtr->nextPtr = currentPtr->nextPtr; free( tempPtr ); return value; } } return '\0'; } int isEmpty( ListNodePtr sPtr ) { return sPtr == NULL; } void printList( ListNodePtr currentPtr ) { if ( currentPtr == NULL ) { printf( "List is empty.\n\n" ); } else { printf( "The list is:\n" ); while ( currentPtr != NULL ) { printf( "%c --> ", currentPtr->data ); currentPtr = currentPtr->nextPtr; } printf( "NULL\n\n" ); } }



LinkBack URL
About LinkBacks



