Извлекать из очереди элементы, пока значение начального элемента очереди не станет четным - 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;
 
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы