Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I am writing a program in C and have the code written but am running into a few

ID: 675470 • Letter: I

Question

I am writing a program in C and have the code written but am running into a few errors. Firstly, here is the assignment:

Modify the linked list example in the book so that it is a doubly linked list. Prove that your program works properly by implementing a print backwards function:

/* 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( " %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( " %c", &item );

               /* if character is found, remove it */

               if ( delete( &startPtr, item ) ) { /* remove item */

                  printf( "%c deleted. ", item );

                  printList( startPtr );

               } /* end if */

               else {

                  printf( "%c not found. ", item );

               } /* end else */

            } /* end if */

            else {

               printf( "List is empty. " );

            } /* end else */

            break;

         default:

            printf( "Invalid choice. " );

            instructions();

            break;

      } /* end switch */

     printf( "? " );

      scanf( "%d", &choice );

   } /* end while */

   printf( "End of run. " );

   return 0; /* indicates successful termination */

} /* end main */

/* display program instructions to user */

void instructions( void )

{

   printf( "Enter your choice: "

      "   1 to insert an element into the list. "

      "   2 to delete an element from the list. "

      "   3 to end. " );

} /* 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. ", 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 '';

} /* 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. " );

   } /* end if */

   else {

      printf( "The list is: " );

      /* while not the end of the list */

      while ( currentPtr != NULL ) {

         printf( "%c --> ", currentPtr->data );

         currentPtr = currentPtr->nextPtr;  

      } /* end while */

      printf( "NULL " );

   } /* end else */

} /* end function printList */

Here is my code and I'll point out there errors with bold:

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, char value);

char delete(ListNodePtr *sPtr, char value); <--- "EXPECTED AN IDENTIFER ON "delete"

int isEmpty(ListNodePtr sPtr);

void printList(ListNodePtr currentPtr);

void printListBackwards(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(" %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(" %c", &item);

               /* if character is found, remove it */

               if (delete(&startPtr, item)) { /* remove item */ <--- "Expression must be a pointer to a complete object type."

                   printf("%c deleted. ", item);

                   printList(startPtr);

               } /* end if */

               else {

                   printf("%c not found. ", item);

               } /* end else */

           } /* end if */

           else {

               printf("List is empty. ");

           } /* end else */

           break;

       default:

           printf("Invalid choice. ");

           instructions();

           break;

       } /* end switch */

       printf("? ");

       scanf("%d", &choice);

   } /* end while */

   printf("End of run. ");

   return 0; /* indicates successful termination */

} /* end main */

/* display program instructions to user */

void instructions(void)

{

   printf("Enter your choice: "

       " 1 to insert an element into the list. "

       " 2 to delete an element from the list. "

       " 3 to end. ");

} /* 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 */ <--- "A value type of void cannot be assigned to an entity type of "ListNodePtr"

   if (newPtr != NULL) { /* is space available */

       newPtr->data = value; /* place value in node */

       newPtr->nextPtr = NULL; /* node does not link to another node */

       newPtr->prevPtr = NULL; /* node does not link to previous 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;

           newPtr->prevPtr = previousPtr;

           if (currentPtr != NULL)

               currentPtr->prevPtr = newPtr;

       } /* end else */

   } /* end if */

   else {

       printf("%c not inserted. No memory available. ", value);

   } /* end else */

} /* end function insert */

/* Delete a list element */

char delete(ListNodePtr *sPtr, char value)   <---- "Expected an identifer"

{

   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 */

       if ((*sPtr) != NULL)

           (*sPtr)->prevPtr = NULL; /* nullify previous 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;

           if (currentPtr->nextPtr != NULL)

               currentPtr->nextPtr->prevPtr = previousPtr;

           free(tempPtr);

           return value;

       } /* end if */

   } /* end else */

   return '';

} /* 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 then call printListBackwards*/

void printList(ListNodePtr currentPtr)

{

   ListNodePtr previousPtr; /* pointer to previous node in list */

                           /* if list is empty */

   if (currentPtr == NULL) {

       printf("List is empty. ");

   } /* end if */

   else {

       printf("The list is: ");

       /* while not the end of the list */

       while (currentPtr != NULL) {

           printf("%c --> ", currentPtr->data);

           previousPtr = currentPtr;

           currentPtr = currentPtr->nextPtr;

       } /* end while */

       printf("NULL ");

       printListBackwards(previousPtr);

   } /* end else */

} /* end function printList */

/* Print the list Backwards*/

void printListBackwards(ListNodePtr currentPtr)

{

   printf("The list in reverse is: ");

   /* while not the end of the list */

   while (currentPtr != NULL) {

       printf("%c --> ", currentPtr->data);

       currentPtr = currentPtr->prevPtr;

   } /* end while */

   printf("NULL ");

} /* end function printListBackwards */

How can I get this code to work?!

Explanation / Answer

It seems it should work properly.. I havn't find errors in your program.. please clear the cache and try to run again. and before that please check your declarations of the variables.

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote