Pālekt uz saturu


Foto
- - - - -

C++ saistītais saraksts.


  • Please log in to reply
7 murgojumi pa šo tēmu

#1 azyrock

azyrock
  • Biedri
  • 55 purkšķi
  • Atrodos:Aizkraukle

Sacūkots 10 April 2012 - 21:55

Kāds var palīdzēt ar šo daļu? Izveidot šadu funkciju void liktuzBeigam(int n);

Nosacījums: Uzrakstīt funkciju, kas pārvieto saraksta n-to elementu
uz saraksta beigām. Darbība jāveic, pārkabinot saites, nevis
pārrakstot elementu vērtības.


#include <iostream>
using namespace std;
// Klase Elem - saraksta elements
class Elem
{
public:
int num;
Elem *next;
Elem (int n) { num = n; next = NULL; };
};// Klase List - saistiits vienvirziena saraksts
class List
{
protected:
    Elem *first, *last;
public:
    Elem *current;
public:
    List () { first = last = current = NULL; };
    void add_element (int n); // pievieno beigaas
    void delete_element ();   // izmet no saakuma
    int is_empty () { return (first == NULL); };
    void start () { current = first; };
    int end () { return (current == NULL); };
   void next(){if (!end())current = current -> next;};
   void print();
   void liktuzBeigam(int n);
};int main()
{
  List l;
  int k;
  cout << "Ievadi saraksta elementu (0,lai beigtu):\n";
  cin >> k;
  while (k!=0)
  {
    l.add_element (k);
    cout << "Ievadi saraksta elementu (0, lai beigtu):\n";
    cin >> k;
  };
   
    l.liktuzBeigam(2);
    l.print();
  while (!l.is_empty())
  {
    l.delete_element ();
  };};
void List::add_element (int n)
{ // maina current vertibu, lai raadiitu uz jauno elementu
    Elem *p = new Elem (n);
    if (first == NULL) first = last = p;
    else last = last -> next = p;
    current =p;
};void List::delete_element ()
{ // saglabaa current veertiibu (nomaina uz saakumu,ja raadiija uz izmetamo)
    Elem *p = first;
    if(!is_empty())
    {   if (current == first) current = first-> next;
	    first = first -> next;
    delete p;
    if(is_empty())last = NULL;
    }
};
void List:: print()
{
for (start(); !end(); next())
    cout << current->num << endl;
cout << endl;
  }



Nevēlies vairs redzēt šo reklāmu? Kļūsti par BOOT.Lv foruma biedru!

#2 azyrock

azyrock
  • Biedri
  • 55 purkšķi
  • Atrodos:Aizkraukle

Sacūkots 24 April 2012 - 11:45

Seriously, neviens nevar palīdzēt? :O

#3 Baigais Janka

Baigais Janka
  • Biedri
  • 3,247 purkšķi
  • Atrodos:Rīga
  • Intereses:Programmēšana, compūteri, alus... mhm... jebšu otrādi?

Sacūkots 24 April 2012 - 12:46

Uzdevums ir vairāk kā vienkāršs :) Bet nu baigais slinkums kodu pētīt. Kur ir problēma? Tavā vietā vienkārši funkciju uzrakstīt? Nu, piedodiet :)

#4 kroko

kroko
  • Biedri
  • 342 purkšķi
  • Atrodos:rīga / vīne / zeichnensaal 7

Sacūkots 24 April 2012 - 13:12

vector / list / deque?

#5 azyrock

azyrock
  • Biedri
  • 55 purkšķi
  • Atrodos:Aizkraukle

Sacūkots 24 April 2012 - 13:44

Es nezinu, kā lai realizē to funkciju. Esmu ticis šitik tālu:
void List::liktuzBeigam(int n)
{
previous = NULL;
current = first;
for (int i=1; i<=n; i++)
{
  current = previous;
  current = current->next;
}
previous->next = current->next;
current->next = NULL;
last->next = current;
last = last->next;
};
Bet protams f-ja nestrādā, jautāju pēc padoma.

#6 Baigais Janka

Baigais Janka
  • Biedri
  • 3,247 purkšķi
  • Atrodos:Rīga
  • Intereses:Programmēšana, compūteri, alus... mhm... jebšu otrādi?

Sacūkots 24 April 2012 - 14:05

Pirmkārt - jāatrod vajadzīgais elements. OK, to Tu dari, bet Tev tā padarīšana jau cikla sākumā lido laukā.

previous = NULL;
current = first; // jēga, ja nākošā darbība viņu izmaina? EDIT - ā, indeksācija no 0 tomēr domāta, tad nosarkstu :)

un ciklā

current = previous; // NULL
current = current->next; // current = NULL->next

Nedaudz pasmirdēja Baigais Janka: 24 April 2012 - 14:16


#7 japets

japets
  • Biedri
  • 511 purkšķi

Sacūkots 24 April 2012 - 14:06

Skaiti uz pirkstiem un skaties ko Tavs kods dara (ja neproti DEBUG-ot no izstrādes vides).
Gandrīz jau ir pareizi.
Skaties, kas notiek pirmo reizi ieejot for ciklā.
"current = previous" < previous satur NULL, līdz ar to current tiek piešķirts NULL!!! Nākamā rindiņa jau ir nelegāls izsaukums.

Vēl neaizmirsti, ka ir nepieciešams atsevišķi apstrādāt gadījumu, ja tiek pārvietots pirmais elements.

#8 valka

valka
  • Jaunbiedri
  • 17 purkšķi

Sacūkots 24 April 2012 - 16:13

:wacko2:

A normālus destruktorus `Elem` un `List` klasēm uzrakstīt par grūtu?

Kā jau pieminēts, domā pa soļiem:
1) pieglabā galvas adresi
2) pārrauj saites un sakārto jauno galvu tā, lai tā pēc tādas arī izskatās,
3) piespraud veco galvu no (1) astē un sakārto (protip: tev tak ir `List::last`; liec to lietā)


 
 
 
 


0 Keksi snaikstās ap šo sviestu

0 keksi(s), 0 pacani(s), 0 anonīmi(s) alkololiķi(s)