» »

[C] Povezani seznami in kazalci

[C] Povezani seznami in kazalci

Good Guy ::

Ok lepo bi prosu če ma kdo kje kakšen postopek(če je grafično še toliko bolje) kako skačejo pointerji po elementih v seznamu ker se mi niti sanja ne kako...

vse od začetka do konca..

npr pri tem programu(en u izi sam tok da zakapiram))

HVALA!


void Push(int item)
{
tmp=(struct element*)malloc(sizeof(struct element*));
tmp->data=item;
Start=tmp;
}
http://goo.gl/7ItKpU
Naj računalnik dela za vas^^
  • spremenilo: snow ()

NoUse4AName ::

malloc(sizeof(struct element*));

narobe. Ti rezerviras prostor ki je tako velik kot je velik kazalec na element. Moras pa rezervirat prostor ki je tako velik kot element. Torej brez *.
Drugače pa ima vsaka knjiga kazalce lepo razložene. Poglej si. Tu ti bo verjetno kdo dal kodo, ampak če seznama ne znaš sam napisat, kazalcev ne razumeš in jih verjetno tako dolgo ne boš dokler sam ne boš napisal seznama.

Good Guy ::

sej lihk to je problem jst znam napisat sezname za urejene in neurjene(na pamet) sam k ne razumem teh kazalcem in njihovih premetavanj
http://goo.gl/7ItKpU
Naj računalnik dela za vas^^

BigWhale ::

Ja, kazalc gre od prvega k tazadnjemu ce mas v for zanki i++ in od zadnjega k prvemu, ce mas v for zanki i--

;)

bozjak ::

ok vsi te po knjige posilajo zato ti bom probov jst razlozit... pa zaceu bom na zacetku...

struct seznam {
char vsebina[100];
struct seznam *vez;
} *prvi, *element;

ok, tuki ustvars strukturo torej en element tvojga seznama... Ne smes pozabt da vedno rabs prvi ("*prvi") element seznama, kr če ne, ne boš vedu kje se le ta začne... kazalec "*element" pa je tisti kazalec, ki se bo v resnici sprehajal čez sezname...

potem ko pac beres / vpisujes in podalsujes ta seznam (to domnevam da znas) povezujes vsak element "*vez" na naslov naslednjega elementa v seznamu. torej:

element->vez = (struct seznam *)malloc (sizeof(struct seznam));
element = element->vez;
element->vez = NULL;

Vrjetno ti je ravno ta korak najbolj nerazumljiv... V prvi vrstici si ustvaris nov element seznama. Druga vrstica je potrebna zato, da premaknes svoj "stevec" na nasledn element, kot bi v for zanki napisov "i++"... Tretja vrstica pa je potrebna zato, da "vez" ne kaze "kr nekam" ampak nikamor, in s tem pri prebiranju vemo kdaj koncati zanko.

in tako s pomocjo pointerja element podalsujes svojo bazo. Potem pa prides do funkcije (jst jo bom napisov kr s pomovojo for zanke) k ti gre skoz ceu seznam...

for(element = prvi; element->vez != NULL; element=element->vez) {
printf("evo vsebine: %s", element->vsebina);
}

tuki si izpisov vsebino vsga tvojga seznama... Zaceu si na zacetku in s pomocjo kazalca "prvi" si vedel kje je ta zacetek. Vsak del seznama vsebuje kazalec "vez" ki kaze na nasleden element seznama, vse kar moras narediti ti je da kazalec pomikas na nasleden element...

Zelo pomembno je, da vsakemu novemu elementu postavis kazalec "vez" na NULL, kr ce ne ne bos vedel kdaj zanko koncati...

Upam, da je zadost nazorno razlozeno, ce ne pa me bo kdo se dopolnil... Lp

[Gundi edit: enkrat si rekel "kaz" enkrat "vez"...]

Zgodovina sprememb…

  • spremenil: Gundolf ()

Gundolf ::

No pa se dodatek k bozjaku, da ne bos bugov iskal...
...

void pobrisi(struct seznam* kmaluBivsi) {
   if (kmaluBivsi != NULL) {
      pobrisi(kmaluBivsi->vez);
      free(kmaluBivsi);
   }
}

