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

Problem flagi - lista C

Object Storage Arubacloud
0 głosów
458 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,000 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,000 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 217 wizyt
pytanie zadane 26 marca 2021 w C i C++ przez warzywko13 Użytkownik (840 p.)
+2 głosów
6 odpowiedzi 11,463 wizyt
pytanie zadane 8 listopada 2017 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
1 odpowiedź 139 wizyt
pytanie zadane 29 kwietnia 2020 w PHP przez Hub ert Nowicjusz (170 p.)

92,554 zapytań

141,399 odpowiedzi

319,535 komentarzy

61,938 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...