Przesunięcie wskaźnika na początek kolejki.

0

Witam
Mam problem z ustawieniem wskaźnika w kolejce na sam jej początek. Dodając elementy do kolejki, a następnie je usuwając program usuwa mi elementy ostatnie przez co działa to jako LIFO zamiast FIFO.

struct kolejka{
	
	int wartosc;
	kolejka *next; 
	
};

void dodaj(kolejka* *tail, int x)
{
	kolejka *w;
	w=new kolejka;
	w->wartosc=x;
	w->next=*tail;
	*tail=w;
		
}

void wyswietl(kolejka* tail)
{
	while(tail!=NULL)
	{
		cout<<tail->wartosc<<" -> ";
		tail=tail->next;
		
	}
	
	cout<<endl;
}

void usun(kolejka* &tail)
{
	kolejka *w;
	if(tail!=NULL)
	{
		w=tail;
		tail=tail->next;
		delete w;
		
	}
	
	else
	cout<<"Kolejka jest pusta"<<endl;
}

int main()
{
	srand(time(NULL));
	kolejka *tail=NULL;
	dodaj(&tail, 10);
	dodaj(&tail, 15); 
	dodaj(&tail, 20);
	dodaj(&tail, 25);
	dodaj(&tail, 30);
	wyswietl(tail);
	usun(tail);
	usun(tail);
	usun(tail);
	wyswietl(tail);
	
	
	
	return 0;
} 

user image
Dla przykładu plik usuwa mi cyfry 30, 25, 20 a chce zeby mi usuną cyfry 20, 15, 10.

Z góry dzięki za pomoc.

0

Musisz po prostu utworzyć osobny wskaźnik/obiekt struktury na początek kolejki i wg ustawić wskaźnik "wędrowny". Kolejka jest jednokierunkowa, więc "wstecznego" nie ma.

0
sig napisał(a):

Musisz po prostu utworzyć osobny wskaźnik/obiekt struktury na początek kolejki i wg ustawić wskaźnik "wędrowny". Kolejka jest jednokierunkowa, więc "wstecznego" nie ma.

Zrobiłem coś takiego tyle, że nie wiem dlaczego w funkcji usuń nie chce mi "wskoczyć" w if-a i wyświetla mi, że "kolejka jest pusta". Swoją drogą nie wiem czy ogólnie dobrze to zrobiłem.

struct kolejka{
	
	int wartosc;
	kolejka *next; 
	
};

void dodaj(kolejka* *tail, kolejka* *head, int x)
{
	kolejka *w;
	if(*tail==NULL)
	{
	w=new kolejka;
	w->wartosc=x;
	w->next=*tail;
	*tail=w;
	w=*head;
	}
	
	else
	{
		
		w=new kolejka;
		w->wartosc=x;//rand()%10;
		w->next=*tail;
		*tail=w;
		
		
	}	
}

void wyswietl(kolejka* tail)
{
	while(tail!=NULL)
	{
		cout<<tail->wartosc<<" -> ";
		tail=tail->next;
		
	}
	
	cout<<endl;
}

void usun(kolejka* &head, int n)
{
	kolejka *w;
	if(head!=NULL)
	{
		
		w=head;
		head=head->next;
		delete w;
		
	}
	else
	cout<<"Kolejka jest pusta"<<endl;
}

int main()
{
	kolejka *tail=NULL;
	kolejka *head=NULL;
	dodaj(&tail, &head, 10);
	dodaj(&tail, &head, 15); 
	dodaj(&tail, &head, 20);
	dodaj(&tail, &head, 25);
	dodaj(&tail, &head, 30);
	wyswietl(tail);
	usun(head, n);
	usun(head, n);
	usun(head, n);
	wyswietl(tail);
	
	
	
	return 0;
} 
0
#include <iostream>
using namespace std;
 
struct node { int value; node *next; };
struct queue { node *head,*tail; };
 
void add(queue &Q,int value)
  {
   node *tmp=new node;
   tmp->value=value;
   tmp->next=0;
   Q.tail=(Q.tail?Q.tail->next:Q.head)=tmp;
  }
 
void show(const queue &Q)
  {
   for(node *tmp=Q.head;tmp;tmp=tmp->next) cout<<tmp->value<<" -> ";
   cout<<endl;
  }
 
bool del(queue &Q,int &value)
  {
   if(!Q.head) return false;
   node *tmp=Q.head;
   Q.head=tmp->next;
   if(!Q.head) Q.tail=0;
   value=tmp->value;
   delete tmp;
   return true;
  }
 
int main()
  {
   queue Q={0,0};
   add(Q,10);
   add(Q,15); 
   add(Q,20);
   add(Q,25);
   add(Q,30);
   show(Q);
   int n;
   del(Q,n); cout<<n<<endl;
   del(Q,n); cout<<n<<endl;
   show(Q);
   return 0;
  }

http://ideone.com/EEDTmH

0

Dzięki piękne, wiesz dopiero co się uczę c++ i mam prośbę mógłbyś mi wytłumaczyć tą linijkę i te znaki co robią "?" i ":" w nawiasie.

_13th_Dragon napisał(a):
   Q.tail=(Q.tail?Q.tail->next:Q.head)=tmp;
0
Shulder napisał(a):

Dzięki piękne, wiesz dopiero co się uczę c++ i mam prośbę mógłbyś mi wytłumaczyć tą linijkę i te znaki co robią "?" i ":" w nawiasie.

_13th_Dragon napisał(a):
   Q.tail=(Q.tail?Q.tail->next:Q.head)=tmp;

?: - operator trójargumentowy
Całość oznacza:

if(Q.tail) Q.tail->next=tmp;
else Q.head=tmp;
Q.tail=tmp;

1 użytkowników online, w tym zalogowanych: 0, gości: 1