Création d’une liste de noeuds

Hé les gars, on m’a demandé de construire un programme pour créer une liste de 300 nœuds. Chaque nœud doit avoir une stack avec des nombres aléatoires compris entre 1 et 100. Après cela, je dois imprimer la liste et les stacks plus la sum de toutes les données. Des idées?

Mon code jusqu’ici est

#include  #include  struct listNode { // <====== char data; struct listNode *nextPtr; }; typedef struct listNode ListNode; typedef ListNode* ListNodePtr; void insert(ListNodePtr *sPtr, char value); char delete(ListNodePtr *sPtr, char value); int isEmpty(ListNodePtr sPtr); void printList(ListNodePtr currentPtr); void instructions(void); int main(int argc, char** argv) { ListNodePtr startPtr = NULL; int choice; char item; instructions(); printf("? "); scanf("%d", &choice); while (choice != 3) { switch (choice) { case 1: printf("Enter a character: "); scanf("%c", &item); insert(&startPtr, item); printList(startPtr); break; case 2: if (!isEmpty(startPtr)) { printf("Enter character to be deleted: "); scanf("\n%c", &item); if (delete(&startPtr, item)) { printf("%c deleted.\n", item); printList(startPtr); } else { printf("%c not found.\n\n", item); } } else { printf("List is empty.\n\n"); } break; default: printf("Invalid choice.\n\n"); instructions(); break; } printf("? "); scanf("%d", &choice); } printf("End of run.\n"); system("PAUSE"); return (EXIT_SUCCESS); } void instructions(void) { //data = value; newPtr->nextPtr = NULL; previousPtr = NULL; currentPtr = *sPtr; while (currentPtr != NULL && value > currentPtr->data) { previousPtr = currentPtr; currentPtr = currentPtr->nextPtr; } if (previousPtr == NULL) { newPtr->nextPtr = *sPtr; *sPtr = newPtr; } else { previousPtr->nextPtr = newPtr; newPtr->nextPtr = currentPtr; } } else { printf("%c not inserted. No memory available.\n", value); } } char delete(ListNodePtr *sPtr, char value) { //data) { tempPtr = *sPtr; *sPtr = (*sPtr)->nextPtr; free(tempPtr); return value; } else { previousPtr = *sPtr; currentPtr = (*sPtr)->nextPtr; while (currentPtr != NULL && currentPtr->data != value) { previousPtr = currentPtr; currentPtr = currentPtr->nextPtr; } if (currentPtr != NULL) { tempPtr = currentPtr; previousPtr->nextPtr = currentPtr->nextPtr; free(tempPtr); return value; } } return '\0'; } int isEmpty(ListNodePtr sPtr) { //klhsh empty return sPtr == NULL; } void printList(ListNodePtr currentPtr) { if (currentPtr == NULL) { printf("List is empty.\n\n"); } else { printf("The list is:\n"); while (currentPtr != NULL) { printf("%c --> ", currentPtr->data); currentPtr = currentPtr->nextPtr; } printf("NULL\n\n"); } } 

Vous n’êtes toujours pas sûr de votre question, mais vous avez des problèmes avec votre code.

En insert, vous avez cette ligne:

 if (previousPtr == NULL) { newPtr->nextPtr = *sPtr; *sPtr = newPtr; 

Dans ce cas, vous ajoutez le premier nœud à la liste. Vous n’avez pas besoin de définir newPtr côté du sPtr déréférencé. Il doit être NULL car le responsable de la liste n’a pas d’élément suivant.


En suppression, vous avez un chèque séparé pour l’en-tête de la liste, puis le rest. Vous pouvez condenser le contrôle en un seul et nettoyer le code.

Cela ressemblerait à ceci:

 currentPtr = *sPtr; while (currentPtr != NULL && currentPtr->data != value) { //walking the linked list previousPtr = currentPtr; currentPtr = currentPtr->nextPtr; } if(currentPtr == NULL) return '\0'; //end early if you don't find anything previousPtr->nextPtr = currentPtr->nextPtr; //since it's singly linked, just skip the currrent ptr char temp = currentPtr->data; free(currentPtr); return temp; 

au lieu de:

 if (value == (*sPtr)->data) { tempPtr = *sPtr; *sPtr = (*sPtr)->nextPtr; free(tempPtr); return value; } else { previousPtr = *sPtr; currentPtr = (*sPtr)->nextPtr; while (currentPtr != NULL && currentPtr->data != value) { previousPtr = currentPtr; currentPtr = currentPtr->nextPtr; } if (currentPtr != NULL) { tempPtr = currentPtr; previousPtr->nextPtr = currentPtr->nextPtr; free(tempPtr); return value; } } return '\0';