Извлекать из очереди элементы, пока значение начального элемента очереди не станет четным - C (СИ)
Формулировка задачи:
Даны указатели P1 и P2 на начало и конец непустого очереди. Извлекать из очереди элементы, пока значение начального элемента очереди не станет четным, и выводить значения извлеченных элементов (если очередь не содержит элементов с четными значениями, то извлечь все ее элементы). Вывести также новые адреса начала и конца очереди (для пустой очереди дважды вывести NULL). После извлечения элементов из очереди освобождать память, которую они занимали.
Решение задачи: «Извлекать из очереди элементы, пока значение начального элемента очереди не станет четным»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <windows.h> /* self-referential structure */ struct queueNode { int data; /* define data as a int */ struct queueNode *nextPtr; /* queueNode pointer */ }; /* end structure queueNode */ typedef struct queueNode QueueNode; typedef QueueNode *QueueNodePtr; void printQueue( QueueNodePtr currentPtr ); int isEmpty( QueueNodePtr P1 ); int dequeue( QueueNodePtr *P1, QueueNodePtr *P2 ); void enqueue( QueueNodePtr *P1, QueueNodePtr *P2, int value ); void instructions( void ); int check(QueueNodePtr *P1); void adress(QueueNodePtr P1, QueueNodePtr P2); /* function main begins program execution */ int main() { QueueNodePtr P1 = NULL; /* initialize P1 */ QueueNodePtr P2 = NULL; /* initialize P2 */ QueueNodePtr P3 = NULL; QueueNodePtr P4 = NULL; int choice; /* user's menu choice */ char item, number,number1, i; /* char input by user */ SetConsoleCP(1251); SetConsoleOutputCP(1251); instructions(); /* display the menu */ printf( "? " ); scanf( "%d", &choice ); /* while user does not enter 3 */ while ( choice != 5 ) { switch( choice ) { /* enqueue value */ case 1: printf( "Ââåäèòå êîëè÷åñòâî Г·ГЁГ±ГҐГ« Гў î÷åðåäè P1: " ); scanf( "\n%d", &number ); for(i=0;i<number;i++){ item=rand()%5; enqueue( &P1, &P2, item );} printQueue( P1 ); break; case 2: printf( "Ââåäèòå êîëè÷åñòâî Г·ГЁГ±ГҐГ« Гў î÷åðåäè P2: " ); scanf( "\n%d", &number1 ); for(i=0;i<number1;i++){ item=rand()%10-7; enqueue( &P3, &P4, item );} printQueue( P3 ); break; /* dequeue value */ case 3: item=(*P1)->data; enqueue( &P3, &P4, item ); printQueue(P3); break; case 4: /* if queue is not empty */ if ( !isEmpty( P1 ) ) { for(i=0;i<number;i++){ if(check(&P1)==1){ item = dequeue( &P1, &P2 ); printf( "%d has been dequeued.\n", item ); } } adress(P1, P2); } /* end if */ printQueue( P1 ); 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 ( "ÑäåëГ*éòå ГўГ*Гё âûáîð:\n" " 1 ÑîçäГ*Г*ГЁГҐ î÷åðåäè P1\n" " 2 ÑîçäГ*Г*ГЁГҐ î÷åðåäè P2\n" " 3 ÏåðåìåùåГ*ГЁГҐ ýëåìåГ*òîâ P1 Гў P2\n" " 4 Âûâîä Г*äðåñîâ\n" " 5 Âûõîä\n" ); } /* end function instructions */ /* insert a node a queue tail */ void enqueue( QueueNodePtr *P1, QueueNodePtr *P2, int value ) { QueueNodePtr newPtr; /* pointer to new node */ newPtr = malloc( sizeof( QueueNode ) ); if ( newPtr != NULL ) { /* is space available */ newPtr->data = value; newPtr->nextPtr = NULL; /* if empty, insert node at head */ if ( isEmpty( *P1 ) ) { *P1 = newPtr; } /* end if */ else { ( *P2 )->nextPtr = newPtr; } /* end else */ *P2 = newPtr; } /* end if */ else { printf( "%d not inserted. No memory available.\n", value ); } /* end else */ } /* end function enqueue */ /* remove node from queue head */ int dequeue( QueueNodePtr *P1, QueueNodePtr *P2 ) { int value; /* node value */ QueueNodePtr tempPtr; /* temporary node pointer */ value = ( *P1 )->data; tempPtr = *P1; *P1 = ( *P1 )->nextPtr; /* if queue is empty */ if ( *P1 == NULL ) { *P2 = NULL; } /* end if */ free( tempPtr ); return value; } /* end function dequeue */ /* Return 1 if the list is empty, 0 otherwise */ int isEmpty( QueueNodePtr P1 ) { return P1 == NULL; } /* end function isEmpty */ /* Print the queue */ void printQueue( QueueNodePtr currentPtr ) { /* if queue is empty */ if ( currentPtr == NULL ) { printf( "Queue is empty.\n\n" ); } /* end if */ else { printf( "The queue is:\n" ); /* while not end of queue */ while ( currentPtr != NULL ) { printf( "%d —> ", currentPtr->data ); currentPtr = currentPtr->nextPtr; } /* end while */ printf( "NULL\n\n" ); } /* end else */ } /* end function printQueue */ int check(QueueNodePtr *P1){ return (*P1)->data%2; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д