PDA

Tam Sürümünü Görmek İçin : Linked List


choldax
08/01/2008, 19:52
#include <stdio.h>

struct node
{
int *data;
struct node * next;
};

struct node * append_node(struct node * p, int * ptovalue)
{
struct node *tmp;
tmp -> data = ptovalue;
tmp = p;
while(tmp->next != NULL)
{
tmp = tmp->next;
}
return p;
}
void delete_node(struct node * p, int * ptovalue)
{
struct node *tmp;
tmp->data = ptovalue;
tmp = p;
while(tmp != NULL)
{
tmp = tmp->next;
if(tmp->data == ptovalue)
{
tmp = tmp->next->next;
}
else
{
printf("This node does'n exist.\n");
}
}
}
void display_list(struct node * p)
{
struct node *tmp;
tmp = p;
while(tmp != NULL)
{
printf("%d->", tmp->data);
}
}

main()
{
int i,v;
struct node * head = NULL;

for(i=0; i<5; i++)
{
printf("Enter some data value for %d node\n", i);
scanf("%d", &v);
head= append_node(head, &v);
}

display_list(head);
printf("Enter some data value to delete\n");
scanf("%d", &v);

delete_node(head,&v);
display_list(head);
}



compiler hata vermiyor ama çalışırken programda bug çıkıyor. Soru nerede?


acehreli
08/01/2008, 20:36
Hemen gorebildigim:

struct node *tmp;
tmp -> data = ptovalue; // <-- Erisim hatasi

Cunku tmp'in degeri belirsiz.

Ali

choldax
08/01/2008, 20:45
denedim, işe yaramıyor. acaba callocationla ilgili bir hata mı?

acehreli
08/01/2008, 21:08
Ben bir sey dene dememistim; onun icin denedigin neyin ise yaramadigini bilemiyorum. :)

Bir tane daha: display_list'teki while'in icinde tmp'i degistirmen gerekmiyor mu? Yoksa o dOngUden hic cikamazsin. Ornegin soyle bir sey:

tmp = tmp->next;

Bu tur sorunlari cozmenin en kolay yolu, yapilari bir kagit ustune (veya tahtaya) cizerek isaretcilerin neyi gosterdiklerine bakmaktir. Her fonksiyonda neyin neye isaret ettigine teker teker bakarsan, olasi hatalari bulabilirsin.

Ali

choldax
09/01/2008, 10:37
henüz değerleri girerken program patlıyor. Just-In-Time Debug diyor bi de utanmadan :D

tujix
09/01/2008, 16:55
degerleri girerken patlamasinin sebebi head=NULL diyorsun ve ilk degeri eklerken append_node da acehrelinin dedigi gibi tmp -> data = ptovalue; // <-- Erisim hatasi

Cunku tmp'in degeri belirsiz.bunu halletsen bile temp=p atamasi yapmissin bir alt satirda
p nin yani head in ilk degeri NULL ve sen while dongusunde NULL in next ine gitmeye calisiyorsun buda infilak ettirir prgramini;)


bir hadata delete_node da ki while in iicnde girer girmez tmp=tmp->next i atamasi yapip sonrada tmp->data gonderilen degere esitmi diye bakiyorsun ama gonderilen deger arrayin ilk elemaniysa delete fonksiyonu bulamiyacak listede mevcut olmasina ragmen


ayrica delete fonksiyonu hicbirseyi silmiyor:)gonderdigin head e yapilan hicbi islem yazilmiyor yada head in uzerine geri dondurulmuyor.aslinda silemezde cunku egerki silinecek nodu bulıursa fonkisyon o nodedan oncekini sonrakine link etmesi gerekir ki aradigin eleman listeden cikmis olsun .bide tmp=tmp->next->next->next satirinda silme islemini yapmis olsan bile returnle cikarsan "This node isn't exist " mesajini gormememn gerekirken gormekten kurtulmus olursun...
iyi calismalar

acehreli
09/01/2008, 19:36
choldax, henuz degerleri girerken patlamasi cok iyi bir sey aslinda. Boylece hatanin nerede oldugunu biliyorsun! :) Iste orayi bir kagitta hallet. Kutular ciz, onlarin icinden ornegin next'i baska bir kutuya okla bagla. Bak bakalim kagit ustunde bagli liste olusuyor mu. NULL olan hicbir seye erismemen gerek tabii. Onlara da bak.

Ali

choldax
09/01/2008, 21:55
#include <stdio.h>

struct node
{
int data;
struct node * next;
};

struct node * append_node(struct node * p, int * ptovalue)
{
struct node *tmp;
tmp = p;
if(p == NULL)
{
p = malloc(sizeof(struct node*));
p->data = *ptovalue;
p->next = NULL;
}
else
{
while(tmp != NULL)
{
tmp = tmp->next;
}
tmp = malloc(sizeof(struct node*));
tmp->data = *ptovalue;
tmp->next = NULL;
}
return p;
}
void delete_node(struct node * p, int * ptovalue)
{
struct node *tmp1;
struct node *tmp2;
tmp1 = p;
tmp1->data = *ptovalue;
while(tmp1 != NULL)
{
tmp2 = tmp1;
tmp1 = tmp1->next;
if(tmp1->data == *ptovalue)
{
tmp2->next = tmp1->next;
free(tmp1);
}
else
{
printf("This node does'n exist.\n");
}
}
}
void display_list(struct node * p)
{
struct node *tmp;
tmp = p;
if(p == NULL) printf("Empty\n");
while(tmp != NULL)
{
printf("%d->", tmp->data);
tmp = tmp->next;
}
}

int main()
{
int i,v;
struct node * head = NULL;

for(i=0; i<5; i++)
{
display_list(head);
printf("Enter some data value for %d. node\n", i+1);
scanf("%d", &v);
head = append_node(head, &v);
}

display_list(head);
//printf("Enter some data value to delete\n");
//scanf("%d", &v);

//delete_node(head,&v);
//display_list(head);
return 0;
}

en son hali bu... bunda da ilk node u basıp diğerlerini esgeçiyor

tujix
09/01/2008, 22:27
while(tmp != NULL)
{
tmp = tmp->next;
}
tmp = malloc(sizeof(struct node*));
tmp->data = *ptovalue;
tmp->next = NULL;
return tmp;//burda tmp i yollamak gerekiyor

tujix
09/01/2008, 22:34
tmp = malloc(sizeof(struct node*));

yukarda mallocdan gelen deger void* ve buna herhangi bi cast islememi
uygulanmamasina ragmen hata vermiyor,warning bile yok piyasada :)nedenini bilen varmi

acehreli
10/01/2008, 00:09
void* her tUre, acikca donusum gerektirmeden otomatik olarak donusur. Her isaretci de void*'a otomatik olarak donusur.

Eger yanilmiyorsam eski C kurallarina gore 'cast yapmamiz' gerekiyordu ama artik gerek yok. Deneme programi:


void * foo()
{
return 0;
}

int main()
{
char * p = foo();
void * q = p;
}


Ali

hgedek
10/01/2008, 01:27
Bunun dönüşümde hata vermesi gerekiyor.studio devc++ gibi editorler buna hata verir.

acehreli
10/01/2008, 01:50
Ben gcc 4.1.2 ile deniyorum; hata vermiyor. Dev-C++ da gcc kullanir...

Netten ogrendigime gore, malloc eskiden 'char*' dOndUruyormus. Acik tUr donusumu o zamanlar gerekiyormus. Artik degil.

Ali

hgedek
10/01/2008, 05:16
biraz önce dev c++ da

int *ptr=NULL;
ptr=malloc(sizeof(int) *3);

gibi kısa bir ifade denedim ve cast siz hata verdi.

acehreli
10/01/2008, 08:34
Soyle deneyelim o zaman: C++'ta gerekiyor, C'de gerekmiyor.

Ben boyle konulari eskiden bilirdim; artik emin olamiyorum. Derleyici isterse koyalim, istemezse koymayalim. :)

Ali

choldax
10/01/2008, 18:40
abi benim koda yardım eden yok mu :D neden sadece ilk node u basıyor diğerleri kalıyor?

hgedek
10/01/2008, 19:53
#include <stdio.h>

struct node
{
int data;
struct node * next;
struct node *first;

node()
{
next=NULL;
data=0;
}
};
typedef struct node Node;
Node *first=NULL;

Node * append_node(Node * p, int ptovalue)
{
Node *tmp=new Node;
tmp->data=ptovalue;
if(first==NULL)
{
first=tmp;
p=tmp;
}
else
{
p->next=tmp;
p=p->next;

}

return p;

}
void delete_node(int ptovalue)
{
Node *tmp=first;
Node *prev=NULL;
while(tmp != NULL)
{
if(tmp->data == ptovalue)
{
prev->next=tmp->next;
delete tmp;
return;
}
prev=tmp;
tmp = tmp->next;
}
}
void display_list()
{
Node *tmp;
tmp = first;
while(tmp != NULL)
{
printf("%d->", tmp->data);
tmp=tmp->next;
}
}

int main()
{
int i,v;
Node * head = NULL;

for(i=0; i<5; i++)
{
printf("Enter some data value for %d node\n", i);
scanf("%d", &v);
head= append_node(head, v);
}

display_list();
printf("Enter some data value to delete\n");
scanf("%d", &v);

delete_node(v);
display_list();

return 0;
}

choldax
10/01/2008, 19:55
algoritmayı anladım da struct içindeki parametrelerin değişmemesi veya eklenmemesi gerekiyor :)

choldax
10/01/2008, 19:58
debugging yaptığımda gördüm ki

while(tmp != NULL)
{
tmp = tmp->next;
printf("tmp = tmp->next;\n");
}



kısmında sadece 1 kere tmp = tmp->next basıyor. ancak gittiği kadar basması gerekmez mi?

acehreli
10/01/2008, 20:59
tmp != NULL oldugu surece basar. Eger bir kere basiyorsa, tmp ilk seferden sonra NULL oluyor demektir. Neden oyle oluyor? Programda bir hata olmali...

Ali

hgedek
10/01/2008, 22:31
tmp en sondaki node bilgisini tutar.first node eklemeli ve ilk eklenen node tutmalısın.yazarkende ondan baslamalısın.bu sekilde kullandığında bütün nodeların aynı değere sahip olduğunu göreceksin.data değerin ptr ve v nin adresini tutuyor.sen ise her okuduğun değeri aynı v adresine yazıyosun.bunu kopyalama şeklinde yap yada yeniden yeniden bellek al.

myavuzselim
10/01/2008, 22:33
append_node fonksiyonundaki bazi sorunlar:
/* ptovalue niye bir pointer? int'in kendisini gondermek daha mantikli. */
struct node * append_node(struct node * p, int * ptovalue)
{
struct node *tmp;
tmp = p;
if(p == NULL)
{
/* sizeof(struct node) olmali. */
p = malloc(sizeof(struct node*));
p->data = *ptovalue;
p->next = NULL;
}
else
{
/* Bu dongu tmp = NULL demek :)
Halbuki en son NULL olmayan node'u bulup
yeni node ile birlestirmen lazim.
ipucu: while(tmp->next != NULL) {....}
tmp->next = malloc(...);
...
*/
while(tmp != NULL)
{
tmp = tmp->next;
}
tmp = malloc(sizeof(struct node*));
tmp->data = *ptovalue;
tmp->next = NULL;
}
return p;
}

choldax
10/01/2008, 23:07
yardım eden herkese çok teşekkürler :)

son bir sorum olacak
two or more data types in decleration of 'append_node'

hata satırı kodu açan { gösteriyor. bir şey anlayamadım :(

myavuzselim
11/01/2008, 00:02
Ayni hatayi veren baska bir kod: int char deneme();
Boyle bir hata yapmis olabilir misin?

Ozellikle ingilizce biliyorsan boyle hatalarin sebebini google'da kolayca bulabilirsin. Yok bilmiyorsan yine bulabilirsin, anlaman biraz zor olur ama sozluk de yardimiyla duse kalka giderek anlamaya baslarsin. Yoksa tasima suyla degirmen donmuyor :\

choldax
11/01/2008, 03:08
forumları araştırdım. işin ilginci, aynı fonksiyonu yazdığım (karakter fark etmeden) başka bir kod çalışıyor