Pereiti prie turinio

C++ ištrinti atsitiktinius ob iš susieto sąrašo


Rekomenduojami pranešimai

Sveiki, esmė tokia: programa generuoja vis naujus objektus (turiu galvoj OOP programavimą), juos sudeda į susietą sarašą(linked list'ą), kai objektų saraše yra 1000 reikia ištrinti atsitiktinius 500 iš jų. Iškart į galvą šovė pats paprasčiausias sprendimas naudoti ciklus, kažkas tokio:

void linkedList::deleteElements(linkedList *head){

   linkedList *current = head, *previous = head;

   for(int i = 0; i < numberOfObjects; i++){
      int r = rand() % numberOfObjects + 1;
      for(int j = 1; j < r; j++){
               previous = current;
               current = current.next;
           }
           previous.next = current.next;
           current.next = NULL;
           delete current;
           numberOfObjects--;
           current = head; previous = head;
   }
}

 

Klausimas ar šis metodas veiktų ir ar nėra geresnio, greitesnio metodo? Beto ar užtenka delete current, jei vienas sąrašo elentas saugoja, tarkime, 10 kintamųjų?

Redagavo Sirius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui už atsakymą, turėjai galvoje kažką panašaus?

void linkedList::deleteElements(){
   linkedList *prev = head;
   linkedList *current = head;

  while(numberOfObjects > 500){
      int r = rand() % 3 + 1;

      if(r == 1){
           previous.next = current.next;
           current.next = NULL;
           delete current;
           numberOfObjects--;
           current = previous.next;
      } else {
          prev = current;
          current = current->next;
      }

      if(current == NULL) {
          current = head;
          prev = head;
      }
  }
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui už atsakymą, turėjai galvoje kažką panašaus?

void linkedList::deleteElements(){
   linkedList *prev = head;
   linkedList *current = head;

  while(numberOfObjects > 500){
      int r = rand() % 3 + 1;

      if(r == 1){
           previous.next = current.next;
           current.next = NULL;
           delete current;
           numberOfObjects--;
           current = previous.next;
      } else {
          prev = current;
          current = current->next;
      }

      if(current == NULL) {
          current = head;
          prev = head;
      }
  }
}

Taip butent tai ir turejau galvoje

Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • po 2 savaičių...

Nekuriant naujos temos turiu dar vieną klausimą. bunnyList.cpp faile niekur negaliu pasiekti noOfBunnies kintamojo, klaida: "undefined reference to bunnyList::noOfBunnies". Klaida kartojasi 4, 44, 11 eilutėse, ten, kur pridėjau brukšnelių.

Kodas:

bunnyList.cpp

#include "bunnyList.h"

bunnyList::bunnyList(){
noOfBunnies = 0; <------------------------------------------
}

void bunnyList::killHalfBunnies(){
node *prev = head;
   node *current = head;

while(noOfBunnies > 500){ <-----------------------------------------
	if(getRandomNumber(3) == 1){
           deleteNode(prev, current);
	} else {
		prev = current;
		current = current->next;
	}
if(current == NULL){
	current = head;
	prev = head;
   }
}
}

void bunnyList::newBunny(std::string color){
node *bunny = new node();
node *temp = head;

if(color == ""){
	bunny->color = getRandomColor();
} else {
	bunny->color = color;
}

bunny->name = getRandomName();
bunny->age = 0;

while(temp != NULL){
	temp = temp->next;
}

   temp = bunny;
   delete bunny;
noOfBunnies++;           <------------------
}

void bunnyList::increaseAgeAndKill(){
   node *current = head;
   node *prev = head;
   while(current != NULL){
       current->age++;
       if(current->age > 10){
           deleteNode(prev, current);
       }
       current = current->next;
   }
}

void bunnyList::deleteNode(node *prev, node *current){
   if(current==head){
       head = current->next;
       prev = head;
       delete current;
       current = head;
   } else if(current->next==NULL){
       delete current;
       prev->next = NULL;
       current = NULL;
   } else {
       prev->next = current->next;
       current->next = NULL;
       delete current;
       current = prev->next;
   }
}

std::string bunnyList::getRandomName(){
int r = getRandomNumber(numOfNames - 1);
return names[r];
}

std::string bunnyList::getRandomColor(){
int r = getRandomNumber(numOfColors - 1);
return colors[r];
}

int bunnyList::getRandomNumber(int limit) const{
srand(time(NULL));
return rand() % limit + 1;
}

bunnyList.h

#ifndef BUNNYLIST_H
#define BUNNYLIST_H

#include <stdlib.h>
#include "node.h"
#include <time.h>
#include <string>

const int numOfNames = 4;
const int numOfColors = 2;
const std::string colors[numOfColors] = {"Black", "White"};
const std::string names[numOfNames] = {"Joe", "Rafael", "Buby", "Messi"};

class bunnyList{
private:
static int noOfBunnies;
node *head;
public:
bunnyList();

void newBunny(std::string);
void killHalfBunnies();
void increaseAgeAndKill();
void deleteNode(node*, node*);

int getRandomNumber(int) const;
std::string getRandomColor();
std::string getRandomName();
};

#endif

 

Jei kam įdomu, darau paskutinį pratimą šiame sąraše "Graduation"

Redagavo Sirius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui, padėjo. Kame čia buvo problema? Jei įmanoma paaiškink, būsiu dar dėkingesnis.

noOfBunnies yra statiskas kintamasis, jis negali igyti pradines reiksmes klases viduje, isskyrus const static. Taigi, noOfBunnies reikia aprasyti uz klases ribu su jau zinoma pradine reiskme, nes noOfBunnies yra visu bunnyList klases objektu kintamasis, issaugantis ta pacia reiskme. Juk nebus vieno objekto noOfBunnies = 1, o kito noOfBunnies = 4, ar ne?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...