Hi, for my class, I had to modify an example of a linked list from my text book so that it is a doubly linked list. Then I had to prove that myprogram works properly by implementing a print backwards function. Here is the example program from the book:
Code:Code:/* Fig. 12.3: fig12_03.c Operating and maintaining a list */ #include <stdio.h> #include <stdlib.h> /* self-referential structure */ struct listNode { char data; /* each listNode contains a character */ struct listNode *nextPtr; /* pointer to next node*/ }; /* end structure listNode */ typedef struct listNode ListNode; /* synonym for struct listNode */ typedef ListNode *ListNodePtr; /* synonym for ListNode* */ /* prototypes */ 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( void ) { ListNodePtr startPtr = NULL; /* initially there are no nodes */ int choice; /* user's choice */ char item; /* char entered by user */ instructions(); /* display the menu */ printf( "? " ); scanf( "%d", &choice ); /* loop while user does not choose 3 */ while ( choice != 3 ) { switch ( choice ) { case 1: printf( "Enter a character: " ); scanf( "\n%c", &item ); insert( &startPtr, item ); /* insert item in list */ printList( startPtr ); break; case 2: /* if list is not empty */ if ( !isEmpty( startPtr ) ) { printf( "Enter character to be deleted: " ); scanf( "\n%c", &item ); /* if character is found, remove it */ if ( delete( &startPtr, item ) ) { /* remove item */ printf( "%c deleted.\n", item ); printList( startPtr ); } /* end if */ else { printf( "%c not found.\n\n", item ); } /* end else */ } /* end if */ else { printf( "List is empty.\n\n" ); } /* end else */ break; default: printf( "Invalid choice.\n\n" ); instructions(); break; } /* end switch */ printf( "? " ); scanf( "%d", &choice ); } /* end while */ printf( "End of run.\n" ); return 0; /* indicates successful termination */ } /* end main */ /* display program instructions to user */ 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" ); } /* end function instructions */ /* Insert a new value into the list in sorted order */ void insert( ListNodePtr *sPtr, char value ) { ListNodePtr newPtr; /* pointer to new node */ ListNodePtr previousPtr; /* pointer to previous node in list */ ListNodePtr currentPtr; /* pointer to current node in list */ newPtr = malloc( sizeof( ListNode ) ); /* create node */ if ( newPtr != NULL ) { /* is space available */ newPtr->data = value; /* place value in node */ newPtr->nextPtr = NULL; /* node does not link to another node */ previousPtr = NULL; currentPtr = *sPtr; /* loop to find the correct location in the list */ while ( currentPtr != NULL && value > currentPtr->data ) { previousPtr = currentPtr; /* walk to ... */ currentPtr = currentPtr->nextPtr; /* ... next node */ } /* end while */ /* insert new node at beginning of list */ if ( previousPtr == NULL ) { newPtr->nextPtr = *sPtr; *sPtr = newPtr; } /* end if */ else { /* insert new node between previousPtr and currentPtr */ previousPtr->nextPtr = newPtr; newPtr->nextPtr = currentPtr; } /* end else */ } /* end if */ else { printf( "%c not inserted. No memory available.\n", value ); } /* end else */ } /* end function insert */ /* Delete a list element */ char delete( ListNodePtr *sPtr, char value ) { ListNodePtr previousPtr; /* pointer to previous node in list */ ListNodePtr currentPtr; /* pointer to current node in list */ ListNodePtr tempPtr; /* temporary node pointer */ /* delete first node */ if ( value == ( *sPtr )->data ) { tempPtr = *sPtr; /* hold onto node being removed */ *sPtr = ( *sPtr )->nextPtr; /* de-thread the node */ free( tempPtr ); /* free the de-threaded node */ return value; } /* end if */ else { previousPtr = *sPtr; currentPtr = ( *sPtr )->nextPtr; /* loop to find the correct location in the list */ while ( currentPtr != NULL && currentPtr->data != value ) { previousPtr = currentPtr; /* walk to ... */ currentPtr = currentPtr->nextPtr; /* ... next node */ } /* end while */ /* delete node at currentPtr */ if ( currentPtr != NULL ) { tempPtr = currentPtr; previousPtr->nextPtr = currentPtr->nextPtr; free( tempPtr ); return value; } /* end if */ } /* end else */ return '\0'; } /* end function delete */ /* Return 1 if the list is empty, 0 otherwise */ int isEmpty( ListNodePtr sPtr ) { return sPtr == NULL; } /* end function isEmpty */ /* Print the list */ void printList( ListNodePtr currentPtr ) { /* if list is empty */ if ( currentPtr == NULL ) { printf( "List is empty.\n\n" ); } /* end if */ else { printf( "The list is:\n" ); /* while not the end of the list */ while ( currentPtr != NULL ) { printf( "%c --> ", currentPtr->data ); currentPtr = currentPtr->nextPtr; } /* end while */ printf( "NULL\n\n" ); } /* end else */ } /* end function printList */
I have updated this code to make it a doubly linked list with a print backwards function, but I am not getting the correct output. I am having problems when with the list printing in reverse (the reverse list doesnt always print all the letters in the list) and also when I delete characters from the list. I noticed that when I delete letters (other than the last one entered), it holds a different character in place of the letter that was entered to be deleted.
Here is my current code:
Code:Code:#include <stdio.h> #include <stdlib.h> struct listNode { char data;//each listNode contains a character struct listNode *nextPtr; //pointer to next node struct listNode *prevPtr; //pointer to previous node }; // end structure listNode typedef struct listNode ListNode; //synonym for struct listNode typedef ListNode *ListNodePtr; //synonym for ListNode /* prototypes */ void insert( ListNodePtr *sPtr, ListNodePtr *tPtr, char value ); char deletechar( ListNodePtr *sPtr, ListNodePtr *tPtr, char value); int isEmpty( ListNodePtr sPtr); void printList( ListNodePtr currentPtr ); void printBack( ListNodePtr currentPtr ); void instructions(void ); int main(int argc, char *argv[]) { ListNodePtr startPtr=NULL; /* initially there are no nodes */ ListNodePtr tailPtr=NULL; int choice; /* user's choice */ char item; /* char entered by user */ instructions(); /* display the menu */ printf("? "); scanf("%d", &choice); while(choice !=3){ switch(choice){ case 1: printf("Enter a character: "); scanf("\n%c", &item); insert(&startPtr, &tailPtr, item); /* insert item in list */ printList(startPtr); printBack(tailPtr); break; case 2: /* delete an element */ /* if list is no empty */ if(!isEmpty(startPtr)){ printf("Enter a character to be deleted: "); scanf("\n%c", &item); /* if character is found remove it */ if(deletechar(&startPtr, &tailPtr, item)){ /* remove item */ printf("%c deleted.\n", item); printList(startPtr); printBack(tailPtr); }/* end if */ else{ printf("%c not found.\n\n", item); }/* end else */ }/* end if */ else{ printf("List is empty.\n\n"); }/* end else */ break; default: printf("invalid choice. \n\n"); instructions(); break; }/* end switch */ printf("? "); scanf("%d", &choice); }/* end while */ printf("end of run.\n"); return 0; /* indicates successful termination */ }/* end main*/ 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"); }/* end function instructions */ /* Insert a new value into the list in sorted order */ void insert( ListNodePtr *sPtr, ListNodePtr *tPtr, char value){ ListNodePtr newPtr; //pointer to new node ListNodePtr previousPtr; //pointer to previous node in list ListNodePtr currentPtr; //point to current node in list newPtr = (ListNodePtr)malloc( sizeof( ListNode ) ); //create node if(newPtr!=NULL){ //is space available newPtr->data=value; //place value in node newPtr->nextPtr=NULL; //node does not link to another node previousPtr=NULL; currentPtr=*sPtr; newPtr->prevPtr=NULL; //loop to find the correct location in the list while(currentPtr !=NULL&&value > currentPtr->data){ previousPtr=currentPtr; /* walk to ... */ currentPtr=currentPtr->nextPtr; /* ... next node*/ }//end while if(previousPtr==NULL){ // inserted at beginning of list newPtr->nextPtr=*sPtr; *sPtr=newPtr; *tPtr=newPtr; }//end if else{ //insert new node between previousPtr and currentPtr if(currentPtr!=NULL){ // inserted in the middle previousPtr->nextPtr=newPtr; newPtr->nextPtr=currentPtr; currentPtr->prevPtr=newPtr; newPtr->prevPtr=previousPtr; } else{//inserted at end of list *tPtr=newPtr; previousPtr->nextPtr=newPtr; newPtr->prevPtr=previousPtr; } } /* end else */ } /* end if */ else{ printf("%c not inserted. no memory available.\n", value); }//end else }//end function insert /* delete a list element */ char deletechar( ListNodePtr *sPtr, ListNodePtr *tPtr, char value){ ListNodePtr previousPtr; /* pointer to previous node in list */ ListNodePtr currentPtr; /* pointer to current node in list */ ListNodePtr tempPtr; /* temporary node pointer */ if( *sPtr == NULL ){//checks to see if list is empty return '\0'; } if((*sPtr)==(*tPtr)){//checks to see if start pointer and tail pointer are the same *tPtr=NULL; } /* delete first node */ if ( value == ( *sPtr )->data) {/* Begin if loop */ tempPtr = *sPtr; /* hold onto node being removed */ *sPtr = ( *sPtr )->nextPtr; /* de-thread the node */ free( tempPtr ); /* free the de-threaded node */ // (*sPtr)->prevPtr = NULL return value; } /* end if */ else { previousPtr = *sPtr; currentPtr = ( *sPtr )->nextPtr; /* loop to find the correct location in the list */ while ( currentPtr != NULL && currentPtr->data != value ) { previousPtr = currentPtr; /* walk to ... */ currentPtr = currentPtr->nextPtr; /* ... next node */ } /* end while */ /* delete node at currentPtr */ if ( currentPtr != NULL ) { tempPtr = currentPtr; previousPtr->nextPtr = currentPtr->nextPtr; free( tempPtr ); return value; }/* end if */ } /* end else */ return '\0'; } /* end function delete */ /* Return 1 if the list is empty, 0 otherwise */ int isEmpty(ListNodePtr sPtr){ return sPtr==NULL; }/* end function isEmpty */ void printList(ListNodePtr currentPtr){ //if list is empty if(currentPtr==NULL){ printf("List is empty.\n\n"); }//end if else{ printf("the list is:\n"); // while not the end of the list while(currentPtr !=NULL){ printf("%c --> ", currentPtr->data ); currentPtr=currentPtr->nextPtr; }//end while printf("NULL\n\n"); } } void printBack(ListNodePtr currentPtr){ if(currentPtr==NULL){ printf("List is empty.\n\n"); } else{ printf("the list in reverse is:\n"); while(currentPtr !=NULL){ printf("%c --> ", currentPtr->data ); currentPtr=currentPtr->prevPtr; } printf("NULL\n\n"); } }



LinkBack URL
About LinkBacks



