PDA

Tam Sürümünü Görmek İçin : Bu kodda hata nerde


badabim87
04/01/2007, 20:02
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <conio.h>


struct linked_list{
int d;
struct linked_list *next;};
typedef struct linked_list ELEMENT;
typedef ELEMENT *LINK;
LINK string_to_list(char s[])
{
LINK head;
if(s[0]=='\0')
return NULL;
else{
head=malloc(sizeof(ELEMENT));
head->next=string_to_list(s+1);
return head;
}}
void Print_list(LINK head)
{

if(head==NULL)
printf("NULL list");
else
printf("%c",head->d);
Print_list(head->next);
}
void delete_list(LINK head)
{
if(head!=NULL)
{
delete_list(head->next);
free(head);}
}
void insert(LINK p1,LINK p2,LINK q)
{
assert(p1->next==p2);
p1->next=q;
q->next=p2;
}
main()
{
int i,v;
char s[5];

LINK head=NULL;
for(i=0;i<5;i++)
{printf("Enter some values:");
scanf("%c",&s[i]);
}
Print_list(s);
printf("Enter some value to delete");

Print_list(s);
}

Yardımcı olursanız çok sevenirim.program print işlemi sırasında hata verio


acehreli
04/01/2007, 20:33
Hizlica gorebildiklerim:

1) Print_list icindeki ozyinelemeli Print_list cagrisini herhalde else blogundan yapmak istedin degil mi? Kume parantezleri kullanmayi unutmussun.

Genel bir kural olarak, butun kod bloklarinda kume parantezleri kullan. Tek satirlik if bloklarinda bile:


void foo()
{
if (bir_sey())
{
tek_satir_olsa_bile();
}
}


Ayrica, kapatma kume parantezlerini bugune kadar gormedigim bir sekilde kapatiyorsun. Belki de bir goruntuleme hatasidir, ama okumayi cok guclestiriyor.

Ornegin, senin kodun soyle gorunuyor:


void delete_list(LINK head)
{
if(head!=NULL)
{
delete_list(head->next);
free(head);}
}


Su sekilde duzenli olsun:


void delete_list(LINK head)
{
if(head!=NULL)
{
delete_list(head->next);
free(head);
}
}


Baska bir duzen de kullanabilirsin tabii ki ama mutlaka duzenli olsun :) Acma kume parantezini bir ust satirda kullanan baska bir duzen:


void delete_list(LINK head)
{
if(head!=NULL) {
delete_list(head->next);
free(head);
}
}


2) main icinde Print_list'e bir dizi gonderiyorsun. Halbuki Print_list bir LINK bekliyor. Herhalde once string_to_list cagrisi ile bir liste olusturmak istemissin ama unutmussun.

Ali

badabim87
04/01/2007, 20:40
Ya şimdi sanırım küme işaretçilerinde bi problem yok.Ztn program hata fln vermio ama çalıştırdıktan sora listenin ilk elemanını basıp duruoo

Revne
04/01/2007, 21:58
Kodunda cok fazla hata var...
1. Listeye ekleme yapmadan listeyi print etmeye calisiyorsun
2. void Print_list(LINK head) fonksiyonunu Print_list(s) seklinde nasıl cagirabiliyorsun anlamış deilim...(char s[5];)
3. Kodunu bir duzenle tekrar sor bence....

Kolay Gelsin

acehreli
04/01/2007, 22:18
badabim87, sen hatanin nerede oldugunu sordun, bir kac tane gosterildi... Bunun sanmayla bir ilgisi yok. Bence hata olmadigini sanmayi birak, ve hatalari duzelt.

Ali

Revne
04/01/2007, 22:20
Duzeltilmiş hali....

struct linked_list{
int d;
linked_list *next;
};

typedef linked_list ELEMENT;
typedef ELEMENT *LINK;

LINK string_to_list(char s[])
{
if(s[0]=='\0')
return NULL;
else{
LINK head=(LINK)malloc(sizeof(ELEMENT));
head->d=s[0]; // Revne: Veri Yukleniyor
head->next=string_to_list(s+1);
return head;
}
}
void Print_list(LINK head)
{

if(head==NULL)
return;//printf("NULL list");//Revne: Eger eleman yoksa yada listenin sonuna geldiginde fonksiyon yazmadan donecek
else
{
printf("%c",head->d);
Print_list(head->next);
}
}

int main()//Revne:main her zaman int dondurur
{

char s[5];
printf("Enter some values:");
scanf("%5s",s); //Revne: 5 degeri sen 5 dedigin icin... bence bunu #define ile sabitle
LINK head=string_to_list(s);//Revne: Liste Olusturuluyor
printf("Values in List:");
Print_list(head);//Revne: Liste yazdırılıyor
return 0; //Revne: main deger donduruyor
}

Kolay Gelsin

badabim87
05/01/2007, 11:31
Saolun hepinize teşekkkürler!!