# Storing a number as digits in a linked list

1. Oct 7, 2016

### Raghav Gupta

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;
public:
Digit()
{
}
void delAlt();
void display();
};

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

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

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

void main(){
clrscr();
Digit d;
d.delAlt();
d.display();
getch();
}

2. Oct 7, 2016

### rcgldr

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?

3. Oct 7, 2016

### Raghav Gupta

I used fmod() but then the output is not coming as required.
Output is like this
000000000
000000874 something like that.

4. Oct 7, 2016

### rcgldr

After using fmod(), convert the remainder to an integer.

5. Oct 7, 2016

### Raghav Gupta

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

6. Oct 7, 2016

### rcgldr

Why is the code calling d.delAlt() before doing d.display()?

7. Oct 7, 2016

### Raghav Gupta

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

8. Oct 7, 2016

### rcgldr

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
9. Oct 7, 2016

### Raghav Gupta

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)

10. Oct 7, 2016

### rcgldr

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;
while(temp1 != NULL){
temp=temp1->next;
if(temp == NULL){
break;}
temp1->next=temp->next;
delete temp;
temp1=temp1->next;}
}

Last edited: Oct 7, 2016
11. Oct 7, 2016

### Raghav Gupta

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++