Site icon Study Algorithms

Copy an entire Linked List.

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;
}
Exit mobile version