Newsgroup: it.comp.lang.c
Titolo: 2° esercizio di esame

scrivere un programma che disponga, su di una lista ordinata, delle
stringhe ricevute dallo stdin in base al loro valore, ottenuto
calcolando la somma dei caratteri delle stringhe visti come interi in
codice ASCII
allora io ho prodotto questo.....ma stranemente non funziona!!!
un lista ordinata in base al suo valore (somma dei codici ASCII dei
caratteri
costituenti la stringa stessa).*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct list_tag{
	int value;
	struct list_tag *next;
	char *string;
} ListNode;
void insert(ListNode **, char *);
void print_list(ListNode *);
void print_list(ListNode *lp)
{
	if(lp){
		printf("%d   %s\n", lp->value, lp->string);
		print_list(lp->next);
	}
}
void insert(ListNode **lpp, char *s)
{
	int i, value = 0;
	ListNode *newptr, *previous, *current;
	for(i = 0; s[i] != '\0'; i++)
		value += (int) s[i];
	newptr = (ListNode *) malloc(sizeof(ListNode));
	newptr->string = (char *) malloc(sizeof(char)*(strlen(s)+1));
	if(newptr && newptr->string){
		previous = NULL;
		current = *lpp;
		newptr->value = value;
		strcpy(newptr->string, s);
		while(current && current->value < value){
			previous = current;
			current = current->next;
		}                  //fine while
		if(!previous){              //se non ci sono nodi nella lista
			newptr->next = *lpp;
			*lpp = newptr;
		}                /fine if
		else{
			previous->next = newptr;
			newptr->next = current;
		}
	}                       //fine if esterno
	else printf("memory not available\n");
}
int main(void)
{
	char *s;
	int choice;
	ListNode *root = NULL;
	printf("do your choice: 1 to insert a new string,  any other key to
esc\n");
	scanf("%d", &choice);
	while(choice){
		insert(&root, s=gets(s));
		printf("do your choice: 1 to insert a new string,  any other key to
esc\n");
		scanf("%d", &choice);
	}
        printf("The list is:  ");
	print_list(root);
	return 0;
}



 allora io ho prodotto questo.....ma stranemente non funziona!!!
E se prima di "produrre" passassi un po' di tempo ad istruirti
su puntatori, array stringhe et similia? Mi sembri un po'
deboluccio sull'argomento. :-|
La gets() (funziona da evitare come la peste) gradisce in input
un buffer di memoria (blocco di memoria gia' allocato), non un
puntatore a chissacosa: anche questa funzione (come la strcat)
NON alloca memoria.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 codice ASCII
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node_tag {
        char *s;
        int v;
        struct node_tag *next;              
} node_t, *pnode_t;
#ifndef strdup
char* strdup(const char *s) {
     char *p=malloc(strlen(s)+1);
     if (p) { strcpy(p, s); }
     return p;
}
#endif
int value(const char *s) {
    int i, res=0;
    for (i=0; s[i]; i++) res += s[i];
    return res;
}
pnode_t new_node(const char *s) {
     pnode_t n = malloc(sizeof *n);
     if (n) {               
        n->s=strdup(s);
        n->v=value(s);     
        n->next=0;
     }
     return n;
}
void add_node(pnode_t* phead, const char *s) {
     pnode_t n = new_node(s);
     if ((*phead && n->v < (*phead)->v) || (!*phead)) {
        n->next = *phead;
        *phead = n;
     }         
     else
       add_node(&(*phead)->next, s);
}
void list_free(pnode_t self) {
     if (self) {
        list_free(self->next);
        if (self->s) free(self->s);
        free(self);               
     }
}
void list_dump(pnode_t self) {
     if (self) {
        printf("\"%s\" (%d) -->\n", self->s, self->v);       
        list_dump(self->next);       
     }
     else printf("END\n");
}
int main()
{
    pnode_t head=0;
 
    add_node(&head, "pisolo");    
    add_node(&head, "cucciolo");        
    add_node(&head, "mammolo");    
    add_node(&head, "brontolo");    
    add_node(&head, "gongolo");        
    add_node(&head, "eolo");    
    add_node(&head, "dotto");        
 
    list_dump(head);
    list_free(head);
 
    return 0;
}
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it