Προς το περιεχόμενο

Πρόβλημα σε άσκηση της C


DarkEvil_II

Προτεινόμενες αναρτήσεις

Δημοσ.

Γειά σας παιδιά, καλώς σας βρήκα!

Έχω ένα προβληματάκι με έναν αλγόριθμο που κατασκευάζω στην C και θα ήθελα να ακούσω τη γνώμη σας! Να επισημάνω πώς οι γνώσεις μου πάνω στη C δεν είναι και οι καλύτερες, ακόμα μαθαίνω!

 

Αρχικά κάποιες πληροφορίες:

Φτιάχνω μία λίστα όπου στον κόμβο της κάθε μίας αντιστοιχώ μία τιμή float (Προσοχή: η τιμή του κόμβου i είναι μικρότερη απο αυτή του i+1). Στη συνέχεια αντιστοιχώ τις τιμές του κάθε κόμβου σε μία x.

 

Από τα x αυτά και μέσω μίας μεθόδου βρίσκω κάποιες προσεγγίσεις u καθώς και τα σφάλματα k που ισχύουν για τις προσεγγίσεις αυτές ανά διάστημα (x[i-1], x).

 

Στη συνέχεια θέτω κάποια όρια που θα πρέπει να ισχύουν σε κάθε σφάλμα μου, δηλαδή ε' <= k^2 <= ε.

Άν η k^2 είναι μεγαλύτερη του ε τότε καλώ την insert_list όπου προσθέτω ένα κόμβο ανάμεσα στον κόμβο(i-1) και στον κομβο(i) (ο οποίος κόμβος πέρνει την τιμή x+x[i-1]/2).

Άν η k^2 είναι μικρότερη του ε' τότε καλώ την del_list όπου διαγράφω τον κόμβο(i).

 

Στη συνέχεια κάνω loop και ξαναντοιστιχώ τις τιμές των κόμβων (νέων και παλαιών, αλλά φυσικά όχι των διεγραμένων) στην x .

 

Με λίγα λόγια δείνω μία αρχική διαμέριση και θέλω το πρόγραμμά μου να κάνει αυτόματα αναδιαμέριση.

 

Τελικά τρέχοντας το πρόγραμμα σχεδόν ποτέ δε κάνει σωστή αναδιαμέριση, ενώ άλλες φορές το πρόγραμμα κολλάει κατα την εκτέλεσή του. Τι πιστεύετε ότι φταίει; Κατα τη γνώμη μου κάτι δεν πάει καλά με την insert_list.

 

Παρακάτω υπάρχει τμήμα του προγράμματος καθώς και οι δύο συναρτήσεις insert_list και del_list:

 

while(l!=w)

{

j=0;

l=0;

current=head;

while(current!=NULL)

{

 

if(strcmp(current->timh, "\x0")==0)

break;

 

x[j] ίσον current -> komvos; (Δεν χρησιμοποιώ το σύμβολο '=' γιατι βγάζει κάποιο πρόβλημα ο κειμενογράφος του forum)

 

j=j+1;

current=current->next;

}

 

.

.

.

 

for(i=1; i<=w; i++)

{

if (pow(k,2)/h<=v && pow(k,2)/h>=v/5)

{

printf("To diasthma x[%d] ews x[%d] einai OK\n", i-1, i);

l=l+1;

}

else if (pow(k,2)/h>v)

{

printf("Sto diasthma x[%d] ews x[%d] prepei na pros8esoume komvo\n", i-1, i);

insert_list ( head, i-1, x, x[i-1]);

}

else if (pow(k,2)/h<v/5)

{

printf("Sto diasthma x[%d] ews x[%d] prepei na afairesoume komvo\n", i-1, i);

if(i!=w)

del_list (head, i+1);

else if(i==w)

del_list (head, w-1);

}

}

}

 

 

void insert_list(struct Diamerisi *ihead, int pos, double x, double y)

{

int k;

struct Diamerisi *temp, *curr;

curr = ihead;

for (k=1; k<pos; k++)

curr = curr -> next;

temp = (struct Diamerisi *) malloc (sizeof (struct Diamerisi));

temp -> next = (struct Diamerisi *) NULL;

temp -> komvos=(x+y)/2;

temp -> next = curr -> next;

curr -> next = temp;

}

 

 

 

void del_list (struct Diamerisi *head, int pos)

{

int k;

struct Diamerisi *cur1, *cur2;

cur1 = head;

cur2 = head;

for (k=1; k<pos; k++)

cur1 = cur1 -> next;

for (k=1; k<pos-1; k++)

cur2 = cur2 -> next;

cur2 -> next = cur1 -> next;

cur1 -> next = (struct Diamerisi *) NULL;

free(cur1);

cur1 = (struct Diamerisi *) NULL;

}

Δημοσ.

ειναι και νυχτα και δεν λειτουργει ο εγκεφαλος και πολυ, αλλα στην insert_list σου μου εκανε εντυπωση το γεγονος οτι χρησιμοποιεις ακριβως τον ιδιο κωδικα που θα χρησιμοποιουσες για ενα κομβο στην μεση της λιστα σου. το cur=cur->next δεν γινεται οταν εισαι στον πρωτο κομβο γτ απλα το head==Null τωρα βεβαια ελπιζω να μην σου λεω παπαριες γτ C++ ξερω αλλα κοιτα το. εγω θα εγραφα κατι σε στυλ

 

if(head==null)

{

head=new komvos(.....)

cur=head

}

else

{

εχεις γραψει ηδη

}

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...