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

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

Δημοσ.

Καλησπερα

 

Εχω να υλοποιησω μια ασκηση σε c με συναρτησεις για εισαγωγη, διαγραφη και αναζητηση στοιχειου σε λιστες.Η εισαγωγη γινεται σε ταξινομημενη λιστα.Με μια δικια μου main που ελεγξα,συνεχιζει να μου βγαζει segmentation fault το προγραμμα οτι και αν αλλαξω στον κωδικα. Αν μπορουσε να βοηθησει καποιος θα ημουν υποχρεος :rolleyes:

 

Εδω ο κωδικας:

>struct b{
      int data;
      struct b *next; 
};

void Insert(int, struct b *);
void Delete(int, struct b *);
int LookUp(int, struct b *);



void Insert(int data, struct book *v){
      
     struct b *List = v, *pList = NULL, *item;
      
     if(List == NULL){
          List = (struct book *)malloc(sizeof(struct book));
          List->data = data;
          List->next = NULL;
     }
     else{
          while(List != NULL){
               if(List->data > data){
                    break;
               }
               pList = List;
               List = List->next;
          }

          
          item = (struct book *)malloc(sizeof(struct book));
          item->data = data;
          pList->next = item;
          item->next = List;
     }
                               
    
}    
    
    
void Delete(int data, struct book *v){
     
     struct b *List = v, *temp;
     
     while(List != NULL){
          if(List->data == data){
               temp = (struct book *)malloc(sizeof(struct book));
               temp = List->next;
               List->data = List->next->data;
               List->next = temp->next;
               free(temp);
          }
               
          List = List->next;
     }
}
    

int LookUp(int data, struct book *v){
    struct b *List = v;
    while(List != NULL){
         if(List->data != data){
              List = List->next;
         }
         else return 1;
    }
    return 0;
}

Δημοσ.

Αυτή τη στιγμή δεν έχω χρόνο να το κοιτάξω, πες μας όμως σε ποια συνάρτηση χτυπάει στο run-time. Πες μας επίσης αν σου βγάζει warnings κατά το compilation (αν είσαι με gcc, βάλε -Wall -Wextra στο command line του).

 

Το μόνο που μπορώ αυτή τη στιγμή είναι να σου δώσω 2 εκδοχές συναρτήσεων εισαγωγής σε ταξινομημένα λίστα, μια με by value πέρασμα και μια by ref...

 

>
/* ------------------------------------------------------------------
* Ascending order Insertion of data into list (passing the list By Reference)
*/
Bool list_insascend( List **list, int data )
{
List *head = NULL, *prev = NULL;
List *new = calloc( 1, sizeof(struct node) );
if ( !new )
	return FALSE;

new->data = data;
new->next = NULL;

if ( !*list ) {
	*list = new;
	return TRUE;
}

// find spot for the insertion
head = prev = *list;
while ( head && head->data <= data ) {	// use <= data, to allow duplicates
	prev = head;			// save previous node
	head = head->next;
}

// case 1: insert BEFORE 1st node
if ( *list == head ) {					
	*list = new;
	new->next = head;
	return TRUE;
}
// case 2: insert AFTER 1st node (anywhere between first and last node)
if ( !head || head->data != data ) {	
	prev->next = new;
	new->next = head;
}

return TRUE;
}

/* ------------------------------------------------------------------
* Descending order Insertion of data into list (passing the list By Value)
*/
List *vlist_insdescend( List *list, int data )
{
List *head = NULL, *prev = NULL;
List *new = calloc( 1, sizeof(struct node) );
if ( !new )
	return list;

new->data = data;
new->next = NULL;

if ( !list )
	return new;

// find spot for the insertion
head = prev = list;
while ( head && head->data > data ) {	// use >= data, to allow duplicates
	prev = head;			// save every previous node
	head = head->next;
}

// case 1: insert BEFORE 1st node
if ( list == head ) {
	list = new;
	new->next = head;
	return list;
}
// case 2: insert AFTER 1st node (anywhere between first and last node)
if ( !head || head->data != data ) {
	prev->next = new;
	new->next = head;
}

return list;
}

