Double Link List

Write a program to implement double link list.
Implement

  • Add node at the beginning of the linked list
  • Add node at the end of the linked list
  • Add node at the middle(sort it) of the linked list
  • Delete the Node at given position
  • Delete the Node from beginning
  • Delete the Node at from end
  • Delete all nodes
  • Print Nodes
  • Print Nodes in reverse
  • Count nodes of the linked list

Structure, header file and main function used is

#include<stdio.h>
#include<stdlib.h>
#define PR printf("1] Add 2] Print 3] Count 4] RPrint 5] Delete all 6] Delete_node 0] Exit\n");
typedef struct DoubleLinkList
{
	struct DoubleLinkList *prev;
	int num;
	struct DoubleLinkList *next;
}DLL;
int main()
{
	DLL *hp = 0;
	int op,n;
	PR
	scanf("%d",&op);
	while(op != 0)
	{
		switch(op)
		{
			case 1:
				printf("Enter Number = ");
				scanf("%d",&n);
				//add_begin(n,&hp);
				add_middle(n,&hp);
				//add_end(n,&hp);
				break;
			case 2:
				print(hp);
				break;
			case 3:
				printf("Count = %d\n",count(hp));
				break;
			case 4:
				reverse_print(hp);
				break;
			case 5:
				delete_all(&hp);
				break;
			case 6:
				printf("Enter Number = ");
				scanf("%d",&n);
				//delete_begin(&hp);
				//delete_end(&hp);
				delete_node(n,&hp);
				break;
			default:
				printf("Invalid Option\n");
		}
		PR
		scanf("%d",&op);
	}
	return 0;
}

Function definitions are given below.

//Add node at the beginning of the linked list
void add_begin(int n,DLL** p)
{
	DLL *p1;
	p1 = (DLL*)malloc(sizeof(DLL));
	p1->num = n;
	p1->prev = 0;
	p1->next = 0;
	if(*p == 0)
	{
		*p = p1;
	}
	else
	{
		p1->next = (*p);
		(*p)->prev = p1;
		*p = p1;
	}
}
//Add node at the middle(sort it) of the linked list
void add_middle(int n,DLL**p)
{
	DLL *p1,*p2;
	p1 = (DLL*)malloc(sizeof(DLL));
	p1->num = n;
	p1->prev = 0;
	p1->next = 0;
	if(*p == 0)
	{
		*p = p1;
	}
	else if(p1->num < (*p)-> num)
	{
		p1->next = *p;
		(*p)->prev = p1;
		*p = p1;
	}
	else
	{
		p2 = *p;
		while(p2)
		{
			if(p2->next == 0)
			{
				p1->prev = p2;
				p2->next = p1;
				break;
			}
			else if(p1->num < p2->next->num)
			{
				p1->next = p2->next;
				p1->prev = p2;
				//p2->next->prev = p1;
				p2->next = p1;
				break;
			}
			p2 = p2->next;
		}
	}
}
//Add node at the end of the linked list
void add_end(int n,DLL **p)
{
	DLL *p1,*p2;
	p1 = (DLL*)malloc(sizeof(DLL));
	p1->num = n;
	p1->prev = 0;
	p1->next = 0;
	if(*p == 0)
	{
		*p = p1;
	}
	else
	{
		p2 = *p;
		while(p2->next)
		p2 = p2->next;
		p2->next = p1;
		p1->prev = p2;
	}
}
//Delete the Node at given position
void delete_node(int n,DLL**p)
{
	DLL *p1,*p2;
	p1 = *p;
	int i;
	if(n < 1 || n > count(*p))
	{
		printf("Invalid POsition\n");
		return;
	}
	else if(*p == 0)
	{
		printf("Empty list\n\n");
		return;
	}
	if(n == 1)
	{
		p1 = *p;
		*p = (*p)->next;
		(*p)->prev = p1;
		free(p1);
		return;
	}
	p1 = p2 = *p;
	for(i = 1;i < n;i++)
	{
		p2 = p1;
		p1 = p1->next;
	}
	p2->next = p1->next;
	p1->next->prev = p2;
	free(p1);
}
//Delete the Node from beginning
void delete_begin(DLL**p)
{
	if(*p == 0)
	{
		printf("Empty list\n");
		return;
	}
	else if((*p)->next == 0)
	{
		free(*p);
		*p = 0;
		return;
	}
	DLL *p1;
	p1 = *p;
	*p = p1->next;
	(*p)->prev = NULL;
	free(p1);
}
//Delete the Node at from end
void delete_end(DLL**p)
{
	if(*p == 0)
	{
		printf("Empty List\n");
		return;
	}
	else if((*p)->next == 0)
	{
		free(*p);
		*p = 0;
		return;
	}
	DLL *p1,*p2;
	p1 = *p;
	p2 = *p;
	while(p1->next)
	{
		p2 = p1;
		p1 = p1->next;
	}
	p2->next = 0;
	free(p1);
}
//Delete all nodes
void delete_all(DLL **p)
{
	DLL *p1;
	p1 = *p;
	while(p1)
	{
		*p = p1->next;
		free(p1);
		p1 = *p;
	}
}
//Print Nodes
void print(DLL*p)
{
	while(p)
	{
		printf("%d ",p->num);
		p = p->next;
	}
	printf("\n");
}
//Print Nodes in reverse
void reverse_print(DLL*p)
{
	while(p->next)
	p = p->next;
	while(p)
	{
		printf("%d ",p->num);
		p = p->prev;
	}
	printf("\n");
}
//Count nodes of the linked list
int count(DLL*p)
{
	unsigned int c = 0;
	while(p)
	{
		c++;
		p = p->next;
	}
	return c;
}