int main() {
   // initializacija oz. ustvarjanje seznama
   prvi = (struct seznam *)malloc (sizeof(struct seznam));
   element = prvi;
   prvi->vez = NULL:

   // delo s seznamom
   ...

   // brisanje seznama
   pobrisi(prvi);
}


Še malo komentarja - ce bi tiste bozjakove spremenljivke naredil lokalne (definicijo premaknil recimo v main) bi bilo pa se toliko boljše. In pa nikoli ne pozabi na brisanje.

sid_dabster ::

Najprej si poglej, kako sploh v osnovi deluje mikroracunalnik. Potem si poglej c. Potem bos lahko vse probleme resil sam, ker bos tocno vedel, zakaj so stvari taksne kot so.
Fallen beyond all grace deeper and deeper
The sound of her own blood dripping
Like sacred tears from a bleeding rose...( Embraced, Within)

Good Guy ::

kaj ma mikroračunalnik s tem kazalci?

Tnx za help bom mal preštudiru zdej:D :D
http://goo.gl/7ItKpU
Naj računalnik dela za vas^^

snow ::

Če študiraš low level delovanje mikrokontrolerja si prideš na jasno kako je s tem spominom in temi pointerji in se potem tolčeš po glavi, kako si bil lahko tak bedak, da si nekje v eni svoji stari kodi kr nekaj delal s temi pointerji.

Nekako tako si razlagam ta namig glede mikrokontrolerjev.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

klemen22 ::

Rovtar: kazalce imate za šolo al kako? Ker če se to učiš za svoje znanje in ne moreš poštekati stvari iz kakšne knjige ali tutoriala ti svetujem da se nehaš ukvarjati s Cjem. In raje presedljaj na kakšen VisualBasic. Ker če imaš probleme že z tistim kao primerom zgoraj potem bolje da ne gledaš teh stvari. Pa ne da sem sarkastičen samo tako pač je. Pa ne zamirt.

sej lihk to je problem jst znam napisat sezname za urejene in neurjene(na pamet) sam k ne razumem teh kazalcem in njihovih premetavanj

Ta stavek me je precej zbodel v oči. Pa kaj si te neurejene in urejene sezname na pamet učil al kako? In kazalce se ne premetava oz. se ne premetavajo.

No še ena pozitivna in spodbudna stvar za Rovtarja in hkrati žalostna stvar:
porazno je to da eni v 4em letniku UNI računalništva ne razumejo kaj so to kazalci. So bli pri nas taki primeri.
Motiti se je človeško, odpuščati pa božje. Torej ti odpuščam ;)

Zgodovina sprememb…

  • spremenil: klemen22 ()

OwcA ::

Ta kult kazalcev si mi zdi rahlo zgrešen dan danes. Roko na srce, veliki večini se s kazalci ni potrebno pretirano obremenjevati. Ni vse samo neke nizkonivojske optimizacije, v večini primerov dober algoritem bolj zaleže.
Otroška radovednost - gonilo napredka.

Good Guy ::

@klemen22 ko boš ti do tok daleč prlezu se oglaši...
@snow to ni asembler..

to rabim za šolo ja.. tko da kle ni šanse da bi prešaltu na VB
http://goo.gl/7ItKpU
Naj računalnik dela za vas^^

klemen22 ::

@klemen22 ko boš ti do tok daleč prlezu se oglaši...

Hehe. Dobr si me nasmejal Rovtar. Pa veš da bolj osnovne kode (ok razn Hello World), praktično ne moreš podati.:))

Btw. kaj pa študiraš če smem vprašati? Si na FRIju al kako?
Motiti se je človeško, odpuščati pa božje. Torej ti odpuščam ;)

Zgodovina sprememb…

  • spremenil: klemen22 ()

CCfly ::

Ta kult kazalcev si mi zdi rahlo zgrešen dan danes. Roko na srce, veliki večini se s kazalci ni potrebno pretirano obremenjevati. Ni vse samo neke nizkonivojske optimizacije, v večini primerov dober algoritem bolj zaleže.

Kot offtopic dopolnilo, Joel je dobro opisal problem, zakaj morajo programerji poznati tudi kazalce:
The Perils of JavaSchools
"My goodness, we forgot generics!" -- Danny Kalev

Good Guy ::

