PDA

Tam Sürümünü Görmek İçin : geriye kalan son hata dongu butun sayilarda doru calisirken 1 gelince hata veriyor


cefurkan
07/12/2006, 23:41
evet kisaca ozetliyorum gerisini

simdi fonkisyon hazir siralanmis liste aliyor
attiyorum listede 2 3 4 5 6
var
eger listede bole 1 rakami yoksa zaten problem cikmiyor icinde ne olursa olsun

ama eger ki icinde 1 varsa
segmentation fault aliyorum

nese listeyi aldikdan sonra zaten hersey kodda acik :D
listenin elemeanlarini tek tek taratiyorum icindeki verilere gore aksiyon yapiyorum

dugum yapisi sole gerekirse diye

typedef struct dugum {
int veri;
struct dugum *next_prime;
struct dugum *next;
} dugum_tipi;

typedef struct liste {
struct dugum *liste_ptr;
struct dugum *asal_ptr;
} liste_tipi;


asal_sorgu
fonksiyonun yaptigi is eger sayi asal ise true deilse false donduruyor ve fonksiyon da hata yok
hata assagida ama ben defalarca bakmama ramen hata goremedim cok az zamanim kaldi yardimci olursaniz cok sevinirim




liste_tipi *asal_baglama(liste_tipi *liste)
{
dugum_tipi *c,*d;
d=(dugum_tipi*)malloc(sizeof(dugum_tipi));
c=liste->liste_ptr;
if(c->next==NULL)
{
if(asal_sorgu(c))
{
d=c;
liste->asal_ptr=d;
}
}
else
{
while(c->next!=NULL)
{
if(liste->asal_ptr==NULL)
{
if(asal_sorgu(c))
{
d=c;
liste->asal_ptr=d;
}
else
break;
}
else
if(asal_sorgu(c))
{
d->next_prime=c;
d=d->next_prime;
}
if(c->next!=NULL)
c=c->next;
}
}
d->next_prime=c;
return (liste);
}


cefurkan
07/12/2006, 23:47
not duseyim bu odeve tam 1 haftadir urasiyorum

yarin son gun teslim ettik den sonra tumunu yayinlicam belki ilerde birilerinin isine yarar :D

cappytoi
07/12/2006, 23:52
o değilde bir konu neyine yetmiyor onu anlamıyorum.

cefurkan
07/12/2006, 23:54
yaw abi o konu cok sisti burda daha kisa oz hem oraya yeniden kimsenin bakmasi gerekmez

