Copying an entire Linked List, means allocating new memory and copying all the data to the new location.
This requires traversing each node and copying its data to a new location, keeping the original data intact.
#include<stdio.h>
struct node
{
int data;
struct node * next;
};
// implementing a function to copy a Linked List
struct node * copyList(struct node * head)
{
// creating a new variable as a list
struct node * list2 = (struct node *)malloc(sizeof(struct node));
//creating a temporary variable to traverse the new list
struct node * temp = list2;
while(head)
{
// assigning value
temp -> data = head -> data;
// move to the next node
head = head -> next;
// if the next node exists
// we need to create a new memory space
if(head)
{
struct node * temp2 = (struct node *)malloc(sizeof(struct node));
//point the next of the temp to this new location
temp -> next = temp2;
// move to the new location
temp = temp -> next;
}
else
{
// since there is no next node
// means end of the list
temp -> next = NULL;
}
}
//returning the pointer of the new list
return list2;
}
struct node * addElement(struct node *head, int number)
{
struct node * temp = (struct node*)malloc(sizeof(struct node));
temp -> data = number;
temp -> next = NULL;
struct node * temp2 = head;
while(temp2 -> next != NULL)
temp2 = temp2 -> next;
temp2 -> next = temp;
return head;
}
// a function to print the list
void printer(struct node * head)
{
while(head)
{
printf("%d ",head -> data);
head = head -> next;
}
}
int main(void)
{
//creating a list
struct node * listHead = (struct node*)malloc(sizeof(struct node));
listHead->data = 1;
listHead->next = NULL;
listHead = addElement(listHead, 2);
listHead = addElement(listHead, 3);
listHead = addElement(listHead, 4);
printer(listHead);
struct node * copy_of_list = copyList(listHead);
// print the new list
printf("\n");
printer(copy_of_list);
return 0;
}