Δημοσ.

Το τρέχω με αυτή την main:

>#include <stdio.h>
#include <stdlib.h>

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

void Insert(int, struct b *);
void Delete(int, struct b *);
int LookUp(int, struct b *);

int main(){
   struct b* v;
   int d, i;
   
   for(i=0;i<=2;i++){
   printf("Dwse data.");
   scanf("%d", &d);
   Insert(d, v);
   }
   for(i=0;i<=2;i++){
    printf("%d", v->data);
    v = v-> next;
   }
}

void Insert(int data, struct b *v){
      
     struct b *List = v, *pList = NULL, *item;
      
     if(List == NULL){
          List = (struct b *)malloc(sizeof(struct );
          List->data = data;
          List->next = NULL;
     }
     else{
          while(List != NULL){
               if(List->data > data){
                    break;
               }
               pList = List;
               List = List->next;
          }

          
          item = (struct b *)malloc(sizeof(struct );
          item->data = data;
          pList->next = item;
          item->next = List;
     }
                               
    
}    
    
    
void Delete(int data, struct b *v){
     
     struct b *List = v, *temp;
     
     while(List != NULL){
          if(List->data == data){
               temp = (struct b *)malloc(sizeof(struct );
               temp = List->next;
               List->data = List->next->data;
               List->next = temp->next;
               free(temp);
          }
               
          List = List->next;
     }
}
    

int LookUp(int data, struct b *v){
    struct b *List = v;
    while(List != NULL){
         if(List->data != data){
              List = List->next;
         }
         else return 1;
    }
    return 0;
}

 

και βγαζει segmentation εδω:

>while(List != NULL){
               if(List->data > data){
                    break;
     }

Δημοσ.

Δεν έχω ευκαιρήσει ακόμα να ασχοληθώ, με 1η ματιά όμως βλέπω πως παρόλο που η Insert() δεν επιστρέφει τίποτα, της περνάς το v by value. Αυτό συνδυασμένο με το γεγονός πως όταν ορίζεις το v στη main() το αφήνεις χωρίς αρχικοποίηση, είναι σίγουρο πως θα βαρέσει seg-fault όταν πας να τυπώσεις το v->data μέσα στο for-loop της main().

 

Αυτά χωρίς να έχω δει καν τον κώδικα της Insert() !

 

Εφόσον το v το περνάς by value στη Insert() ή θα πρέπει στη main() να την καλέσεις με ανάθεση στο v...

 

>
...
v = Insert(d, v);
...

 

ή θα πρέπει το v να το περνάς by reference στην Insert(), οπότε στη main() θα την καλείς ως εξής...

>
...
Insert(d, &v);
...

 

 

Επαναλαμβάνω, τα παραπάνω χωρίς να έχω δει τον κώδικα της Insert(). Ποτέ μην αφήνει δείκτες χωρίς αρχικοποίηση! Κάνε το συνήθεια να τους αρχικοποιείς όταν τους ορίζεις!

 

ΥΓ. Εδώ μπορείς να διαβάσεις σημειώσεις μου για Linked Lists (και για pointers και για strings).

 

EDIT: Αν δεν ξέρεις τι είναι το by value και τι το by reference (πράγμα απίθανο αφού έχετε φτάσει σε λίστες), ίσως σου φανεί χρήσιμο να πας απευθείας εδώ

Δημοσ.

Aλλαξα την Insert ουτως ωστε να παιρνει σαν ορισμα το struct οπως πριν αλλα να επιστρεφει το struct γεμισμενο με στοιχεια καθε φορα.Δουλευει για ενα στοιχειο αλλα οταν παω να προσθεσω περισοτερα πεταει seg.Και συγκεκριμενα βγαζει αυτα:

 

 

In function 'Insert':

warning: control reaches end of non-void function

και

In function 'main':

warning: control reaches end of non-void function

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...