Skip to content

Instantly share code, notes, and snippets.

@murikadan
Last active December 16, 2015 10:09
Show Gist options
  • Save murikadan/5418464 to your computer and use it in GitHub Desktop.
Save murikadan/5418464 to your computer and use it in GitHub Desktop.
Program to add numbers of any lenghth using linked lists
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10001
struct node
{
unsigned short int val;
node* next;
};
struct result
{
node* sum;
int carry;
};
void make_list(char[],char[],node*&,node*&);
void free_list(result*&);
void free_list(node*&);
result* add_list(node*&,node*&);
void insert(node*&,int);
int main()
{
FILE *fp;
char n1[SIZE],n2[SIZE];
node *node1=NULL,*node2=NULL,*temp=NULL;
fp=fopen("input","r");
fscanf(fp,"%s %s",n1,n2);
make_list(n1,n2,node1,node2);
result* answer=add_list(node1,node2);
if(answer!=NULL)
{
if(answer->carry)
insert(answer->sum,answer->carry);
for(temp=answer->sum;temp!=NULL;temp=temp->next)
printf("%d",temp->val);
printf("\n");
}
temp=NULL;
free_list(node1);
free_list(node2);
free_list(answer);
return 0;
}
void make_list(char a[],char b[],node *&node_a,node *&node_b)
{
int l1=strlen(a);
int l2=strlen(b);
int i;
for(i=l1-1;i>=0;i--)
insert(node_a,(int)a[i]-(int)'0');
for(i=l2-1;i>=0;i--)
insert(node_b,(int)b[i]-(int)'0');
if(l1>l2)
for(i=0;i<l1-l2;i++)
insert(node_b,0);
else
for(i=0;i<l2-l1;i++)
insert(node_a,0);
}
void insert(node*&node1,int key)
{
node *newnode=(node*)malloc(sizeof(struct node));
newnode->val=key;
newnode->next=NULL;
if(node1!=NULL)
newnode->next=node1;
node1=newnode;
}
result* add_list(node*& node1,node*& node2)
{
int sum=0;
if(node1==NULL&&node2==NULL)
{
result *ans=(result*)malloc(sizeof(result));
ans->sum=NULL;
ans->carry=0;
return ans;
}
result *ans=add_list(node1->next,node2->next);
if(node1!=NULL)
sum+=node1->val;
if(node2!=NULL)
sum+=node2->val;
sum+=ans->carry;
insert(ans->sum,sum%10);
ans->carry=sum/10;
return ans;
}
void free_list(result*& n)
{
if(n!=NULL)
{
node* temp=n->sum;
if(temp!=NULL)
{
node* save=temp->next;
free(temp);
temp=save;
}
free(n);
}
n=NULL;
}
void free_list(node*& temp)
{
if(temp!=NULL)
{
node* save=temp->next;
free(temp);
temp=save;
}
temp=NULL;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment