|
[ dontoo @ 22.03.2010. 12:33 ] @
| Program mora imati funkcije Dodaj_na_pocetak_liste i Dodaj_na_kraj_liste. Također mogu korstiti samo jednu strukturu za listu ( dakle prenosim dvostruke pointere ). Sad napisao sam obe funkcije i obe funkcije rade zasebno. Stvar je u tome da kad koristim jednu pa drugu funkciju tijekom izvođenja programa one pobrkaju varijable. U komentarima koda je dano objašnjenje. Problem pravi krivo inicijalizirana *prev varijabla.
Code:
#include <stdio.h>
#include <stdlib.h>
struct Data
{
int x;
int y;
struct Data * next;
};
void AddBeginning ( Data **, Data **, Data ** );
void AddEnd ( Data **, Data **, Data ** );
void Insert ();
void Remove ();
void ShowList ( Data ** );
void Search ();
int main ( void )
{
int menu = 0;
struct Data * head, * prev, * current;
head = NULL;
while ( menu != 7 )
{
printf ( "Add at beginning - 1\nAdd at end- 2\nInsert - 3\nRemove - 4\nSearch - 5\nShow - 6\nEnd Program - 7\n" );
scanf ( "%d", &menu );
switch ( menu )
{
case 1:
AddBeginning ( &head, &prev, ¤t );
break;
case 2:
AddEnd ( &head, &prev, ¤t );
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
ShowList ( &head );
break;
default:
break;
}
}
return 0;
}
void AddBeginning ( struct Data ** head, struct Data ** prev, struct Data ** current )
{
* current = ( struct Data * )malloc ( sizeof ( struct Data ) );
scanf ( "%d", &(* current )->x );
scanf ( "%d", &(* current )->y );
if ( * head == NULL ) //Ako je već pozvana funkcija AddEnd tada head nije NULL
{
* head = * current;
(* current)->next = NULL;
}
else
{
* head = *current;
(* head)->next = * prev; //To pravi problem ovdje jer * prev nije inicijaliziran na * head
}
* prev = * head; //Kako ova funkcija nikada nije izvedena ni *prev nije incijaliziran na *head
}
void AddEnd ( struct Data ** head, struct Data ** prev, struct Data ** current )
{
* current = ( struct Data * )malloc ( sizeof ( struct Data ) );
scanf ( "%d", &(* current )->x );
scanf ( "%d", &(* current )->y );
if ( * head == NULL ) //Head nije NULL ako je već pozvan funkcija AddBeginning
* head = * current;
else
(* prev )->next = *current; //Ista stvar ovdje, ako je pozvan funkcija AddBeginning tada * prev nije inicijaliziran na * current
(* current )->next = NULL;
* prev = * current;
}
void ShowList ( struct Data ** head )
{
struct Data * current;
current = *head;
while ( current != NULL )
{
printf ( "x = %d y = %d\n", current->x, current->y );
current = current->next;
}
}
[Ovu poruku je menjao dontoo dana 22.03.2010. u 13:45 GMT+1] |
[ dontoo @ 22.03.2010. 13:02 ] @
Smislio sa nešto za jednu funkciju, ali ne znam za drugu. Dodao sam varijablu tail, ali ne znam kako da pamtim zadnji element
Code: void AddBeginning ( struct Data ** head, struct Data ** tail, struct Data ** prev, struct Data ** current )
{
* current = ( struct Data * )malloc ( sizeof ( struct Data ) );
scanf ( "%d", &(* current )->x );
scanf ( "%d", &(* current )->y );
if ( * head == NULL )
{
* head = * current;
(* current)->next = NULL;
}
else
{
* head = *current;
(* head)->next = * prev;
}
* prev = * head;
*tail = // To moram zapamtiti zadnji element
}
void AddEnd ( struct Data ** head, struct Data ** tail, struct Data ** prev, struct Data ** current )
{
* current = ( struct Data * )malloc ( sizeof ( struct Data ) );
scanf ( "%d", &(* current )->x );
scanf ( "%d", &(* current )->y );
if ( * head == NULL )
* head = * current;
else
(* tail )->next = *current;
(* current )->next = NULL;
* tail = * current;
* prev = * head; // Pamti head varijablu
}
[ dontoo @ 22.03.2010. 13:21 ] @
Uspio sam smisliti. Mislim da je na forum već bilo vezanih lista sa dvostrukim pointerima, pa ako netko zna link topica neka napiše. Zanima me kako su to drugi riješili. Htio bi to riješit školski.
Code: void AddBeginning ( struct Data ** head, struct Data ** tail, struct Data ** prev, struct Data ** current )
{
* current = ( struct Data * )malloc ( sizeof ( struct Data ) );
scanf ( "%d", &(* current )->x );
scanf ( "%d", &(* current )->y );
if ( * head == NULL )
{
* head = * current;
(* current)->next = NULL;
*tail = *head;
}
else
{
* head = *current;
(* head)->next = * prev;
}
* prev = * head;
}
void AddEnd ( struct Data ** head, struct Data ** tail, struct Data ** prev, struct Data ** current )
{
* current = ( struct Data * )malloc ( sizeof ( struct Data ) );
scanf ( "%d", &(* current )->x );
scanf ( "%d", &(* current )->y );
if ( * head == NULL )
* head = * current;
else
(* tail )->next = *current;
(* current )->next = NULL;
* tail = * current;
* prev = * head;
}
[ Wajda.W @ 22.03.2010. 16:07 ] @
Cek, je l' ti treba da pravis vezanu listu koja je vezana u oba smera (sa dva pokazivaca), ili koja je vezana samo u jednom smeru, s jednim pokazivacem?
Code:
* current = ( struct Data * )malloc ( sizeof ( struct Data ) );
ne treba ti ovde dereferencirani pokazivac kada dodeljujes memorijski prostor, nego samo pokazivac
Code:
current = ( struct Data * )malloc ( sizeof ( struct Data ) );
ja bih ovako to zapisao:
Code:
//void AddBeginning ( struct Data ** head, struct Data ** tail, struct Data ** prev, struct Data ** current )
//ne treba ti toliko podataka o listi za dodavanje na pocetak, current necemo dirati, on ce da pokazuje tamo gde je i pokazivao
void AddBeginning ( struct Data ** head, struct Data ** tail)
{
struct Data *new; // neka lokalna promenljiva koja ce pamtiti novokreirani element dok se on ne doda u listu
new = (struct Data*) malloc(sizeof(struct Data));
scanf ( "%d", &a);
scanf ( "%d", &b);
new->x = a;
new->y = b;
if (head == NULL)
{
head = new;
new->next = NULL;
tail = head;
}
else
{
new->next = head;
head = new;
//head = *current; ovako samo komplikujes sa prev
//(* head)->next = * prev;
}
}
void AddEnd ( struct Data ** head, struct Data ** tail) // takodje current i prev necemo dirati, oni treba da su tamo gde su bili, npr negde na sredini liste
{
struct Data *new; // neka lokalna promenljiva koja ce pamtiti novokreirani element dok se on ne doda u listu
new = (struct Data*) malloc(sizeof(struct Data));
scanf ( "%d", &a);
scanf ( "%d", &b);
new->x = a;
new->y = b;
if (head == NULL)
head = tail = new;
else
tail->next = new;
new->next = NULL;
}
[ dontoo @ 22.03.2010. 17:08 ] @
Kužim, mnogo je ljepše.
[ Wajda.W @ 22.03.2010. 17:27 ] @
Samo mi nije jasno sta bi onda trebala f-ja Insert() da radi ako vec imas ove dve f-je?
[ dontoo @ 23.03.2010. 10:57 ] @
Insert između nekog elementa
[ Wajda.W @ 23.03.2010. 14:42 ] @
Obicno imas kod listi ove opcije.
Da ubacis na pocetak, na kraj liste, pre tekuceg elementa i posle tekuceg elementa.
Onda jos imas obrisi pocetni, pobrisi krajnji, obrisi tekuci, obrisi listu.
Onda za pozicioniranje, na pocetak, na kraj, sledeci, prethodni.
I za proveru da li je kraj ili da li je pocetak npr je_kraj() i je_pocetak()
I naravno za citanje vrednosti tekuceg.
Ne moraju sve ove f-je da postoje, a mogu i jos neke dodatne.
Ali reko da ti dam ideju.
Probaj da napravis listu i f-je tako da njom mozes komotno da rukujes samo preko tih f-ja, de ne moras da mislis da sta se
unutra desava.
p.s. Mozda sam malo preterao  , ali to je otprilike neka funkcionalna celina, mislim da tim putem treba ici kad se uci, a i uopste.
Pozdrav, pomocicu rado ako negde zapne.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|