Skip to main content

Section 27.10 Read a Number from Input

To finish our implementation of arbitrarily large integers using linked lists we’ll need a way for the user to enter such a number at run-time of the program.

Activity 27.7.

Here is a function which reads an arbitrarily long integer from the user input and stores it in a linked list of digits.

Compile and run the code below in your own C environment.

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

struct digit {
    int num;
    struct digit *next;
};

typedef struct digit digit_t;

digit_t *createDigit(int);
void append(digit_t * start, digit_t * newDigptr);
void printNumber(digit_t *start);
void freeNumber(digit_t *start);
digit_t *readNumber(void);

int main(void) {
    digit_t *start;
    
    printf("Please enter a number: ");
    start = readNumber();
    printf("You entered: ");
    
/* print the number */
    printNumber(start);
    
/* free all allocted space */
    freeNumber(start);
    
    return 0;
}

digit_t *createDigit(int dig) {
    digit_t *ptr;
    ptr = (digit_t *) malloc(sizeof(digit_t));
    ptr->num = dig;
    ptr->next = NULL;
    return(ptr);
}

void append(digit_t * start, digit_t * newDigptr) {
    digit_t *end = start;
    while(end->next != NULL) {
        end = end->next;
    }
    end->next = newDigptr;
}

void printNumber(digit_t *start) {
    digit_t * ptr = start;
    while (ptr!=NULL) {
        printf("%d", ptr->num);
        ptr = ptr->next;
    }
    printf("\n");
}

void freeNumber(digit_t *start) {
    struct digit * ptr = start;
    struct digit * tmp;
    while (ptr!=NULL) {
        tmp = ptr->next;
        free(ptr);
        ptr = tmp;
    }
}

digit_t *readNumber(void) {
    char c;
    int d;
    struct digit *start, *newptr;
    start = NULL;
    scanf("%c", &c);
    while (c != '\n') {
        d = c-48;
        newptr = createDigit(d);
        if (start == NULL) {
            start = newptr;
        } else {
            append(start, newptr);
        }
        scanf("%c", &c);
    }
    return(start);
}