Creating a node List

喜你入骨 提交于 2019-12-25 03:59:07

问题


Hey guys i was assigned to build a programm that it will create a node list of 300 nodes. Each node must have a stack with random numbers from 1-100. After that i have to print the list and the stacks plus the sum of all the data. Any ideas?

My code so far is

#include <stdio.h>
#include <stdlib.h>
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) {   //<-- klhsh g odigies
printf("Enter your choice: n"
" 1 to insert an element into list.\n"
" 2 to delete an element from the list.\n"
" 3 to end.\n");
}
void insert(ListNodePtr *sPtr, char value) {
   ListNodePtr newPtr, previousPtr, currentPtr;
   newPtr = malloc(sizeof (ListNode));
   if (newPtr != NULL) {
     newPtr->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) { //<-- delet
  ListNodePtr previousPtr, currentPtr, tempPtr;
  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';
}


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");
 }
}

回答1:


Still not sure what your question is, but you have some issues with your code.

In insert, you have this line:

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

In this case, you're adding the first node to the list. You don't need to set newPtr's next to the dereferenced sPtr. It ought to be NULL since the head of the list doesn't have a next item.


In delete, you have a separate check for the head of the list and then the rest of it. You can condense the check into one and clean up the code.

It would look something like this:

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;

instead of:

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';


来源:https://stackoverflow.com/questions/24511625/creating-a-node-list

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!