Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct list{
- int info;
- struct list* next;
- } lista;
- typedef lista* plista;
- /*Funzione che calcola la lunghezza di una lista*/
- int lungLista(plista p) {
- int lung=0;
- while (p!=NULL) {
- lung++;
- p = p->next;
- }
- return lung;
- }
- /*Funzione che stampa i valori contenuti nei campo info di una lista */
- void stampaLista(plista p) {
- printf("( ");
- plista t = p;
- if (t==NULL)
- printf("La lista è vuota.\n");
- while (t!=NULL) {
- printf("[");
- printf("%d", t->info);
- printf("] ");
- t = t->next;
- }
- printf(")\n");
- }
- /*Funzione che crea una lista di n elementi da input*/
- plista creaLista () {
- int n, i; //n memorizza il numero degli elementi della lista , i è una variabile indice
- plista temp, p; //p è il puntatore al primo nodo della lista, temp è un puntatore ausiliario per scorrerla
- printf("Specificare il numero di elementi della lista\n");
- scanf("%d",&n);
- if(n==0)
- p = NULL; //creazione di una lista vuota
- else {
- p = (plista) malloc(sizeof(lista));
- printf("Inserisci il primo valore: \n");
- scanf("%d", &p->info); //ho creato il primo nodo della lista, puntato da p
- temp = p; //temp punta al primo nodo come p
- //ora inserisco gli altri elementi della lista
- for (i=2; i<=n; i++) {
- temp->next = (plista) malloc(sizeof(lista)); //il nodo puntato da temp punta a un nuovo nodo vuoto
- temp = temp-> next; //temp punta al nuovo nodo vuoto
- printf("Inserisci il %d elemento della lista\n", i);
- scanf("%d", &temp->info); //assegno il valore al nuovo nodo creato
- }
- temp->next=NULL; //marco la fine della lista
- }
- return p; //Ritorno il puntatore al primo nodo
- }
- /*Funzione che cancella da una lista L i nodi con valore x */
- void cancellaDaLista(plista *s, int x) {
- plista prec, corr;
- while ((*s)->info == x) //elimino tutti i primi nodi adiacenti che hanno valore x, finché non ne incontro uno con valore diverso da x
- if((*s)->next)
- (*s) = (*s)->next;
- prec = (*s);
- corr = (*s)->next;
- while(corr->next) { //scorro la lista fino all'ultimo nodo escluso
- if (corr->info==x) { //elimino il nodo
- corr = corr->next;
- prec->next = corr;
- }
- else { //scalo di 1 in avanti prec e corr
- prec = prec->next;
- corr = corr->next;
- }
- }
- if (corr->info==x) //analizzo l'ultimo nodo della lista
- prec->next=NULL;
- }
- /*Funzione che conta, in una lista, quanti nodi hanno valore x*/
- int conta(plista z, int x) {
- int cont=0;
- while (z->next) {
- if (z->info == x)
- cont++;
- z=z->next;
- }
- //Controllo l'ultimo nodo
- if(z->info==x)
- cont ++;
- return cont;
- }
- //ERRORE: se ho più di un nodo y (entrambi NON in ultima posizione) mi mette il nodo x solo dopo il primo
- /*Funzione che inserisce in L un nodo con valore x dopo un nodo esistente
- in L con valore y (se non esiste alcun nodo con valore y, il nodo con valore x va inserito in coda*/
- void inserisciXdopoY(plista p, int x, int y) {
- plista prec = p;
- plista corr = p->next;
- if (conta(prec,y)==0) { //inserisco il nodo x in coda
- while(corr->next) {
- prec = prec->next;
- corr = corr-> next;
- }
- corr = (plista) malloc(sizeof(lista));
- corr->info=x;
- prec=prec->next;
- prec->next=corr;
- corr->next=NULL;
- }
- else {
- while (corr->next) {
- if (prec->info==y) {
- corr = (plista) malloc(sizeof(lista));
- corr->info=x;
- corr->next = prec->next;
- prec->next = corr;
- prec=prec->next;
- corr=corr->next;
- }
- else {
- prec=prec->next;
- corr=corr->next;
- }
- }
- //Controllo dell'ultimo nodo
- if(corr->info==y) {
- corr = (plista) malloc(sizeof(lista));
- corr->info=x;
- prec=prec->next;
- prec->next=corr;
- corr->next=NULL;
- }
- }
- }
- int main()
- {
- plista p;
- plista *ps;
- p = creaLista(); //p ora punta al primo nodo della lista creata
- ps = &p;
- stampaLista(p);
- printf("Nella lista ci sono %d elementi.\n", lungLista(p));
- cancellaDaLista(ps, 4);
- stampaLista(p);
- printf("Nella lista ci sono %d elementi di valore 3\n", conta(p,3));
- inserisciXdopoY(p,0,10);
- stampaLista(p);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment