Newsgroup: it.comp.lang.c
Titolo: problemi con le liste

Ciao, avete qualche semplice programma che usi le liste da spedirmi?.
Grazie.
Paolo.
--
Posted from 
mta01-acc.tin.it
 [212.216.176.32]
via Mailgate.ORG Server - 
http://www.mailgate.org

Ciao, avete qualche semplice programma che usi le liste da spedirmi?.
#include <stdio.h>
#include <stdlib.h>
typedef struct item_tag {
                           char * x ;
                           struct item_tag * next ;
                        } * item_p ;
void inserisci ( item_p * radice, char * x )
{
     if ( NULL == *radice )
     {
        *radice = malloc ( sizeof * radice ) ;
        (*radice)->x = malloc ( strlen ( x ) + 1 ) ;
        (*radice)->next = NULL ;
        strcpy ( (*radice)->x, x ) ;
     }
     else inserisci ( &(*radice)->next, x ) ;
}
void scrivi ( item_p radice )
{
     if ( radice != NULL )
     {
        printf ( "%s -> ", radice->x ) ;
        scrivi ( radice->next ) ;
     }
     else printf ("NULL\n" ) ;
}
void set_last ( char * a, char c )
{
     while ( *a++ != '\n' ) ;
     *(a-1) = 0 ;
}
int main()
{
    item_p mia_lista = NULL ;
    char nome [ 20 ] ;
    int i = 0 ;
    do
    {
       printf ( "inserisci nome %d : ", ++i ) ;
       fgets ( nome, sizeof nome, stdin ) ;
       set_last ( nome, 0 ) ;
       inserisci ( &mia_lista, nome ) ;
    } while ( i < 5 ) ;
    scrivi ( mia_lista ) ;
    return 0 ;
}

 wrote:
