Two unsorted linked lists are given.
Find the union.
List1:: 2->3->4->2->3->3->55
List2:: 1->3->55->100
Result:
2->3->4->55->1->100
The elements in the result can be in any order
List1 can be enmpty or
List2 can be empty or
List1 and List2 both can be empty
#include<stdio.h>
#include<stdlib.h>
#define FALSE 0
#define TRUE 1
#define MAX_HASH 20
#define DUMMY_VAL -100
typedef struct node_tag
{
int data;
struct node_tag *next;
}node_type;
enum
{
SUCCESS=2,
FULL,
DUPLICATE
};
int hash_table[MAX_HASH];
void print_link_list(node_type *root);
node_type *create_link_list(int n);
void initialize_hash_table(void);
int hash_function(int key);
int insert_key_in_hash_table(int key);
void print_hash_table(void);
node_type *union_of_two_unsorted_link_list(node_type *head1 , node_type *head2);
void main()
{
int n;
node_type *head1 , *head2;
node_type *head3;
printf("Give the number of node in head1\n");
scanf("%d",&n);
head1=create_link_list(n);
print_link_list(head1);
printf("Give the number of node in head2\n");
scanf("%d",&n);
head2=create_link_list(n);
print_link_list(head2);
initialize_hash_table();
head3=union_of_two_unsorted_link_list(head1 , head2);
printf("The list After hashing\n");
print_link_list(head3);
}
node_type *union_of_two_unsorted_link_list(node_type *head1 , node_type *head2)
{
node_type *temp;
node_type *node_to_be_deleted;
node_type *head;
int ret_val=SUCCESS;
if(head1)
{
head=head1;
temp=head1;
}
else
{
head=head2;
temp=head2;
}
if(temp)
{
insert_key_in_hash_table(temp->data);
while(temp->next)
{
ret_val=insert_key_in_hash_table(temp->next->data);
if(ret_val==DUPLICATE)
{
node_to_be_deleted=temp->next;
temp->next=node_to_be_deleted->next;
free(node_to_be_deleted);
}
else
{
temp=temp->next;
}
}
if(head !=head2)
{
temp->next=head2;
while(temp->next)
{
ret_val=insert_key_in_hash_table(temp->next->data);
if(ret_val==DUPLICATE)
{
node_to_be_deleted=temp->next;
temp->next=node_to_be_deleted->next;
free(node_to_be_deleted);
}
else
{
temp=temp->next;
}
}
}
}
return head;
}
void initialize_hash_table(void)
{
int i;
for(i=0;i<MAX_HASH ; i++)
{
hash_table[i]=DUMMY_VAL;
}
}
int hash_function(int key)
{
int index;
index=key%MAX_HASH;
return index;
}
int insert_key_in_hash_table(int key)
{
int index;
int old_index;
int dup=FALSE;
int ret_val=SUCCESS;
index=hash_function(key);
old_index = index;
if(hash_table[index]==key)
{
dup=TRUE;
}
else if(hash_table[index]!=DUMMY_VAL)
{
index=(old_index+1)%MAX_HASH;
}
while(hash_table[index]!=DUMMY_VAL && index!=old_index && dup == FALSE)
{
if(hash_table[index]==key)
{
dup = TRUE;
}
index = (index+1) % MAX_HASH;
}
if(hash_table[index]==DUMMY_VAL)
{
ret_val = SUCCESS;
hash_table[index]=key;
}
else if(dup==TRUE)
{
ret_val=DUPLICATE;
}
else
{
ret_val = FULL;
}
return ret_val;
}
void print_link_list(node_type *root)
{
node_type *temp;
for(temp=root;root && temp->next;temp=temp->next)
{
printf("%d-->",temp->data);
}
if(temp)
{
printf("%d\n",temp->data);
}
}
node_type *create_link_list(int n)
{
int i,a[400];
node_type *head,*temp,*root;
head = NULL;
root=NULL;
printf("Give the link list elements\n");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
temp=(node_type *)malloc(sizeof(node_type));
temp->data=a[i];
temp->next=NULL;
if(i==0)
{
root=temp;
head=temp;
}
else
{
head->next=temp;
head=head->next;
}
}
return root;
}