Answer the question
In order to leave comments, you need to log in
How to turn a queue into 2 queues?
Hello, I need to do the following for the lab: turn the queue into 2 queues (in 1 - paired numbers, in 2 - not paired). The 5th element of each queue must be removed.
I wrote like this:
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
int A=0;
int B=0;
struct TNode {
int data; // Інформаційний блок
struct TNode *next; // Адресний блок
};
typedef struct TNode Node;
void push(Node **head, Node **tail, int data)
{
Node *NewNode = (Node*)malloc(sizeof(Node)); // Покажчик на новий елемент
NewNode->data = data; // Інформація
NewNode->next = NULL; // NULL вказує на те, що цей елемент останній
if ((*head) == NULL)//Якщо черга порожня
{
(*head) = (*tail) = NewNode;// Покажчики на голову та кінець черги вказують на 1 елемент
}
else//Якщо черга не порожня
{
(*tail)->next = NewNode;
(*tail) = NewNode;
}
}
void Duble(Node **head, Node **tail, Node **headp, Node **headnp, Node **tailp, Node **tailnp)
{
Node *NewNode = (Node*)malloc(sizeof(Node)); // Покажчик на новий елемент
NewNode->data = (*head)->data; // Інформація
NewNode->next = NULL; // NULL вказує на те, що цей елемент останній
if ((*head) == NULL)//Якщо черга порожня
{
(*head) = (*tail) = NewNode;// Покажчики на голову та кінець черги вказують на 1 елемент
}
if ((*head)->data % 2 == 0)
{
if(A!=4)
{
(*tailp)->next = NewNode;
(*tailp) = NewNode;
}
++A;
}
else//Якщо черга не порожня
{
if (B != 4)
{
(*tailnp)->next = NewNode;
(*tailnp) = NewNode;
}
++B;
}
}
void print(Node* head)//Функція для виводу черги на екран
{
printf("\nЧерга\n");
while (head) // Виведення результатів
{
printf("%d\n", head->data);
head = head->next;
}
}
int main()
{
setlocale(LC_ALL, "ukr");
Node *head = NULL; // Покажчик, який вказує на голову черги
Node *tail = NULL; // Покажчик, який вказує на хвіст черги
Node *headp = NULL; // парне
Node *tailp = NULL;
Node *headnp = NULL; // непарне
Node *tailnp = NULL;
int a, b;
for (int i = 0; i < 20; i++) // Цикл для створення 5 вузлів
{
push(&head, &tail, i + 1); // Функція створення вузла
}
print(head);//Виведення черги на екран
Duble(&head, &tail, &headp, &headnp, &tail, &tailnp);
print(headp);
print(headnp);
_getch();
return 1;
}
Exception thrown at 0x00D45137 in Laba6.exe: 0xC0000005: Access violation writing location 0x00000004.
If there is a handler for this exception, the program may be safely continued
Answer the question
In order to leave comments, you need to log in
Not sure what the problem is, here is a working solution:
#include <stdlib.h>
#include <stdio.h>
struct TNode {
int data;
struct TNode *next;
};
typedef struct TNode Node;
struct TQueue {
Node* head;
Node* tail;
};
typedef struct TQueue Queue;
Queue* newQueue()
{
Queue* queue = malloc(sizeof(Queue));
queue->head = NULL;
queue->tail = NULL;
return queue;
}
void deleteQueue(Queue* queue)
{
Node* current = queue->head;
while (current != NULL) {
Node* next = current->next;
free(current);
current = next;
}
free(queue);
}
void pushBackQueue(Queue* queue, int data)
{
Node* newNode = malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
if (queue->tail == NULL) {
queue->head = newNode;
queue->tail = newNode;
}
else {
queue->tail->next = newNode;
queue->tail = newNode;
}
}
void splitQueue(Queue* source, Queue* even, Queue* odd)
{
for (Node* current = source->head; current != NULL; current = current->next) {
int data = current->data;
pushBackQueue((data % 2 == 0) ? even : odd, data);
}
}
void printQueue(Queue* queue)
{
for (Node* current = queue->head; current != NULL; current = current->next) {
printf("%d ", current->data);
}
printf("\n");
}
int main()
{
Queue* source = newQueue();
for (int i = 0; i < 20; i++) {
pushBackQueue(source, i + 1);
}
printQueue(source);
Queue* even = newQueue();
Queue* odd = newQueue();
splitQueue(source, even, odd);
printQueue(even);
printQueue(odd);
deleteQueue(source);
deleteQueue(even);
deleteQueue(odd);
system("pause"); // not needed in Linux
return 1;
}
Changed the code, there are no more errors, but the rest 2 lists are not filled
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
int A=0;
int B=0;
struct TNode {
int data; // Інформаційний блок
struct TNode *next; // Адресний блок
};
typedef struct TNode Node;
typedef struct TNode NodeP;
typedef struct TNode NodeNP;
void push(Node **head, Node **tail, int data)
{
Node *NewNode = (Node*)malloc(sizeof(Node)); // Покажчик на новий елемент
NodeP *NewNodeP = (NodeP*)malloc(sizeof(NodeP));
NodeNP *NewNodeNP = (NodeP*)malloc(sizeof(NodeNP));
NewNode->data = data; // Інформація
if (data % 2 == 0)
{
if (A != 4)
{
NewNodeP->data= NewNode->data;
}
++A;
}
else
{
if (B != 4)
{
NewNodeNP->data=data;
}
++B;
}
NewNode->next = NULL; // NULL вказує на те, що цей елемент останній
if ((*head) == NULL)//Якщо черга порожня
{
(*head) = (*tail) = NewNode;// Покажчики на голову та кінець черги вказують на 1 елемент
}
else//Якщо черга не порожня
{
(*tail)->next = NewNode;
(*tail) = NewNode;
}
}
void print(Node* head)//Функція для виводу черги на екран
{
printf("\nЧерга\n");
while (head) // Виведення результатів
{
printf("%d\n", head->data);
head = head->next;
}
}
void printp(NodeP* headp)//Функція для виводу черги на екран
{
printf("\nЧерга\n");
while (headp) // Виведення результатів
{
printf("%d\n", headp->data);
headp = headp->next;
}
}
int main()
{
setlocale(LC_ALL, "ukr");
Node *head = NULL; // Покажчик, який вказує на голову черги
Node *tail = NULL; // Покажчик, який вказує на хвіст черги
NodeP *headp = NULL; // парне
NodeP *tailp = NULL;
NodeNP *headnp = NULL; // непарне
NodeNP *tailnp = NULL;
int a, b;
for (int i = 0; i < 20; i++) // Цикл для створення 5 вузлів
{
push(&head, &tail, i + 1); // Функція створення вузла
}
print(head);//Виведення черги на екран
headp->data = head->data;
printp(headp);
print(headnp);
_getch();
return 1;
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question