[ snip ]
AL>typedef struct item_tag {
AL>                           char * x ;
AL>                           struct item_tag * next ;
AL>                        } * item_p ;
AL>void inserisci ( item_p * radice, char * x )
AL>{
AL>     if ( NULL == *radice )
AL>     {
AL>        *radice = malloc ( sizeof * radice ) ;
                              ^^^^^^^^^^^^^^^
Questo pero' e' sbagliato. Devi riservare memoria per la struttura
item_tag, mentre "*radice" e' di tipo 'item_p'.
Sostituiscilo con 
	"sizeof (struct item_tag)" 
oppure 
	"sizeof **radice".
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

Questo pero' e' sbagliato. Devi riservare memoria per la struttura
E' giusto :         *radice = malloc ( sizeof ** radice ) ;

, 
jag...@tin.it
 says...
Questa e' roba a livello di esercizio c'e' sicuramente qlcosa di più 
efficiente,ma come esempio dovrebbe andarti bene,sono esercizi che feci 
io:
#include <stdio.h>
#include <stdlib.h>
typedef struct lista{
	char a;
    struct lista *next;
}LISTA;
LISTA *conc(char *p){
    static LISTA *head;
	extern LISTA *create_element();
	LISTA *temp,*list;
 
	list=create_element();
	if(head==NULL){
		head=list;
		head->a=*p;
        list=create_element();
	}
	for(temp=head;temp->next!=NULL;temp=temp->next)
		;
	temp->next=list;
	if(temp->next->a=*++p)
		conc(p);
	else return head;
    return head;
}
LISTA *conc2(char *punt){
    static LISTA *head2;
	extern LISTA *create_element();
	LISTA *temp2,*list2;
 
	list2=create_element();
	if(head2==NULL){
		head2=list2;
		head2->a=*punt;
        list2=create_element();
	}
	for(temp2=head2;temp2->next!=NULL;temp2=temp2->next)
		;
	temp2->next=list2;
	if(temp2->next->a=*++punt)
		conc2(punt);
	else return head2;
    return head2;
}
void main(){
static char ar[100];
 
    extern LISTA *conc(char *);
	extern LISTA *conc2(char *);
	extern void conca_conc(LISTA *,LISTA *);
	LISTA *finale,*testa1,*testa2;
	printf("Immetti una stringa:\n");
	gets(ar);
	testa1=conc(ar);
	testa2=conc2(ar);
    conca_conc(testa1,testa2);
	for(finale=testa1;finale->next!=NULL;finale=finale->next)
		printf("%c",finale->a);
	printf("\n");
 
	exit(0);
}
LISTA *create_element(){
	LISTA *ptr;
 
	ptr=(LISTA *)malloc(sizeof(LISTA));
	if(ptr==NULL){
	   printf("malloc non riuscita\n");
	   exit(1);
	   }
 
	ptr->next=NULL;
	return ptr;
}
void conca_conc(LISTA *testa1,LISTA *testa2){  /*Concatena le liste conc 
e conc2*/
 LISTA *p1=testa1,*p2=testa2;
 
 
	if(p1->next != NULL){
	  p1=p1->next;
	  conca_conc(p1,p2);
	}
	  if(p1->next==NULL){
          p1->next=p2;
	   return;
	  }
}
-------------------------------------------------------------------------
-------------------
/*Siccome non ho ben capito quel che chiede l'esercizio ne ho fatte due 
versioni.*/
#include <stdio.h>
#include <stdlib.h>
typedef struct lista{
	char a;
    struct lista *next;
}LISTA;
static LISTA *head,*head2,*finale;
void main(){
 
	static char ar[100];
	extern void conca(LISTA *,LISTA *,char);
	extern LISTA *head,*head2;
    static char *punt,*punt2,num;
	static LISTA *p1,*p2;
 
    punt=ar;
	punt2=ar;
	printf("Immetti una stringa:\n");
	gets(ar);
	num=strlen(ar);
    conca(p1,p2,num);
	for(finale=head;finale->next!=NULL;finale=finale->next){
        if(*punt!='\0')
		finale->a=*punt++;
		else
		finale->a=*punt2++;
		printf("%c",finale->a);
	}
	printf("\n");
 
	exit(0);
}
void conca(LISTA *p1,LISTA *p2,char num){
    extern LISTA *head,*head2;
	if((p1==NULL)&&(p2==NULL)){
		p1=malloc(sizeof(LISTA));
		p2=malloc(sizeof(LISTA));
		head=p1;
		head2=p2;
	}
 
	p1->next=malloc(sizeof(LISTA));
	p1->next->next=NULL;
	p2->next=malloc(sizeof(LISTA));
	p2->next->next=NULL;
	p1=p1->next;p2=p2->next;
	if(num-- == 0){
		p1->next=head2;
		return;
	}
	else conca(p1,p2,num);
}

Ho trovato pure questa:
#include <stdio.h>
#include <stdlib.h>
typedef struct lista{
	char a;
    struct lista *next;
}LISTA;
LISTA *conc(char *p){
    static LISTA *head;
	extern LISTA *create_element();
	LISTA *temp,*list;
 
	list=create_element();
	if(head==NULL){
		head=list;
		head->a=*p;
        list=create_element();
	}
	for(temp=head;temp->next!=NULL;temp=temp->next)
		;
	temp->next=list;
	if(temp->next->a=*++p)
		conc(p);
	else return head;
    return head;
}
void main(){
static char ar[100];
    extern int count_element(LISTA *);
	LISTA *finale;
	int count = 0;
	printf("Immetti una stringa:\n");
	gets(ar);
    printf("Lista ha %d elementi.\n",count=count_element(conc(ar)));
 
	exit(0);
}
LISTA *create_element(){
	LISTA *ptr;
 
	ptr=(LISTA *)malloc(sizeof(LISTA));
	if(ptr==NULL){
	   printf("malloc non riuscita\n");
	   exit(1);
	   }
 
	ptr->next=NULL;
	return ptr;
	}
int count_element(LISTA *p){  /*Conta elementi allocati*/
   static int j=0;
     LISTA *ptr=p;
	 if(ptr->next != NULL){
	   ptr=ptr->next;
	   j++;
	   count_element(ptr);
	 }
	 return j;
}