Jump to content

C++ saistītais saraksts.


azyrock
 Share

Recommended Posts

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

Link to comment
Share on other sites

  • 2 weeks later...
Baigais Janka

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 :)

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Baigais Janka

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

Labots - Baigais Janka
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

: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ā)

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...