2016-03-29 3 views
-2

Я включил три перерыва; в трех разных случаях. Я протестировал случай 2, он остановил программу; однако для случая 1 он продолжается и продолжается, даже если он сломается ;. Я пробовал все возможные решения, чтобы исправить это. Я не мог понять.Как остановить запуск программы?

как я могу это исправить?

#include <stdio.h> 
#include <stdlib.h> 



// self-referential structure      
struct queueNode {         
    char data; // define data as a char    
    struct queueNode *nextPtr; // queueNode pointer 
    struct queueNode *prevPtr; 
}; // end structure queueNode      

typedef struct queueNode QueueNode; 
typedef QueueNode *QueueNodePtr; 

// function prototypes 
void printQueue(QueueNodePtr currentPtr); 
int isEmpty(QueueNodePtr headPtr); 
char dequeue(QueueNodePtr *headPtr, QueueNodePtr *tailPtr); 
void enqueue(QueueNodePtr *headPtr, QueueNodePtr *tailPtr, 
    char value); 
void instructions(void); 
void reverse(QueueNodePtr currentPtr); 

// function main begins program execution 
int main(void) 
{ 
    QueueNodePtr headPtr = NULL; // initialize headPtr 
    QueueNodePtr tailPtr = NULL; // initialize tailPtr 
    unsigned int choice; // user's menu choice 
    char item; // char input by user 

    instructions(); // display the menu 
    printf("%s", "? "); 
    scanf("%u", &choice); 

    // while user does not enter 3 
    while (choice != 3) { 

     switch(choice) { 
     // enqueue value 
     case 1: 
      printf("%s", "Enter a character: "); 
      scanf("\n%c", &item); 
      enqueue(&headPtr, &tailPtr, item); 
      printQueue(headPtr); 
      reverse(headPtr); 
      break; 
     // dequeue value 
     case 2: 
      // if queue is not empty 

      if (!isEmpty(headPtr)) { 

       item = dequeue(&headPtr, &tailPtr); 
       printf("%c has been dequeued.\n", item); 
      } // end if 

      printQueue(headPtr); 
      reverse(headPtr); 
      break; 
     default: 
      puts("Invalid choice.\n"); 
      instructions(); 
      break; 
     } // end switch 

     printf("%s", "? "); 
     scanf("%u", &choice); 
    } // end while 

    puts("End of run."); 
} // end main 

// display program instructions to user 
void instructions(void) 
{ 
    printf ("Enter your choice:\n" 
      " 1 to add an item to the queue\n" 
      " 2 to remove an item from the queue\n" 
      " 3 to end\n"); 
} // end function instructions 

// insert a node in at queue tail 
void enqueue(QueueNodePtr *headPtr, QueueNodePtr *tailPtr, 
    char value) 
{ 
    QueueNodePtr newPtr; // pointer to new node 
    QueueNodePtr currentPtr; 
    QueueNodePtr previousPtr; 

    newPtr = (QueueNodePtr)malloc(sizeof(QueueNode)); 

    if (newPtr != NULL) { // is space available 
     newPtr->data = value; 
     newPtr->nextPtr = NULL; 
     newPtr->prevPtr = NULL; 
     previousPtr = NULL; 
     currentPtr = *headPtr; 

     while(currentPtr != NULL && value > currentPtr-> data) 
     { 
     previousPtr = currentPtr; 
     currentPtr = currentPtr->nextPtr; 
     } 

     if(previousPtr == NULL) 
     { 
     newPtr->nextPtr = *headPtr; 

     if(*headPtr != NULL) 
      (*headPtr)->prevPtr = newPtr; 
     *headPtr = newPtr; 
     } 
     else 
     { 
     newPtr->prevPtr = previousPtr; 
     previousPtr->nextPtr = newPtr; 
     newPtr->nextPtr = currentPtr; 
      if(currentPtr != NULL) 
       currentPtr->prevPtr = newPtr; 
     } 
    } // end if 
    else { 
     printf("%c not inserted. No memory available.\n", value); 
    } // end else 
} // end function enqueue 

// remove node from queue head 
char dequeue(QueueNodePtr *headPtr, QueueNodePtr *tailPtr) 
{ 
    char value; // node value 
    QueueNodePtr tempPtr; // temporary node pointer 
    QueueNodePtr currentPtr; 
    QueueNodePtr previousPtr; 


    if(value == (*headPtr)->data) 
    { 
     tempPtr = *headPtr;    
     *headPtr = (*headPtr)->nextPtr; 
     free(tempPtr); 
     return value; 
    } 
    else 
    { 
    previousPtr = *headPtr; 
    currentPtr = (*headPtr)->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'; 
} // end function dequeue 

// return 1 if the queue is empty, 0 otherwise 
int isEmpty(QueueNodePtr headPtr) 
{ 
    return headPtr == NULL; 
} // end function isEmpty 

// print the queue 
void printQueue(QueueNodePtr currentPtr) 
{ 
    // if queue is empty 
    if (currentPtr == NULL) { 
     puts("List is empty.\n"); 
    } // end if 
    else { 
     puts("The list is:"); 

     // while not end of queue 
     while (currentPtr != NULL) { 

     printf("%c --> ", currentPtr->data); 
     currentPtr = currentPtr->nextPtr; 
     } // end while 

     puts("NULL\n"); 
    } // end else 
} // end function printQueue 

void reverse(QueueNodePtr currentPtr) 
{ 
    QueueNodePtr tempPtr = NULL; 

    while(currentPtr != NULL) 
    { 
     tempPtr = currentPtr; 
     currentPtr = currentPtr->nextPtr; 
    } 
    printf("\nThe list in reverse is:"); 
    printf("NULL"); 

    currentPtr = tempPtr; 
    while(currentPtr != NULL) 
    { 
     printf(" <-- %c", currentPtr->data); 
    } 
    printf("NULL\n"); 
} 
+3

«Я пробовал все возможные решения, чтобы исправить это» «Нет, вы этого не сделали. Вы хотите попробовать использовать отладчик, это действительно полезный инструмент! – alk

+0

Ошибок при использовании отладчика. – blacklune

+0

В случае исчезновения ошибок с помощью отладочной сборки это UB, и такие проблемы могут быть эффективно устранены только в среде, где они происходят. Это было бы твое. –

ответ

1

В If-даного ниже value используется uninitilaised:

char value; // node value 
QueueNodePtr tempPtr; // temporary node pointer 
QueueNodePtr currentPtr; 
QueueNodePtr previousPtr; 


if(value == (*headPtr)->data) 

Делая это по крайней мере вызывает случайное поведение, чтобы не назвать его неопределенным behaviuor.

Смежные вопросы