cefurkan
08/12/2006, 00:59
yaw her baslikda deniyor siz urasin bize takildiginiz yerleri sorun bendeki sadece cok ufak bir problem bence ama ben goremiyorum bir el atsaniz iki dakka :(

acehreli
08/12/2006, 01:13
Hatayi gordugumu soyleyemem ama bir kac bellek sizintisi ve onerim var.


liste_tipi *asal_baglama(liste_tipi *liste)
{
// [Ali] c ve d gibi adlar kodu okuyana bir sey ifade etmiyor. :(
dugum_tipi *c,*d;
d=(dugum_tipi*)malloc(sizeof(dugum_tipi));
c=liste->liste_ptr;
if(c->next==NULL)
{
if(asal_sorgu(c))
{
d=c; // [Ali] HATA! d'nin gosterdigi bellegi kaybettin!
liste->asal_ptr=d;
}
}
else
{
while(c->next!=NULL)
{
if(liste->asal_ptr==NULL)
{
if(asal_sorgu(c))
{
d=c; // [Ali] HATA! Yine bellek sizintisi...
liste->asal_ptr=d;
}
// [Ali] Tek satirlik bile olsalar butun kod
// bloklarina kume parentezleri kullanmani
// oneririm:
//
// else
// {
// break;
// }
//
// gibi...

else
break;
}
else
if(asal_sorgu(c))
{
d->next_prime=c;
d=d->next_prime;
}

// [Ali] Bu 'if' tek basina mi duracak yoksa bir onceki
// else'in icinde mi olacak?
if(c->next!=NULL)
c=c->next;
}
}
d->next_prime=c;
return (liste);
}


Ali

cefurkan
08/12/2006, 01:16
abi problem su 1 haric tum pozitif tam sayilarda harika calisiyor bir tek 1 rakamini girince hata olusuyor bole sacma bise neden olablir

evet duzgun bir sekilde yazmada sorunlarim halen var onlari inkar etmiyorum :d


yani hic calismiyor deil hatta %99 calisiyor da denebilir sadece kullanici 1 girerse hata olusuyor

acehreli hocam msn e gelebilirsen tum kodu veririm

cefurkan
08/12/2006, 01:33
ya cok onemli mutlaka bu aksam duzeltmem lazim bu hatayi lutfen msn den size tum herseyi anlatirim bu hatayi cozmeme yardim edicek yok mu :(


cefurkan@hotmail.com

lol
08/12/2006, 01:52
valla tebrik ediyorum cok fazla yardim cagrisi diyerek ban ladiniz hesabimi

bu kadar tecrubeli insan var burda max kac dakanizi alicaktiki hatayi bulmaniz

ha eger cozemiyorsaniz problemi eyvallah ama bence bu basit bir problemdi kimse zaman ayirmak mi istemedi artik nedir bilemiyorum

neyse herkese ii geceler yarin odevin son gunu olmasa bu kadar yardim istemezdim zaten bundan onceki problemlerin hic birinide yardimlariniz sonucunda cozmedim ama bu sefer umutluydum ama ne edelim saglik olsun

saygilar

cappytoi
08/12/2006, 01:57
sence her konuya insanlar cevap yazmaya mecbur mu? bu kadar ısrar karşısında insanlarda pes diyor. sen sürekli yardım yardım diye bağırsanda bir şey farketmeyecek. cevaplamak isteyen sen yardım yardım desende demesende zaten cevaplar.

clacks
08/12/2006, 15:21
cefurkan içimden bi ses senin itü bilgisayar müh. veri yapıları ödevinin olduğunu söylüyor al bu benim kodum belki işine yarar.

#include <stdio.h>
#include <stdlib.h>
typedef struct dugum{
int veri;
struct dugum *next;
struct dugum *next_prime;
}dugum_tipi;

typedef struct liste{
struct dugum *liste_ptr;
struct dugum *asal_ptr;
}liste_tipi;

void hata(char *);
dugum_tipi *dugum_al(int *);
void hata(char *);
dugum_tipi *dugum_ekle(dugum_tipi *,liste_tipi *);
int asal_mi(dugum_tipi *);
dugum_tipi *dugum_al(int *);
void tara(liste_tipi *l);
void tarasal(liste_tipi *);
void dosyaya_yaz(liste_tipi *);

void hata (char *s){
printf("%s\n",s);
exit(1);
}

int asal_mi(dugum_tipi *vptr){
int sayac=0,bolen;
if (vptr->veri==1)
return 0;
else{
for(bolen=2;bolen<=vptr->veri;bolen++){
if(vptr->veri%bolen==0)
sayac++;
}
if (sayac==1)
return 1;
else
return 0;
}
}

dugum_tipi *dugum_al(int *vptr){
dugum_tipi *l;
l=(dugum_tipi*)malloc(sizeof(dugum_tipi));
if(l==NULL)
hata("Yer Alýnamadý...");
else{
l->veri=*vptr;
l->next=NULL;
l->next_prime=NULL;
return l;
}
}

dugum_tipi *dugum_ekle(dugum_tipi *dptr,liste_tipi *lptr){
dugum_tipi *p,*q;
if (asal_mi(dptr)==0){ //EÐER DÜÐÜMÜMÜZÜN ÝÇERDÝÐÝ SAYI ASAL DEÐÝL ÝSE
if(lptr->liste_ptr==NULL) //eðer hiç düðüm yoksa
lptr->liste_ptr=dptr;
else{ //eðer düðüm varsa
if(dptr->veri<lptr->liste_ptr->veri){ //eðer düðüm var ve elimizdeki düðüm ilk düðümden küçükse
dptr->next=lptr->liste_ptr;
lptr->liste_ptr=dptr;
}
else{// eðer düðüm var ve elimizdeki düðüm ilk düðümden büyükse
q=lptr->liste_ptr;
while(q->next!=NULL) // q geçici iþaretçisi en son düðüme getiriliyor
q=q->next;
if(dptr->veri>q->veri) //eðer elimizdeki düðüm en son düðümden büyükse
q->next=dptr;
else{ //eðer elimizdeki düðüm en küçük düðümden büyük en büyük düðümden küçük ise
q=lptr->liste_ptr; //geçici iþaretçi kullandým burada yine
while(q!=NULL){
if((q->veri<dptr->veri)&&(dptr->veri<q->next->veri)){ //eðer belirli iki düðüm arasýnda yerini bulursa
dptr->next=q->next; //gerekli iþlemler
q->next=dptr; //araya giriyor
q=NULL; //döngünün durmasý için q'ya NULL deðeri atanýyor
}
else
q=q->next; //yok eðer yerini bulamadýysa bir sonraki düðüme geç
}
}
}
}
}
else{//EÐER DÜÐÜMÜMÜZÜN ÝÇERDÝÐÝ BÝLGÝ ASAL ÝSE
if(lptr->liste_ptr==NULL){//daha önce listeye düðüm eklenmemiþ ise
lptr->liste_ptr=dptr;
lptr->asal_ptr=dptr;
}
else{
if(lptr->asal_ptr==NULL){ //daha önce düðüm var ama asal sayý yok
if(dptr->veri<lptr->liste_ptr->veri){ // eklenen düðüm liste baþýndakinden küçükse
dptr->next=lptr->liste_ptr;
lptr->liste_ptr=dptr;
lptr->asal_ptr=dptr;
}
else{
q=lptr->liste_ptr;
while(q->next!=NULL)
q=q->next; // en son düðümü iþaret ediyoruz
if(dptr->veri>q->veri){// en son düðümden bile büyükse
q->next=dptr;
lptr->asal_ptr=dptr;
}
else{// en son düðümden küçük en küçük düðümden büyükse
q=lptr->liste_ptr;
while(q!=NULL){
if((q->veri<dptr->veri)&&(dptr->veri<q->next->veri)){ //eðer belirli iki düðüm arasýnda yerini bulursa
dptr->next=q->next; //gerekli iþlemler
q->next=dptr; //araya giriyor
lptr->asal_ptr=dptr;
q=NULL; //döngünün durmasý için q'ya NULL deðeri atanýyor
}
else
q=q->next; //yok eðer yerini bulamadýysa bir sonraki düðüme geç
}
}
}
}
else{//daha önceden bir asal sayý listede varsa
if(dptr->veri<lptr->liste_ptr->veri){//eklenen sayý liste baþýndakinden bile küçükse
dptr->next=lptr->liste_ptr;
dptr->next_prime=lptr->asal_ptr;
lptr->liste_ptr=dptr;
lptr->asal_ptr=dptr;
}
else{
if((dptr->veri>lptr->liste_ptr->veri)&&(dptr->veri<lptr->asal_ptr->veri)){//eklenen sayý düðümün liste baþýndan büyük asal liste baþýndan küçük ise
q=lptr->liste_ptr;
while(q!=NULL){
if((q->veri<dptr->veri)&&(dptr->veri<q->next->veri)){
dptr->next=q->next;
q->next=dptr;
dptr->next_prime=lptr->asal_ptr;
lptr->asal_ptr=dptr;
q=NULL;
}
else
q=q->next;
}
}
else{//eklenen sayý asal iþaretçinin sayýsýndan büyükse
q=lptr->liste_ptr;
p=lptr->asal_ptr;
while(p->next_prime!=NULL)
p=p->next_prime;//p en son asal düðümü gösteriyor
while(q->next!=NULL)
q=q->next;//listedeki en büyük düðümü gösteriyor
if(dptr->veri>p->veri){//listedeki en büyük asal sayýdan büyükse
if(p->next==NULL){ // en büyük asal sayýdan sonra baska sayý yoksa
p->next=dptr;
p->next_prime=dptr;
}
else{ // en büyük asal sayýdan sonra baþka sayý varsa
if(dptr->veri>q->veri){ // en büyük sayýdan da büyük
q->next=dptr;
p->next_prime=dptr;
}
else{//en büyük asal sayý ile en büyük normal sayý arasýnda is
p=lptr->asal_ptr;
while(p->next_prime!=NULL)
p=p->next_prime;//p en son asal düðümü gösteriyor
q=p;
while(p!=NULL){
if((p->veri<dptr->veri)&&(dptr->veri<p->next->veri)){
dptr->next=p->next;
p->next=dptr;
q->next_prime=dptr;
p=NULL;
}
else
p=p->next;
}
}
}
}
else{
p=lptr->asal_ptr;
q=p;
while(p!=NULL){
if((p->veri<dptr->veri)&&(dptr->veri<p->next->veri)){
dptr->next=p->next;
p->next=dptr;
while(q!=NULL){
if((q->veri<dptr->veri)&&(dptr->veri<q->next_prime->veri)){
dptr->next_prime=q->next_prime;
q->next_prime=dptr;
q=NULL;
}
else
q=q->next_prime;
}
}
else
p=p->next;
}
}
}
}

}

}
}

}



void tara(liste_tipi *lptr){
dugum_tipi *p;
printf("------------------------\n");
for (p=lptr->liste_ptr;p;p=p->next)
printf("%d\n",p->veri);
printf("------------------------\n");
}
void tarasal(liste_tipi *lptr){
dugum_tipi *p;
printf("------------------------\n");
for (p=lptr->asal_ptr;p;p=p->next_prime)
printf("%d\n",p->veri);
printf("------------------------\n");
}
void dosyaya_yaz(liste_tipi *lptr){
int sayi;
char *string;
dugum_tipi *p;
FILE *fp;
if((fp=fopen("04005269.txt","a"))==NULL)
hata("Dosya Açýlamýyor...");
for (p=lptr->liste_ptr;p;p=p->next){
sayi=p->veri;
string=(char*)malloc(sizeof(int));
itoa(sayi,string,10);
fputs(string,fp);
putc(' ',fp);
}
putc('\n',fp);
fclose(fp);
}

void asal_sil(liste_tipi *lptr){
dugum_tipi *p,*q,*r;
int sayac1=0,sayac2,sayac3,sayac4;
q=lptr->liste_ptr;
if((lptr->liste_ptr!=NULL)&&(lptr->asal_ptr!=NULL)){//ortada bir liste var ve en az bir asal sayý var
if(lptr->asal_ptr==lptr->liste_ptr){//asal sayý ve liste baþý ayný
while(lptr->asal_ptr==lptr->liste_ptr){
lptr->liste_ptr=lptr->liste_ptr->next;
lptr->asal_ptr=lptr->asal_ptr->next_prime;
}
}
while(lptr->asal_ptr!=NULL){
q=lptr->liste_ptr;
p=lptr->asal_ptr;
while(q!=p){
if(q->next->veri==lptr->asal_ptr->veri){
q->next=lptr->asal_ptr->next;
lptr->asal_ptr=lptr->asal_ptr->next_prime;
p=q;
}
else
q=q->next;
}
}
}
q=lptr->liste_ptr;
p=q;
r=q;
while(q->next!=NULL){
q=q->next;
sayac1=sayac1+1;
}
sayac2=sayac1;
while(sayac1>0){
sayac3=0;
r=p;
if(sayac2==sayac1)
lptr->liste_ptr=q;
while(sayac3<sayac1){//r deðiþken iþaretçisi q dan bir öncekine geliyor
r=r->next;
sayac3=sayac3+1;
}
q->next=r;//q bir önceki düðümü gösteriyor
q=r;//q bir geriye geldi
sayac1=sayac1-1;
if(p->next==q){
q->next=p;
p->next=NULL;
}
}
}

int main(int argc, char *argv[]){
int i,h;
liste_tipi *listem;
listem=(liste_tipi*)malloc(sizeof(liste_tipi));
listem->liste_ptr=NULL;
listem->asal_ptr=NULL;

while(h>0){
scanf("%d",&h);
if(h>0)
dugum_ekle(dugum_al(&h),listem);
dosyaya_yaz(listem);
}
asal_sil(listem);
dosyaya_yaz(listem);
system("pause");

}