• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem flagi - lista C

Cloud VPS
0 głosów
741 wizyt
pytanie zadane 14 czerwca 2021 w C i C++ przez warzywko13 Użytkownik (840 p.)

A więc muszę stworzyć program, który posortuje mi np: RRBWWBWBR według kolejności flagi holenderskiej, czyli na RRRWWWBBB.

Pomysł na to mam taki aby podzielić jedną listę na 3 do każdej wpakować jedną grupę a następnie wyzerować główną listę i tam wrzucić to w dobrej kolejności. 

Niestety po wrzuceniu do list danych, kiedy próbuję ją wyświetlić listę nic się nie dzieje.

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

//struktura danych
typedef struct node {
  struct node *next;
  char* data;
} node_t;

//dodawanie elementu do listy
void push_top(node_t **head, char* data){
   node_t *current;
   current = (node_t *)malloc(sizeof(node_t));

   current->data = strcpy(malloc(strlen(data) + 1), data);
   current->next=(*head);
   *head=current;
}

//wyświetlanie listy
void show(node_t *head){
   node_t *current=head;

   while (current != NULL){
      printf("%s\n", current->data);
      current = current->next;
   }
}

//podzielenie listy na 3 listy 
void sort(node_t **head){ //w tej funkcji jest poroblem!
  node_t *current = *head;
  //Stworzenie 3 list
  node_t *left = (node_t *)malloc(sizeof(node_t));
  node_t *right = (node_t *)malloc(sizeof(node_t));
  node_t *center = (node_t *)malloc(sizeof(node_t));

  while(current != NULL){
    if(current -> data == "R"){
      push_top(&left, current -> data);
    }else if(current -> data == "W"){
      push_top(&center, current -> data);
    }else if(current -> data == "B"){
      push_top(&right, current -> data);
    }

    current = current -> next;
  }

  //show(left);

}

int main(){
  node_t *head;
  head = (node_t *)malloc(sizeof(node_t));
  head=NULL;
  

  //dodawnie kolorów do listy
  push_top(&head, "R");
  push_top(&head, "R");
  push_top(&head, "R");

  push_top(&head, "W");
  push_top(&head, "W");
  push_top(&head, "W");

  push_top(&head, "B");
  push_top(&head, "B");
  push_top(&head, "B");

  sort(&head);

  //show(head);

  return 0;
}

Z góry dziękuję za jakąkolwiek pomoc.

komentarz 14 czerwca 2021 przez tkz Nałogowiec (42,060 p.)
Ale przekombinowane. Lista jest wymogiem odgórnym?
komentarz 14 czerwca 2021 przez warzywko13 Użytkownik (840 p.)

@tkz, Niestety ale jest :(

komentarz 15 czerwca 2021 przez tkz Nałogowiec (42,060 p.)
Implementacji listy jest milion w internecie. https://www.geeksforgeeks.org/c-program-bubble-sort-linked-list/ pierwsze lepsze, rozwiązuje Twój problem tak naprawdę.
komentarz 15 czerwca 2021 przez warzywko13 Użytkownik (840 p.)
@tkz, Dzięki wielkie

1 odpowiedź

0 głosów
odpowiedź 15 czerwca 2021 przez warzywko13 Użytkownik (840 p.)

Super nie wyszło ale ważne, że sobie poradziłem smiley. Jakby ktoś kiedyś potrzebował:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
//struktura danych
typedef struct node {
  struct node *next;
  int data;
} node_t;

//dodawanie elementu do listy
void push_top(node_t **head, int data){
  node_t *current;
  current = (node_t *)malloc(sizeof(node_t));
 
  current->data = data;
  current->next=(*head);
  *head=current;
}
 
//wyświetlanie listy
void show(node_t *head){
  node_t *current=head;
 
  while (current != NULL){
    switch(current->data){
      case 1:
        printf("R");
        break;
      case 2:
        printf("W");
        break;
      default:
        printf("B");
        break;
    }
    current = current->next;
  }
  printf("\n");
}

//funkcja zamieniająca liczby
void swap(node_t *a, node_t *b){
  int temp = a->data;
  a->data = b->data;
  b->data = temp;
}
 
//sortowanie bąbelkowe
void sort(node_t **head){
  int swapped;
  node_t *ptr1;
  node_t *lptr = NULL;

  do{
    swapped = 0;
    ptr1 = *head;

    while(ptr1 -> next != lptr){
      if(ptr1 -> data > ptr1 -> next -> data){
        swap(ptr1, ptr1 -> next);
        swapped = 1;
      }
      ptr1 = ptr1 -> next;
    }
    lptr = ptr1;
  }while(swapped);
 
}
 
int main(){
  node_t *head;
  head = (node_t *)malloc(sizeof(node_t));
  head=NULL;

  char color[] = {'R', 'R', 'B', 'W', 'W', 'B', 'W', 'B', 'R'};
  //zamiana tablicy kolor na liczby
  size_t len = strlen(color);
  int number;
  for(int i=0; i<len; i++){
    if(color[i] == 'R'){
      number = 1;
    }else if(color[i] == 'W'){
      number = 2;
    }else{
      number = 3;
    }
    push_top(&head, number);
  }

  show(head);
  sort(&head);
  show(head);
 
  return 0;
}

 

Podobne pytania

0 głosów
0 odpowiedzi 401 wizyt
pytanie zadane 26 marca 2021 w C i C++ przez warzywko13 Użytkownik (840 p.)
+2 głosów
6 odpowiedzi 13,095 wizyt
pytanie zadane 8 listopada 2017 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
1 odpowiedź 189 wizyt
pytanie zadane 29 kwietnia 2020 w PHP przez Hub ert Nowicjusz (170 p.)

93,468 zapytań

142,403 odpowiedzi

322,705 komentarzy

62,848 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...