#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!
- 10048 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
Az nem az STL-ben van?
Gondolom az algoritmikus képességet kérik épp számon.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
[buta_mode_ON]
Csak tisztanlatas celjabol megkerdezem, miert 0 (zero) es nem NULL?
C-ben ugye NULL == 0, C++-ban pedig NULL == ((void*)0)?
Szerk.: ennek utanaolvasvan, nem egeszen biztos, hogy igy van ez...
[buta_mode_OFF]
--
A gyors gondolat többet ér, mint a gyors mozdulat.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni