Tam Sürümünü Görmek İçin : Linked List
#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
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
henüz değerleri girerken program patlıyor. Just-In-Time Debug diyor bi de utanmadan :D
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
#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
while(tmp != NULL)
{
tmp = tmp->next;
}
tmp = malloc(sizeof(struct node*));
tmp->data = *ptovalue;
tmp->next = NULL;
return tmp;//burda tmp i yollamak gerekiyor
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
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
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
abi benim koda yardım eden yok mu :D neden sadece ilk node u basıyor diğerleri kalıyor?
#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;
}
algoritmayı anladım da struct içindeki parametrelerin değişmemesi veya eklenmemesi gerekiyor :)
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
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;
}
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 :\
forumları araştırdım. işin ilginci, aynı fonksiyonu yazdığım (karakter fark etmeden) başka bir kod çalışıyor
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.