Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    11

    lista di stringhe in ordine alfabetico in C

    ciao, dovrei inserire un testo da tastiera e inserirlo in una lista di stringhe ordinata in ordine alfabetico. Ho scritto questo codice ma non ottengo l'ordinamento. Dove sbaglio? grazie.

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

    struct lista{
    char stringa[100];
    struct lista *pun;
    };

    struct lista*inserimento(struct lista *, char *);
    void visualizza(struct lista *);

    main()
    {
    struct lista *puntLista = NULL;

    char parola[100];

    printf("INSERIRE TESTO:\n");
    scanf("%[^\t]", parola);

    puntLista = inserimento(puntLista, parola);
    visualizza(puntLista);

    system("PAUSE");
    return 0;
    }

    struct lista *inserimento(struct lista *p, char *value)
    {
    struct lista *p0, *p1, *p2;
    p0 = (struct lista *)malloc(sizeof(struct lista));

    strcpy(p0->stringa, value);
    if(p == NULL)
    return(p0);

    p1 = p;
    p2 = p;

    while(p1 != NULL && (strcmp(p1->stringa, p0->stringa) != 0)){
    if(strcmp(p1->stringa, value) > 0){
    if(p1 == p){
    p0->pun = p1;
    p = p0;
    return(p);
    }
    else{
    while(p2->pun != p1){
    p2 = p2->pun;
    p0->pun = p1;
    p2->pun = p0;
    return(p);
    }
    }
    p1 = p1->pun;
    }
    if(p1 == NULL){
    while(p2->pun != NULL){
    p2 = p2->pun;
    p2->pun = p0;
    }
    }
    return(p);
    }
    }

    void visualizza(struct lista *p)
    {
    if(p == NULL)
    printf("La lista e' vuota\n");
    else {
    printf("La lista e':\n");

    while(p != NULL){
    printf("%s ", p->stringa);
    p = p->pun;
    }
    printf("\n\n");
    }
    }

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    bhà...onestamente, forse perchè non sono molto esperto, però non so cosa sia quella:
    codice:
    scanf("%[^\t]", parola);
    cioè da quanto ho provato a eseguire, salva tutta la stringa in parola, anche se sono presenti caratteri di tabulazione! ma comunque secondo me era più corretto a questo punto fare un inserimento ordinato, parola per parola! cioè leggi una parola, la inserisci in lista in maniera ordinata!
    poi tra l'altro, va in segmentation quando vai a stampare la lista, perchè l'utimo nodo non ha il puntatore a next settato a NULL, suppongo!
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    11
    ciao MrX87,
    volevo ringraziarti per la tua risposta. Ho riscritto il programma, se uso una lista di caratteri funziona correttamente, se uso invece le stringhe quando mi visualizza la lista mi mostra solo l'ultima parola inserita. Inoltre ti volevo chiedere se fosse possibile, invece di inserire una parola per volta, inserire direttamente un testo e fare in modo che il programma inserisca ogni singola parola nella lista. Ho pensato di usare un ciclo while però nn riesco a farlo funzionare.

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

    struct listNode{
    char *stringa;
    struct listNode *nexPtr;
    };

    typedef struct listNode LISTNODE;
    typedef LISTNODE *LISTNODEPTR;

    void insert(LISTNODEPTR *, char *);
    char deletel(LISTNODEPTR *, char *);
    int isEmpty(LISTNODEPTR);
    void printList(LISTNODEPTR);
    void instructions(void);

    main()
    {
    LISTNODEPTR startPtr = NULL;
    int choice;
    char item[30];

    instructions();
    printf("? ");
    scanf("%d", &choice);

    while(choice != 3){

    switch(choice){
    case 1:
    printf("carattere\n");
    scanf("\n%s", item);
    insert(&startPtr, item);
    printList(startPtr);
    break;
    case 2:
    if(!isEmpty(startPtr)){
    printf("carattere cancellare\n");
    scanf("\n%s", item);

    if(deletel(&startPtr, item)){
    printf("%s cancellato\n", item);
    printList(startPtr);
    }
    else
    printf("%s nn trovato\n", item);
    }
    else
    printf("la lista è vuota\n");
    break;

    default:
    printf("Scelta nn valida\n");
    instructions();
    break;
    }
    printf("? ");
    scanf("%d", &choice);
    }
    printf("Fine esecuzione.\n");

    system("PAUSE");

    return 0;

    }

    /* definizione funzioni */

    void instructions(void)
    {
    printf("Inserire:\n"
    "1 - per inserire un elemento;\n"
    "2 - per cancellare un elemento;\n"
    "3 - per terminare.\n\n");
    }

    void insert(LISTNODEPTR *sPtr, char *value)
    {
    LISTNODEPTR newPtr, previousPtr, currentPtr;

    newPtr =(LISTNODEPTR)malloc(sizeof(LISTNODE));

    if(newPtr != NULL){
    newPtr->stringa = value;
    newPtr->nexPtr = NULL;

    previousPtr = NULL;
    currentPtr = *sPtr;

    while(currentPtr != NULL && value > currentPtr->stringa){
    previousPtr = currentPtr;
    currentPtr = currentPtr->nexPtr;
    }
    if(previousPtr == NULL){
    newPtr->nexPtr = *sPtr;
    *sPtr = newPtr;
    }
    else{
    previousPtr->nexPtr = newPtr;
    newPtr->nexPtr = currentPtr;
    }
    }
    else
    printf("%c nn inserito. Memoria nn disponibile\n");
    }

    char deletel(LISTNODEPTR *sPtr, char *value)
    {
    LISTNODEPTR previousPtr, currentPtr, tempPtr;

    if(value == (*sPtr)->stringa){
    tempPtr = *sPtr;
    *sPtr = (*sPtr)->nexPtr;
    free(tempPtr);
    return *value;
    }
    else{
    previousPtr = *sPtr;
    currentPtr = (*sPtr)->nexPtr;

    while(currentPtr != NULL && currentPtr->stringa != value){
    previousPtr = currentPtr;
    currentPtr = currentPtr->nexPtr;
    }

    if(currentPtr != NULL){
    tempPtr = currentPtr;
    previousPtr->nexPtr = currentPtr->nexPtr;
    free(tempPtr);
    return *value;
    }
    }
    return '\0';
    }

    int isEmpty(LISTNODEPTR sPtr)
    {
    return sPtr == NULL;

    }

    void printList(LISTNODEPTR currentPtr)
    {
    if(currentPtr == NULL)
    printf("la lista e' vuota\n");
    else{
    printf("la lista e':\n");

    while(currentPtr != NULL){
    printf("%s --> ", currentPtr->stringa);
    currentPtr = currentPtr->nexPtr;
    }

    printf("NULL\n\n");
    }
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    11
    scusa l'ultimo programma che ho scritto era errato, avevo dimenticato #include<string.h> e che il confronto tra stringhe si fa con strcmp, però comunque il problema rimane.

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

    struct listNode{
    char *stringa;
    struct listNode *nexPtr;
    };

    typedef struct listNode LISTNODE;
    typedef LISTNODE *LISTNODEPTR;

    void insert(LISTNODEPTR *, char *);
    char deletel(LISTNODEPTR *, char *);
    int isEmpty(LISTNODEPTR);
    void printList(LISTNODEPTR);
    void instructions(void);

    main()
    {
    LISTNODEPTR startPtr = NULL;
    int choice;
    char item[30];

    instructions();
    printf("? ");
    scanf("%d", &choice);

    while(choice != 3){

    switch(choice){
    case 1:
    printf("carattere\n");
    scanf("\n%s", item);
    insert(&startPtr, item);
    printList(startPtr);
    break;
    case 2:
    if(!isEmpty(startPtr)){
    printf("carattere cancellare\n");
    scanf("\n%s", item);

    if(deletel(&startPtr, item)){
    printf("%s cancellato\n", item);
    printList(startPtr);
    }
    else
    printf("%s nn trovato\n", item);
    }
    else
    printf("la lista è vuota\n");
    break;

    default:
    printf("Scelta nn valida\n");
    instructions();
    break;
    }
    printf("? ");
    scanf("%d", &choice);
    }
    printf("Fine esecuzione.\n");

    system("PAUSE");

    return 0;

    }

    /* definizione funzioni */

    void instructions(void)
    {
    printf("Inserire:\n"
    "1 - per inserire un elemento;\n"
    "2 - per cancellare un elemento;\n"
    "3 - per terminare.\n\n");
    }

    void insert(LISTNODEPTR *sPtr, char *value)
    {
    LISTNODEPTR newPtr, previousPtr, currentPtr;

    newPtr =(LISTNODEPTR)malloc(sizeof(LISTNODE));

    if(newPtr != NULL){
    newPtr->stringa = value;
    newPtr->nexPtr = NULL;

    previousPtr = NULL;
    currentPtr = *sPtr;

    while(currentPtr != NULL && strcmp(value, currentPtr->stringa) > 0){
    previousPtr = currentPtr;
    currentPtr = currentPtr->nexPtr;
    }
    if(previousPtr == NULL){
    newPtr->nexPtr = *sPtr;
    *sPtr = newPtr;
    }
    else{
    previousPtr->nexPtr = newPtr;
    newPtr->nexPtr = currentPtr;
    }
    }
    else
    printf("%s nn inserito. Memoria nn disponibile\n");
    }

    char deletel(LISTNODEPTR *sPtr, char *value)
    {
    LISTNODEPTR previousPtr, currentPtr, tempPtr;

    if(value == (*sPtr)->stringa){
    tempPtr = *sPtr;
    *sPtr = (*sPtr)->nexPtr;
    free(tempPtr);
    return *value;
    }
    else{
    previousPtr = *sPtr;
    currentPtr = (*sPtr)->nexPtr;

    while(currentPtr != NULL && strcmp(currentPtr->stringa, value) != 0){
    previousPtr = currentPtr;
    currentPtr = currentPtr->nexPtr;
    }

    if(currentPtr != NULL){
    tempPtr = currentPtr;
    previousPtr->nexPtr = currentPtr->nexPtr;
    free(tempPtr);
    return *value;
    }
    }
    return '\0';
    }

    int isEmpty(LISTNODEPTR sPtr)
    {
    return sPtr == NULL;

    }

    void printList(LISTNODEPTR currentPtr)
    {
    if(currentPtr == NULL)
    printf("la lista e' vuota\n");
    else{
    printf("la lista e':\n");

    while(currentPtr != NULL){
    printf("%s --> ", currentPtr->stringa);
    currentPtr = currentPtr->nexPtr;
    }

    printf("NULL\n\n");
    }
    }

  5. #5
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Il regolamento l'hai letto prima di postare?

    Illeggibile il codice scritto così.. utilizza i tag code o php e un po' di identazione.. così non lo leggerà nassuno..

  6. #6
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ho guardato un pò il codice e comunque quoto pienamente quello che dice Stoicenko, che il codice va postato nei tag appositi...comunque, è corretto fondamentalmente, era sbagliato solo nella gestione delle stringhe nella funzione di insert, ovvero qua:
    codice:
    ...
    if(newPtr != NULL){
    newPtr->stringa = value;
    newPtr->nexPtr = NULL;
    ...
    non puoi mica gestire con i puntatori queste stringhe, questo perchè al secondo inserimento, value cambia, e quindi newPtr->stringa va a puntare a value che è diventata una stringa diversa! in questo caso devi prima allocare la newPtr->stringa della dimensione di value+1(per il terminatore di stringa) e copiare le stringhe con la strcpy() value in newPtr->stringa, in codice così:
    codice:
    newPtr->stringa = (char*)malloc((strlen(value)+1)*sizeof(char));
          if ( newPtr->stringa == NULL ) {
               printf ("Memoria non disponibile\n");
               system ("pause");
               exit(1);
          }
          strcpy ( newPtr->stringa, value );
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    11
    grazieee, funziona ora. grazie davvero javascript:void(0);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.