2 votes

Enregistrement d'une chaîne de caractères dans une liste dynamique

J'essaie de créer une liste dynamique, qui doit lire une chaîne en entrée et enregistrer chaque chaîne dans un nouveau noeud de la liste. Le programme va imprimer chaque noeud, ensuite je veux ajouter une fonction pour supprimer un noeud, mais j'obtiens beaucoup d'erreurs, principalement parce que je ne suis pas très bon dans l'utilisation des pointeurs et que je suis nouveau dans les structures de données, est-ce que quelqu'un peut m'aider ?

EDIT : J'ai corrigé le code, maintenant je n'obtiens plus les erreurs mais le programme semble imprimer pour chaque noeud un seul caractère, au lieu d'une chaîne pour chaque noeud, c'est la sortie actuelle :

// Inserting and deleting nodes in a list
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// self-referential structure                       
struct listNode {                                      
   char *data; // each listNode contains a character 
   struct listNode *nextPtr; // pointer to next node
}; 
typedef struct listNode ListNode; // synonym for struct listNode
typedef ListNode *ListNodePtr; // synonym for ListNode*

// prototypes
void insert(ListNodePtr *sPtr, char *value);
int isEmpty(ListNodePtr sPtr);
void printList(ListNodePtr currentPtr);
void instructions(void);
int main(void)
{ 
   ListNodePtr startPtr = NULL; // initially there are no nodes
   char item; // char entered by user
   instructions(); // display the menu
   printf("%s", "? ");
   unsigned int choice; // user's choice
   scanf("%u", &choice);
   // loop while user does not choose 3
   while (choice != 3) { 
      switch (choice) { 
         case 1:
            printf("%s", "Enter a character: ");
            scanf("%c", &item);
            insert(&startPtr, &item); // insert item in list
            printList(startPtr);
            break;

         default:
            puts("Invalid choice.\n");
            instructions();
            break;
      } // end switch
      printf("%s", "? ");
      scanf("%u", &choice);
   } 
   puts("End of run.");
} 
// display program instructions to user
void instructions(void)
{ 
   puts("Enter your choice:\n"
      "   1 to insert an element into the list.\n"
      "   2 to delete an element from the list.\n"
      "   3 to end.");
}

// insert a new value into the list in sorted order
void insert(ListNodePtr *sPtr, char *value)
{ 
   ListNodePtr newPtr = malloc(sizeof(ListNode)); // create node

   if (newPtr != NULL) { // is space available
      newPtr->data= malloc(strlen(value)+1);
      strcpy(newPtr->data, value);
      newPtr->nextPtr = NULL; // node does not link to another node
      ListNodePtr previousPtr = NULL;
      ListNodePtr currentPtr = *sPtr;
      // loop to find the correct location in the list       
      while (currentPtr != NULL && value > currentPtr->data) {
         previousPtr = currentPtr; // walk to ...               
         currentPtr = currentPtr->nextPtr; // ... next node 
      }                                          
      // insert new node at beginning of list
      if (previousPtr == NULL) { 
         newPtr->nextPtr = *sPtr;
         *sPtr = newPtr;
      } 
      else { // insert new node between previousPtr and currentPtr
         previousPtr->nextPtr = newPtr;
         newPtr->nextPtr = currentPtr;
      } 
   } 
   else {
      printf("%s not inserted. No memory available.\n", value);
   } 
} 

int isEmpty(ListNodePtr sPtr)
{ 
   return sPtr == NULL;
}

// print the list
void printList(ListNodePtr currentPtr)
{ 
   // if list is empty
   if (isEmpty(currentPtr)) {
      puts("List is empty.\n");
   } 
   else { 
      puts("The list is:");
      // while not the end of the list
      while (currentPtr != NULL) { 
         printf("%s --> ", currentPtr->data);
         currentPtr = currentPtr->nextPtr;   
      } 
      puts("NULL\n");
   } 
} 

Voici un exemple de la sortie actuelle :

    ./test
Enter your choice:
   1 to insert an element into the list.
   2 to delete an element from the list.
   3 to end.
? 1
Enter a character: The list is:

 --> NULL

? Test
Enter a character: The list is:

 --> T --> NULL

? Enter a character: The list is:

 --> T --> e --> NULL

? Enter a character: The list is:

 --> T --> e --> s --> NULL

? Enter a character: The list is:

 --> T --> e --> s --> t --> NULL

? 

Là où je veux qu'il soit, par exemple : Mot un -> Mot deux, etc.

3voto

Jacob Boertjes Points 890

Pour obtenir les données de l'utilisateur, vous utilisez

scanf("%c", &item); 

Cela ne permettra d'obtenir qu'un seul personnage à partir de leur entrée. Si vous voulez obtenir une chaîne de caractères, vous pouvez mettre à jour item est un tableau de caractères :

char item[20];

Je pense également que fgets est plus efficace pour obtenir des chaînes de caractères saisies par l'utilisateur, comme décrit dans la rubrique aquí . L'utilisation de ce qui suit rendrait probablement votre programme un peu plus durable :

fgets(item, sizeof(item), stdin);

Après ces modifications, voici le résultat :

Enter your choice:
1 to insert an element into the list.
2 to delete an element from the list.
3 to end.
? 1
Enter a character: The list is:

--> NULL

? Testing
Enter a character: The list is:

--> Testing
--> NULL

? What
Enter a character: The list is:

--> Testing
--> What
--> NULL

? About
Enter a character: The list is:

--> Testing
--> What
--> About
--> NULL

? This
Enter a character: The list is:

--> Testing
--> What
--> About
--> This
--> NULL

? 

EDIT : Les points suivants ont déjà été abordés dans le code de la question.

newPtr->data est un char mais il semble que vous souhaitiez qu'il s'agisse d'une chaîne de caractères. Vous devriez modifier la définition de la structure de manière à ce que data est un char * au lieu de cela.

Si vous essayez d'imprimer une chaîne de caractères au lieu d'un seul caractère, vous devez remplacer :

printf("%c not inserted. No memory available.\n", value);
// as well as
printf("%c --> ", currentPtr->data);

Avec :

printf("%s not inserted. No memory available.\n", value);
// and
printf("%s --> ", currentPtr->data);

En %c est utilisé pour formater un seul caractère, mais %s est utilisé pour imprimer une chaîne de caractères, et doit être associé à un char *

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X