N
N
nait1233212016-06-01 15:30:23
C++ / C#
nait123321, 2016-06-01 15:30:23

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;
}

Throws an error on startup.
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

Where is the mistake?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
A
Anton Zhilin, 2016-06-01
@nait123321

Not sure what the problem is, here is a working solution:

spoiler
#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;
}

And it's better to remove C++ from the header, otherwise questions like "why no classes" and "why not std::linked_list" arise.

N
nait123321, 2016-06-01
@nait123321

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 question

Ask a Question

731 491 924 answers to any question