Ciao a tutti,
ho una lista di interi doppiamente concatenata. Non capisco come spezzare questa lista e crearne due, la prima conterrà i primi x valori, l'altra conterrà i restanti.
Ad esempio se ho una lista contenente [3 4 5 7 9 6 3] e inserisco x=2, devo stampare la lista [3 4] e la lista [5 7 9 6 3].
Sono riuscito a spezzare la lista secondo il valore dato in input, settando il next dell'elemento uguale all'indice a NULL, quello che non capisco è come creare la nuova lista con gli elementi restanti.
Grazie a tutti
Aggiungo un po' di codice
Strutture.h
operation_on_list.ccodice:struct node{ int iData;//elemento della lista struct node *prev; //puntatore all'elemento precedente della lista; struct node *next; //puntatore all'elemento successivo della lista; }; struct list { char cNomeLista[10]; //array contenente il nome della lista int iNumeroElementi; //numero elementi della lista struct node *header; //puntatore al primo elemento della lista struct node *tail; //puntatore all'ultimo elemento della lista struct list *next; //puntatore alla successiva lista //struct list *; //puntatore alla prima lista };
operation_on_node.ccodice:#include "header.h" #include "strutture.h" /** * Funzione che mi permette di stampare * la lista passata come argomento. */ void print_list(struct list* list){ struct node* tempNode; tempNode = list -> header; int i; printf("\n%s [", list -> cNomeLista); if(list -> iNumeroElementi == 0){ printf("Nil"); }else{ for(i = 0; i < list -> iNumeroElementi; i++){ printf(" %d ", tempNode->iData); tempNode = tempNode -> next; } } printf("]"); } /** * Funzione che stampa tutte le liste * che sono state create e che sono * presenti in memoria. Ogni lista * presente in memoria viene passata come * argomento alla funzione print_list * che si occupa di stamparla. */ void print_allList(struct list* list, int numListe){ int i; for(i = 1; i <= numListe; i++){ print_list(list->next); list = list -> next; } } /** * Funzione che stampa tutti i nomi * delle liste presenti in memoria. */ void printNameOfAllList(struct list *list, int temp){ int i; for(i=0;i<temp;i++){ list = list -> next; printf("\n%s", list -> cNomeLista); } } void testSplit(struct list* list, int k, int contList){ int x = (list -> iNumeroElementi)/k; int i; struct node* tempNode;int temp; //struct list* tempL = init_list(); struct list* newList;// = list;// = tempL; tempNode = list -> header; if(list -> iNumeroElementi == 0){ printf("Split non applicabile ad una lista vuota!\n"); }else{ //list -> iNumeroElementi = x; for(i=0; i < list -> iNumeroElementi; i++){ if(i == (x-1)){ temp = tempNode -> iData; printf("Elemento %d\n ", temp); printf("Numero di elementi della lista %s: %d\n", list -> cNomeLista, list -> iNumeroElementi); tempNode = tempNode -> next = NULL; list -> iNumeroElementi = x; printf("Numero di elementi della lista %s: %d\n", list -> cNomeLista, list -> iNumeroElementi); printf("contList vale %d: ", ++contList); newList = insert_list(newList, contList); printf("Arrivo qui"); insert_node(newList, 123456);insert_node(newList, 23); printf("Arrivo anche qui"); printf("Numero di elementi della nuova lista %d ", newList -> iNumeroElementi); printf("Nome della nuova lista %s ", newList -> cNomeLista); break; } tempNode = tempNode -> next; } } } /** * Funzione che controlla se il nome di lista * inserito corrisponde con un nome di lista * presente in memoria. */ void listPresentOrNotPresent(struct list* list, char *sEnteredName, int contList){ //printf("Sono dentro la funzione listPresentOrNotPresent\n"); int i; int k; //printf("sEnteredName vale: %s\n", sEnteredName); for(i=0; i < contList; i++){ list = list -> next; if(strcmp(list -> cNomeLista, sEnteredName)==0){ //verifico che il nome della lista corrisponde a quello da me inserito printf("Uguali\n"); printf("La lista %s e' composta da %d elementi.\n", list -> cNomeLista, list -> iNumeroElementi); do{ //Se la lista esiste richiedo di inserire il valore di k, controllando di inserire un valore >1. printf("Inserisci un valore intero positivo(maggiore di 1): "); scanf("%d", &k); }while(k<=1); testSplit(list, k, contList); break; }else{ printf("Non uguali\n"); } } } /** * Funzione che, se richiamata, mi permette di * di inizilizzare la lista. */ struct list* init_list (){ printf("Inizializzo la struttura delle liste\n"); struct list *temp; temp = malloc(sizeof(struct list)); temp -> iNumeroElementi=0; temp -> header = NULL; temp -> tail = NULL; temp -> next = NULL; return temp; } /** * Funzione che nserisce una nuova lista in memoria * con nome nel formato List-contList (che è progressivo). */ struct list* insert_list(struct list* list, int contList){ //modifica //creo una nuova lista struct list *new_list; //alloco spazio per la nuova lista new_list = malloc(sizeof(struct list)); sprintf(new_list->cNomeLista, "List-%d", contList); //new_list -> cNomeLista; new_list -> iNumeroElementi = 0; new_list -> header = NULL; new_list -> tail = NULL; list -> next = new_list; new_list -> next = NULL; return new_list; }
main.ccodice:#include "strutture.h" #include "header.h" void insert_node(struct list *list, int iElemento){ //creo un nuovo nodo struct node *new_node; //alloco spazio per il nuovo nodo new_node = malloc(sizeof(struct node)); new_node -> iData = iElemento; new_node -> next = NULL; if(list -> iNumeroElementi==0){ new_node -> prev = NULL; list -> header = new_node; }else{ new_node -> prev = list -> tail; list -> tail -> next = new_node; } list -> tail = new_node; list -> iNumeroElementi++; } int scan_node(struct list* list, int indice){ indice--; if(indice >= list -> iNumeroElementi){ printf("Errore: hai inserito un indice che supera le dimensioni della lista"); return 0; } int i; int iElemento; struct node* tempNode; tempNode = list -> header; for(i = 0; i < list -> iNumeroElementi; i++){ if(i == indice){ iElemento = tempNode -> iData; return iElemento; } tempNode = tempNode -> next; } return 0; }
Se ad esempio al punto a creo una lista (che si chiamerà List-1) con gli elementi [1 2 3 4 5] quando chiamo il punto b sulla lista List-1 e inserendo successivamente k=2, la funzione listPresentOrNotPresent mi chiama la funzione testSplit passando la lista interessata il valore di k e il contList (che forse è inutile). Nella funzione testSplit entra nel ramo else e quando i è uguale a x-1 prendo l'elemento corrispondente e setto il suo next a NULL in modo da modificare la lista, che quindi adesso dovrebbe essere nel formato [1 2], e infatti se richiamo la funzione per stampare le liste la stampa in quel formato. Il problema è che non capisco come creare una nuova lista con gli elementi rimanenti.codice:int main (void){ char cScelta; struct list* first = init_list(); int contList=0; int iElementoDellaLista; int iRestituito; int k; char aczNameOfList[100]; struct list* last_list = first; /*Ciclo while che gira fino a quando e' verificata la condizione 1. Dentro al ciclo faccio la chiamata alla funzione stampaMenu e salvo il valore restituito in una variabile di tipo char che mi permette di scegliere uno dei case corrispondenti.*/ while(1){ cScelta=stampaMenu(); switch (cScelta){ case 'a': printf("Inserisci gli elementi della lista.\n 0 per terminare l'inserimento\n\n"); contList++; last_list = insert_list(last_list, contList); printf("Elemento: "); scanf("%d", &iElementoDellaLista); while(iElementoDellaLista!=0){ insert_node(last_list, iElementoDellaLista); printf("Elemento: "); scanf("%d", &iElementoDellaLista); } break; case 'v': if(contList==0){ printf("Non ci sono liste da stampare\n"); break; }else{ print_allList(first, contList); } break; case 'b': printf("Inserisci il nome di una lista (nel formato List-i) a cui applicare lo split: "); scanf("%s", aczNameOfList); listPresentOrNotPresent(first, aczNameOfList, contList); break; } } }
Grazie ancora.

Rispondi quotando


