eric eric
eric eric

Reputation: 55

AddNumber function in program not working

I am having trouble understanding what I should do in the AddNumber function of my program. When the AddNumber function is called in main a pointer variable previous is created, and it takes the user's input and points it at the address of the variable newNum. I created an if statement for it to do that, but I was informed it doesn't do anything.

#include "stdio.h"
#include "string.h"
#include "stdlib.h"


typedef struct A_NewNumber{
    struct A_NewNumber *next;
    double newNum;
} NewNumber;


NewNumber *AddNumber(NewNumber *previous, char *input){
    //char input[16];
    //double numEntered = 0;

    NewNumber *newNum = malloc(sizeof(NewNumber));
    sscanf(input, "%lf", &newNum->newNum);


    //sscanf(input, "%s", newNum->enterNumber);
    //numEntered = atof(input);

    /*if (previous != NULL){
        previous->newNum;
    }*/
    newNum->next = NULL;
    newNum->newNum = 0;
    return newNum;

}

void PrintList(NewNumber *start){
    NewNumber *currentNumber = start;
    int count = 0;

    while(currentNumber != NULL){
        count++;
        printf("Numbers:%lf\n", 
            currentNumber->newNum); 
        currentNumber = currentNumber->next;
    }
    printf("Total Numbers Entered%d\n", count);
}

void CleanUp(NewNumber *start){
    NewNumber *freeMe = start;
    NewNumber *holdMe = NULL;

    while(freeMe != NULL){
        holdMe = freeMe->next;
        free(freeMe);
        freeMe = holdMe;
    }
}

int main(){
    //indexNum = 0;
    char command[16];
    char input[16];
    //float userInput;
    NewNumber *userEnter = NULL;
    NewNumber *start = NULL;
    NewNumber *newest = NULL;

    while(fgets(input, sizeof input, stdin)){
        printf("Please enter a number->");
        printf("Enter 'quit' to stop or 'print' to print/calculate");
        sscanf(input, "%s", command);
        if(newest == NULL){
            start = AddNumber(NULL, input);
            newest = start;
        }else{
            newest = AddNumber(newest, input);
        }if(strncmp(command, "print", 5) == 0){
            PrintList(start);
        }else if(strncmp(command, "quit", 4)== 0){
            printf("\n\nQuitting....\n");
            break;
           //userInput = enterNumber;
        }
    }
    CleanUp(start);
    return 0;
}

}

Upvotes: 2

Views: 90

Answers (1)

deamentiaemundi
deamentiaemundi

Reputation: 5525

It was not that bad, was just in need of a bit of clean-up.

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

    // ALL CHECKS OMMITTED!

typedef struct A_NewNumber {
  struct A_NewNumber *next;
  double newNum;
} NewNumber;


NewNumber *AddNumber(NewNumber * previous, char *input)
{
  int res;
  // allocate new node
  NewNumber *newNum = malloc(sizeof(NewNumber));

  if (newNum == NULL) {
    fprintf(stderr, "Malloc failed in AddNUmber()\n");
    return previous;
  }
  // convert input string to float
  res = sscanf(input, "%lf", &newNum->newNum);
  if (res != 1) {
    fprintf(stderr, "Something bad happend in AddNUmber()\n");
    return previous;
  }
  // terminate that node
  newNum->next = NULL;
  // if this is NOT the first node
  // put new node to the end of the list
  if (previous != NULL) {
    previous->next = newNum;
  }
  // return pointer to new node at end of the list
  return newNum;
}

void PrintList(NewNumber * start)
{
  NewNumber *currentNumber = start;
  int count = 0;

  while (currentNumber != NULL) {
    count++;
    printf("Numbers:%lf\n", currentNumber->newNum);
    currentNumber = currentNumber->next;
  }
  printf("Total Numbers Entered %d\n", count);
}

void CleanUp(NewNumber * start)
{
  NewNumber *freeMe = start;
  NewNumber *holdMe = NULL;

  while (freeMe != NULL) {
    holdMe = freeMe->next;
    free(freeMe);
    freeMe = holdMe;
  }
}

int main()
{
  char input[16];
  NewNumber *start = NULL;
  NewNumber *newest = NULL;
  int res;

  // infinite loop
  while (1) {
    // give advise
    printf("Please enter a number or\n");
    printf("'quit' to stop or 'print' to print/calculate\n");
    // get input from user
    res = scanf("%s", input);
    if (res != 1) {
      if (res == EOF) {
        fprintf(stderr, "Got EOF, bailing out\n");
        break;
      } else {
        fprintf(stderr, "something bad happend, bailing out\n");
        break;
      }
    }
    // check if a command was given
    if (strncmp(input, "print", 5) == 0) {
      PrintList(start);
      continue;
    } else if (strncmp(input, "quit", 4) == 0) {
      printf("\n\nQuitting....\n");
      break;
    }
    // otherwise gather numbers
    if (newest == NULL) {
      start = AddNumber(NULL, input);
      if (start == NULL) {
        fprintf(stderr, "AddNumber returned NULL\n");
        break;
      }
      newest = start;
    } else {
      newest = AddNumber(newest, input);
      if (newest == NULL) {
        fprintf(stderr, "AddNumber returned NULL\n");
        break;
      }
    }
  }
  CleanUp(start);
  return 0;
}

You should really make a habit of checking all returns and if you don't: be able to give a good reason why you didn't.

Don't forget to switch on all warnings your compiler offers. Even if you don't understand them now, Google might have an answer and if not some people here do (in that order, thank you).

Upvotes: 1

Related Questions