#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node* link;
};
struct node* add_node(struct node* head , int val)
{
struct node* newnode =(struct node *) malloc(sizeof(struct node));
newnode->data = val;
newnode->link = NULL;
newnode->link = head;
head=newnode;
return head;
}
struct node* createll(struct node* head, int n)
{
while (n!=0)
{
head = add_node(head,n%10);
n=n/10;
}
return head;
}
struct node* reversell(struct node *head)
{
struct node *p,*q,*r;
p=head->link;
q=head;
r=NULL;
while(p!=NULL)
{
q->link=r;
r=q;
q=p;
p=p->link;
}
q->link = r;
head=q;
return head;
}
struct node * push (struct node* head , int val)
{
struct node* newp=malloc(sizeof(struct node));
newp->data=val;
newp->link=head;
head=newp;
return head;
}
struct node* add(struct node* head1 , struct node* head2)
{
if (head1->data == 0)
return head2;
if (head2->data=0)
return head1;
struct node* ptr1=head1;
struct node* ptr2=head2;
struct node* head = NULL;
int carry=0 , sum=0;
struct node* head3 = NULL;
while (ptr1||ptr2)
{
sum = 0 ;
if(ptr1)
sum += ptr1->data;
if (ptr2)
sum += ptr2->data;
sum += carry;
carry = sum/10;
sum = sum%10;
head3 = push (head3 , sum);
if(ptr1)
ptr1=ptr1->link;
if(ptr2)
ptr2=ptr2->link;
if (carry && ptr1!=NULL && !ptr2)
head3 = push (head3 , carry);
}
return head3;
}
void print(struct node * head)
{
while(head!=NULL)
{
printf("%d ",head->data);
head=head->link;
}
}
int main ()
{
int a,b;
printf("enter two number");
scanf("%d %d" , &a,&b );
struct node * head1=NULL;
head1=createll(head1,a);
print(head1);
struct node * head2=NULL;
head2=createll(head2,b);
print(head2);
head1 = reversell(head1);
head2 = reversell(head2);
printf("\nreversed linked list\n");
print(head1);
printf("\n");
print(head2);
struct node* head3 = NULL;
head3 = add(head1 , head2);
printf("\nSum :");
print(head3);
return 0 ;
}