1. Limited time only! Sign up for a free 30min personal tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Storing a number as digits in a linked list

  1. Oct 7, 2016 #1
    1. The problem statement, all variables and given/known data
    Create a class named digit, which stores a node holding a digit. Include appropriate data

    members and member functions to do the following: (a) Read a long number (datatype is double)

    from user and store each digit of the long number as a node value. For example, if the input number

    is 8475483 then list is 8->4->7->5->4->8->3. (b) Delete alternate digits, get back the number and

    display. For example for the list in (a) the result of delete alternate digits is 8->7->4->3 and

    display.

    2. Relevant equations
    NA

    3. The attempt at a solution
    I am not able to extract digits as % is not valid for double datatype. Otherwise the program runs fine when I change the datatype to int and value is in range of int.
    Code (C):

    #include<iostream.h>
    #include<conio.h>

    class Digit{
        int data;
        Digit*next,*head;
        public:
        Digit()
        {
        head=NULL;
        }
        void read();
        void delAlt();
        void display();
          };

        void Digit::read(){
        Digit*node=new Digit;
        int num;
        cout<<"Enter number:" ;
        cin>>num;
        node->data=num%10;
        node->next=NULL;
        head=node;
        num=num/10;
        while(num>0){
        node=new Digit;
        node->data=num%10;
        node->next=head;
        head=node;
        num=num/10;}}

        void Digit:: delAlt(){
        Digit*temp,*temp1;
        temp1=head;
        while(temp1!=NULL){
        temp=temp1->next;
        temp1->next=temp->next;
        delete temp;
        temp1=temp1->next;}}

        void Digit::display(){
        Digit*temp=head;
        while(temp!=NULL){
        cout<<temp->data;
        temp=temp->next;}}

        void main(){
        clrscr();
        Digit d;
        d.read();
        d.delAlt();
        d.display();
        getch();
             }
     
     
  2. jcsd
  3. Oct 7, 2016 #2

    rcgldr

    User Avatar
    Homework Helper

    You should be able to use fmod() for doubles. Include < math.h > . Are you supposed to handle numbers with fractional components such as 123.456 or negative numbers?
     
  4. Oct 7, 2016 #3
    I used fmod() but then the output is not coming as required.
    Output is like this
    000000000
    000000874 something like that.
     
  5. Oct 7, 2016 #4

    rcgldr

    User Avatar
    Homework Helper

    After using fmod(), convert the remainder to an integer.
     
  6. Oct 7, 2016 #5
    I modified the code to,
    double num;
    and node->data=(int) fmod(num, 10) ;
    but the output is leading with 0. the end digits are fine in this output:
    00000000
    000008743
     
  7. Oct 7, 2016 #6

    rcgldr

    User Avatar
    Homework Helper

    Why is the code calling d.delAlt() before doing d.display()?
     
  8. Oct 7, 2016 #7
    Because it is not asked in question to display before deleting alternate nodes.
    If I input number as 8475483, and display before delAlt and also after delAlt, then output is like this
    0000000000
    0000000000
    0084754830
    0000000000
    0087430000
     
  9. Oct 7, 2016 #8

    rcgldr

    User Avatar
    Homework Helper

    Follow up, while (num > 0) isn't going to work for doubles, as you'll have a fraction part after each divide. The following should work to fix this (assuming user enters integer type numbers), you'll need to make this change in two places:

    Code (Text):

            // ...
            num -= node->data;   // subtract the low order digit from num
            num /= 10.;          // divide num by 10.
     
    Also delAlt() has a problem if an odd number of digits is entered.
     
    Last edited: Oct 7, 2016
  10. Oct 7, 2016 #9
    Thanks it is working fine now. delAlt() is working fine for me even when there are odd number of digits.
    For eg:
    input number: 8475483 (odd number of digits)
    Output: 8475483 (number as seperate digits in link list)
    8743 ( deleting alternate nodes)
     
  11. Oct 7, 2016 #10

    rcgldr

    User Avatar
    Homework Helper

    Here is an alternate way of doing the divide part:

    Code (Text):

        num = floor(num/10.);
     
    delAlt() may be working for odd number of digits, but I'm getting an invalid memory access. I added a check to avoid looking for NULL->next:

    Code (Text):

    void Digit::delAlt(){
        Digit*temp,*temp1;
        temp1=head;
        while(temp1 != NULL){
            temp=temp1->next;
            if(temp == NULL){
                break;}
            temp1->next=temp->next;
            delete temp;
            temp1=temp1->next;}
    }
     
     
    Last edited: Oct 7, 2016
  12. Oct 7, 2016 #11
    Thanks, I understand the floor function aka greatest integer function.
    In Turbo c++ it was not giving a warning or error. I think it takes NULL->next as NULL in turbo c++
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted



Similar Discussions: Storing a number as digits in a linked list
Loading...