Wskaźniki

0

Mam fragment pewnego programu w zeszycie i prosilbym o wyjasnienie

pnode *insert(pnode *head)
{
       pnode*prev, *p = head;
      w.next=head;
       prev = &w;
...
 

Zaczynam nauke z programowaniem i prosilbym o pomoc. Ogolne zalozenie ma byc takie ze przesylam poczatek listy ( head) i tworze
sobie wartownika ktory pokazuje na head. Nastepnie tworze wskaznik prev ktory takze wskazuje na glowe.
Co nalezy poprawic w tym programie ?

0

Udalo mi sie to jakos naprawic i program dziala, problem jest tylko taki, ze za kazdym razem tworze obiekt typu w i na koniec zwaracam return w->next i nie mam gdzie zwolnic tej pamieci. Jak to naprawic ?

 
#include <iostream>
#include <algorithm>
using namespace std;
struct pnode
{
	int val;
	pnode *next;
};
pnode *insert(pnode *head, pnode *el)
{
	pnode *w = new pnode;
	w->next = head;
	pnode *prev = w;
	pnode *p = head;
	while(p && p->val < el->val)
	{
		prev=p;
		p=p->next;
	}

	prev->next=el;
	el->next=p;
	return w->next;
}
pnode *insertion_sort(pnode *head)
{
	pnode *sorted = NULL; // poki co pusta jest ta posortowana lista
	pnode *p = head;
	while(head)
	{
		p = head; // wez pierwszy element z brzegu
		head=head->next;
		sorted = insert(sorted,p); // wstaw do posortowanej listy
	}
	return sorted;
}
int main()
{
	pnode *head=NULL;
	int x;
	for(int i=0;i<10;i++)
	{
		cin >> x;
		pnode *n = new pnode;
		n->val=x;
		n->next=head;
		head=n;
	}

	head = insertion_sort(head);
	while(head)
	{
		cout << head->val << " ";
		head=head->next;

	}


}
0

Bo jak wypisujesz listę albo cokolwiek innego z nią robisz to NIE modyfikuj heada tylko jakiś tymczasowy wskaźnik. Tak zebyś zawsze miał wskaźnik na head. Wtedy możesz sobie zwolnić pamięć przeskakując od heada do końca listy.

0
pnode *insert(pnode *head, pnode *el)
  {
   pnode *prev=NULL;
   pnode *p=head;
   while((p)&&(p->val<el->val))
     {
      prev=p;
      p=p->next;
     }
   el->next=p; // tego nie było
   if(prev) prev->next=el;
   else head=el;
   //zamiast poprzedniego if/else można dać: (prev?prev->next:head)=el;
   return head; // tu było zwrócenie el
  }
0

Shalom, ok bede pamietac zeby nie modyfikowac, dzieki. Tylko ze nie o to pytalem zakladajac ten watek a o instrukcje wewnatrz funkcji insert
_13th_Dragon, sprobowalem zrobic w ten sposob i to nie dziala
Konkretnie nie wiem co miales na mysli w tych 3 linijkach

  1. if(prev) prev->next=el;
    Ustawiles wczesniej prev na null i gdy bylo jako przesuniecie tzn wstawialismy el nie na poczatek listy to prev jest teraz gdzies w srodku. I tu sie zgodze ze prev->next = el
    Powinno byc jeszcze el->next = p ?

  2. else head=el;
    // jesli wstawiany element jest najmniejszy to ustawiamy go na glowe, ale to nie powinno byc cos w stylu el->next = head; i potem head=el ?

  3. return el; // to juz nie mam pojecia, zgodze sie jak to bylby 1 element gdyz musze zwrocic poczatek listy

Poprawiajac to doszedlem do tego

pnode *insert(pnode *head, pnode *el)
  {
   pnode *prev=NULL;
   pnode *p=head;
   while((p)&&(p->val<el->val))
     {
      prev=p;
      p=p->next;
     }
   if(prev) 
	   {
		   prev->next=el;
		   el->next=p;
		}
   else 
	   {
		   el->next=head;
		   head=el;
		}
   return head;
  }
 

Problem w tym ze na zajeciach robilismy to podobnie, ale prowadzacy powiedzial ze lepiej zamiast stosowac konstrukcje if..else zastosowac tego wartownika

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