`
azyrock

C++ saistītais saraksts.

8 posts in this topic

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

vector / list / deque?

Share this post


Link to post
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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
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.

Share this post


Link to post
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ā)

Share this post


Link to post
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!

  • Kas ir tiešsaistē   2 biedri, 0 Anonīmi, 6 viesi (Skatīt pilnu sarakstu)

    • loli
    • rubb
  • Biedru statistika

    22 432
    Kopā biedri
    456
    Bieži tiešsaistē
    TomsMM
    Newest Member
    TomsMM
    Pievienojies