klemen lol :D sem na srednji klemparski pa mamo pri info v prvem letniku info....
http://goo.gl/7ItKpU
Naj računalnik dela za vas^^

l0g1t3ch ::

evo ti en neurejen seznam z funkcijami za dodajanje na začetek na konec za brisanje elementa brisanje večih istih elementov in praznjnje seznama


#include <stdio.h>
#include <stdlib.h>
struct element
{
int vrednost;
struct element *naslednji;
};

void izpisi(struct element *p)
{
	while( p!=NULL ) 
	{
		printf("%d ", p->vrednost);
		p = p->naslednji;
	}
	printf("\n");
}

int poisci(struct element *p, int vred)
{
	while( (p!=NULL) && (p->vrednost!=vred) )
		p = p->naslednji;
	
	if(p!=NULL)
	return(1);
	else
	return(0);
}

struct element *dodajZacetek(struct element *p, int vred)
{
	struct element *q;
	q = (struct element*) malloc(sizeof(struct element));
	q->vrednost = vred;
	q->naslednji = p;
	return(q);
}

struct element *dodajKonec(struct element *p, int vred)
{
	struct element *q, *r;
	q = (struct element*) malloc(sizeof(struct element));
	q->vrednost = vred;
	q->naslednji = NULL;
	if (p == NULL)
		return(q);
	
	r = p; // p ni prazen seznam
	while( r->naslednji!=NULL )
		r = r->naslednji;
		
	r->naslednji = q;
	return(p);
}
struct element *brisi(struct element *p, int vred)
{
	struct element *q, *r;
	if( p==NULL )
		return(p);

	if( p->vrednost==vred )
	{
		r = p;
		p = p->naslednji;
		free(r);
		return(p);
	}
	
	q = p;	
	while( (q->naslednji!=NULL)&&(q->naslednji->vrednost!=vred) )
		q = q->naslednji;
		
	r = q->naslednji;
	if( r!=NULL ) 
	{
		q->naslednji = r->naslednji;
		free(r);
	}
	return(p);
}
struct element *brisiVse(struct element *p, int vred)
{
	struct element *q, *r;
	while( (p!=NULL) && (p->vrednost == vred) )
	{
		r = p;
		p = p->naslednji;
		free(r);
	}
	
	if (p == NULL )
		return(p);
		
	q = p;
	while( q->naslednji!=NULL ) 
	{
		if( q->naslednji->vrednost == vred)
		{
			r = q->naslednji;
			q->naslednji = r->naslednji;
			free(r);
		}
		else
			q = q->naslednji;
	}
	return(p);
}
struct element *izprazni(struct element *p)
{
	struct element *r;
	while( p!=NULL ) 
	{
		r = p;
		p = p->naslednji;
		free(r);
	}
	return(p);
}

main() 
{
	struct element *zacetek;
	int i;
	zacetek = NULL;
	
	for(i=1; i<6; i++) 
	{
		zacetek = dodajZacetek(zacetek,i);
		izpisi(zacetek);
	}
	
	for(i=1; i<6; i++) 
	{
		zacetek = dodajKonec(zacetek,i);
		izpisi(zacetek);
	}
	
	zacetek = dodajKonec(zacetek,0);
	izpisi(zacetek);
	zacetek = brisi(zacetek,5);
	izpisi(zacetek);
	zacetek = brisiVse(zacetek,3);
	izpisi(zacetek);
	
	if( poisci(zacetek,0) == 1)
		printf("Element 0 je v seznamu.\n");
	else
		printf("Elementa 0 ni v seznamu.\n");
		
	zacetek = brisiVse(zacetek,0);
	izpisi(zacetek);
	
	if( poisci(zacetek,0) == 1)
		printf("Element 0 je v seznamu.\n");
	else
		printf("Elementa 0 ni v seznamu.\n");
		
	zacetek = izprazni(zacetek);
	printf("Na koncu je seznam prazen:\n");
	izpisi(zacetek);
	
	system("pause");
}


Upam d ti bo kej pomagal so lepo napisane vse funkcije pa še uporabo maš pol nakazano

Good Guy ::

ok mal mi je že jasn :D :D

kaj pomen recmo Start=Start->nasl kva s tem povemo?

