C++ láncolt lista felépítése

Fórumok

#include
#include

using namespace std;

struct Node
{
int ertek;
Node *next;
};

void berak(int i, Node *h);

int main()
{
Node *h = new Node();
Node *u = h;
int i;
do
{
cin >> i;
Node *p = new Node();
p->ertek=i;
u->next = p;
u = p;
//innen van vele gond! :(
while ( h->next!=NULL )
{
if ( u->ertek>i ) break;
h = h->next;
}
h->next = p->next;

}
while (i!=0);

while (h!=NULL)
{
Node *p = h;
h = p->next;
cout << p->ertek << " ";
delete p;
}
return 0;
}

A kérdésem az lenne, hogy lehet ebbe a listába növekvöleg befüzni az elemeket?
Sürgös lenne, vizsgán ezt kérik, és stl-t nem lehet használni :(
Köszi a sok segítséget!

Hozzászólások

A struktúra, amit létrehoztál, tartalmaz egy mutatót, ami a saját fajtájára mutat. Ez a mutató jelzi a következő elemet a láncban. Ha új elemet kell középre betenni, akkor a mutatót kell eszerint állítgatni. Van a C++ ban "Lista" is ilyen feladatokra, az nem jó neked?
--
unix -- több, mint kód. filozófia.
Life is feudal

Remélem jól értem a kérdést. Ez most mögéfűz:

elso - első elem a listában
akt - aktuális elem amit vizsgálunk
uj - új elem



akt = elso;
while(akt != NULL) {
  if(akt->ertek > uj->ertek) {
    uj->next = akt->next; // az új rákövetkezője lesz az aktuális következője.
    akt->next = uj; // aktuális az újra fog mutatni.
    break;
  }
  akt = akt->next;
}

Ez meg az akt elé:



akt = elso;
elozo = NULL;
while(akt != NULL) {
  if(akt->ertek > uj->ertek) {
    if(elozo != NULL)
      elozo->next = uj; // ha nem az első, akkor az előző után fog jönni az új
    else
      elso = uj;
    uj->next = akt; // az új rákövetkezője lesz az aktuális.
    break;
  }
  elozo = akt;
  akt = akt->next;
}

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

Bekopizom az en megoldasom is, bar kicsit ganyabb...


#include <iostream>

using namespace std;

class ListItem {

	public:
		ListItem(int value);
		~ListItem();	
		ListItem *next;	
		ListItem *prev;

	private:
		int val;

	friend class LinkList;
};

ListItem::ListItem(int value) {
	this->val = value;
	next = NULL;
	prev = NULL;
}

ListItem::~ListItem() {
	
}

class LinkList {
	
	private:

		ListItem *first;
		ListItem *last;
		
	public:

		LinkList();
		~LinkList();
		
		void addItem(int value);
		void dspList();
		
};

LinkList::LinkList() {
	first = NULL;
	last = NULL;
}

LinkList::~LinkList() 
{
	ListItem *itm1, *itm2;
	itm1 = first;
	
	while(itm1 != NULL) 
	{
		itm2 = itm1->next;
		delete itm1;
		itm1 = itm2;
	}
	first = NULL;
	last = NULL;
} 

void LinkList::addItem(int value) 
{
	ListItem *p, *p1, *uj;
	bool itemAdded = false;	// nyilvantartjuk, hogy az elem bekerult-e mar a listaba

	uj = new ListItem(value);
	
	if(first == NULL)	// ures a lista
	{
		first = uj;
		last = uj;
		itemAdded = true; 
	}
	else	//mar van elem a listaban
	{
		p = first;
		while(p != NULL)
		{
			if(value < p->val)
			{	// beszuras n. elem ele
				p1 = p->prev;
				if (p1 != NULL)
				{
					p1->next = uj;
					uj->prev = p1;
					uj->next = p;
					p->prev = uj;
					itemAdded = true;
				}
				else	// beszuras az 1. elem ele
				{
					uj->next = first;
					first->prev = uj;
					first = uj;
					itemAdded = true;
				}
			}
			
			if (itemAdded == true)
				break;	//sikerult beszurni a listaba az elemet

			p = p->next;
		}
		if (itemAdded == false)	//nem sikerult beszurni egy elem ele sem, igy a vegere kerul
		{
			last->next = uj;
			uj->prev = last;
			last = uj;
		}
	}
}

void LinkList::dspList() {

	ListItem *li;
	li = first;
	
	while(li != NULL) 
	{
		cout << li->val << endl;
		li = li->next;
	}
}

int main() {
	
	LinkList *lista = new LinkList;
	
	lista->addItem(0);
	lista->addItem(5);
	lista->addItem(3);
	lista->addItem(1);
	lista->addItem(2);
	lista->addItem(4);
	
	lista->dspList();
	
	return 0;
}

main-t at lehet irni, hogy addig addoljon, amig van input, blablabla...
--
A gyors gondolat többet ér, mint a gyors mozdulat.

C++-ban nem NULL, csak simán 0.

Biztosan hiba, hogy mikor létrehozod az új Node-ot, akkor a next-et nem nullázod ki (sehol), abban szemét van, tehát mikor 0-ra vizsgálsz a ciklusban, a program a ciklusból az utolsó elem után sem lép ki, így idővel SEGFAULT lesz a jutalmad.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Erről Bjarne Stroustrupot érdemes megkérdezni. :)

C++ programozási nyelv 5.1.1.:
"A nulla (0) az int típusba tartozik. A szabványos konverzióknak (§C.6.2.3) köszönhetõen a 0 integrális (§4.1.1), lebegõpontos, mutató, vagy "tagra hivatkozó mutató" típusú konstansként is használható. A típust a környezet dönti el. A nullát általában (de nem szükségszerûen) a megfelelõ méretû "csupa nulla" bitminta jelöli.Nincs olyan objektum, amely számára
a 0 címmel foglalnánk helyet. Következésképpen a 0 mutató-literálként viselkedik, azt jelölve, hogy a mutató nem hivatkozik objektumra.A C-ben a nulla mutatót (nullpointer) szokás a NULL makróval jelölni. A C++ szigorúbb típusellenõrzése miatt az ilyen NULL makrók helyett használjuk a sima 0-t, ez kevesebb problémához vezet."

Egyébként én úgy emlékszem, hogy pont fordítva van, mint mondtad, azaz C-ben ((void*)0) a NULL.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o