Jebat ga ne gre mi u bučo :D
http://goo.gl/7ItKpU
Naj računalnik dela za vas^^

bozjak ::

ok lej... veš kaj kazalci delajo, kako so zgrajeni in vse to, ne?

Torej mors razumet samo kaj se dogaja v tej zanki... Ta tvoj "univerzalen" kazalc kaze na dolocen element v tvojem seznamu... in ker ne ves dolzine seznama (ker je ta dinamicno grajen) ne mores met obicajnega stevca/pogoja...

Zato si pomagas tako, da imas v tvojmu elementu pointer, ki kaze na nasledn element... Ce si hocs predstavlat je to tko kot da bi meu miljon listkov, in vsak bi biu z vrvicami povezan na naslednga...

S korakom "Start=Start->nasl" ubistvu povleces to vrvico za eno mesto... Torej v tvoj univerzaln pointer preprosto vneses naslov naslednjega elementa v pomnilniku...

Mislm da ti bolj nazorno ne mormo razlozit, tko da ce ti ne gre v glavo si bos mogu prebrt kaksno bukvo oz. (ce gre za solo) najt instruktorja k ti bo to v zivo vtepov v glavo dokler ne bos razumeu... Lp

64202 ::

I am NaN, I am a free man!

Good Guy ::

no ot kapiram start=start->nasl;

kva pa če mam recmo tmp->data=item (item je stevilo ki ga vnesemo)

kva kle podamu item kazalcu?
TNX!
http://goo.gl/7ItKpU
Naj računalnik dela za vas^^

OwcA ::

Če je item število in če je koda pravilna, potem je tudi data število in gre za vrednost, ki jo hraniš v svojem seznamu.
Otroška radovednost - gonilo napredka.

l0g1t3ch ::

zdej pa še mene neki zanima če mam strukturo poimenovano z typedef mi vrže prevajalnik opozorilo če pišem struct oseba brez typedef pa zdeva dela zakaj tako ?

takole javi opozorilo: [Warning] assignment from incompatible pointer type v vrstici 12
#include <stdio.h>
#include <stdlib.h>
typedef struct 
{
	int vrednost;
	struct element *naslednji;
}element;

element *dodajZacetek(element *p, int vred)
{
	element *q;
	q = (element*) malloc(sizeof(element));
	q->vrednost = vred;
	q->naslednji = p;
	return(q);
}


main() 
{
	element *zacetek;
	int i;
	zacetek = NULL;
	
	for(i=1; i<6; i++) 
	{
		zacetek = dodajZacetek(zacetek,i);

	}
}


pomoje zarad tega ker je v strukturi struct element *naslednji;
Kaj to pomeni da nemorm poimenovat strukture z typedef in morm vedno pisat struct in naprej al jest kej nevem

bozjak ::

typedef je ukaz in zato ne mors porabt kot ime... Lahk pa nardis nov podatkovni tip, torej tvojo strukturo...

typedef struct {} ime;

in pol lahk nardiš:

ime razred[50];

in maš tabelo 50 struktur v tabeli... seveda pa bi to lahk naredu tud brez tega, sam pol morš klicat:

strict ime {};

struct ime razred[50];

tko da ni neke bistvene razlike dokler tega ne vklučuješ naprej v nove strukture, oz. napišeš ogromnkrat...

Lp

l0g1t3ch ::

sm ze ugotovu vseen hvala za odgovor

struct person
{
char ime[20];
char priimek[20];
char tel[20];
struct person *next;
};

typedef struct person oseba;


tkole lepo dela tak kot si ti reku

Good Guy ::

on tnx pobje ful ste mi pomagal :D v šoli je zdej kul :D
http://goo.gl/7ItKpU
Naj računalnik dela za vas^^


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C strukture, kazalci naloga pomoc

Oddelek: Programiranje
51410 (1305) DavidJ
»

[c++]Seznam

Oddelek: Programiranje
142599 (2599) Gundolf
»

[C++] Linker error

Oddelek: Programiranje
51239 (1239) Quikee
»

[C] Narascajoce sortiranje linearnega seznama

Oddelek: Programiranje
71796 (1685) Jebiveter
»

[NALOGA][C] fri-vsp - strukture (struct)

Oddelek: Programiranje
101492 (1333) Vesoljc

Več podobnih tem