doubly linked list program in c

This C Program actualize a doubly linked list and give addition, cancellation and show operations.

Doubly linked list is a connected information structure that comprises of an arrangement of consecutively connected records called nodes.

 

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<dos.h>
typedef struct
{
	int id;
	char name[36];
	int sal;
}EMP; // just alisa name
EMP getdata()
{
	EMP te;
	printf("\nENTER ID:");
	scanf("%d",&te.id);
	printf("Enter Name:");
	fflush(stdin);
	gets(te.name);
	printf("Enter Salary: ");
	scanf("%D", &te.sal);
	return te;
}
EMP updatedata()
{
	EMP te;
	printf("\n Enter new Id:");
	scanf("%d",&te.id);
	printf("Enter new Name: ");
	fflush(stdin);
	gets(te.name);
	printf("Enter New Salary");
	scanf("%d", &te.sal);
	return te;
}
void showdata(EMP te)
{
	printf("\n Id:%d Name:%5s SAL:%3d",
	te.id,te.name,te.sal);
}
struct dlink
{
	struct dlink*prev;
	EMP data;
	struct  dlink*next;
};
typedef struct dlink LINK; // just alisa name
LINK*head=NULL; // global pointer
void addnode()
{
	char ch;
	LINK*th1,*th2;
	if(head==NULL)
	{
		head=(LINK*)malloc(sizeof(LINK));
		head->prev=NULL;
		head->data=getdata();
		head->next=NULL;
		printf("\n DO You want to continue Y ?:");
		fflush(stdin);
		ch=getch();
		if(ch!='Y'&&ch!='y')
			return;
	}
	th1=head;
	while(th1->next!=NULL)
		th1=th1->next;
	do
	{
		th2=(LINK*)malloc(sizeof(LINK));
		th2->prev=th1;
		th2->data=getdata();
		th2->next=NULL;
		th2->next=th2;
		th1=th2;
		printf("\n Do You want to continue Y?:");
		fflush(stdin);
		ch=getchar();
	}while(ch= = 'Y' || ch = = 'y');
	th1=th2=NULL;
	return;
}
void displaynode()
{
	LINK*th;
	if(head = = NULL)
	{
		printf("LIST IS EMPTY \n");
		system("PAUSE");
		return;
	}
	th=head;
	do
	{
		showdata(th->data);
		th=th->next;
	}while(th!=NULL);
	printf("\n");
	system("PAUSE");
	return;
}
int nodecount()
{
	int count =0;
	LINK*th;
	if(head == NULL)
		return count; // default value is 0;
	th=head;
	do
	{
		++count;
		th=th->next;
	}while(th!= NULL);
	return count;
}
void insertnode()
{
	LINK*th1,*th2;
	int i,lp,nl;
	if(head = = NULL)
	{
		printf("LIST IS  EMPTY \n");
		system("PAUSE");
		return;
	}
	printf("\n Enter Link position: ");
	scanf("%d", &lp);
	nl = nodecound();
	if(lp<1||lp>nl)
	{
		printf("invalid link position \n");
		system("PAUSE");
		return;
	}
	if(lp = = 1)
	{
		th1=(LINK*)malloc(sizeof(LINK));
		th1->prev=NULL;
		th1->data = getdata();
		th1->next = head;
		head->prev=th1;
		head=th1;
		return;
	}
	th1=head;
	for(i = 1; i<lp-1; i++)
		th1 =th1 ->next;
	th2=(LINK*)malloc(sizeof(LINK));
	th2->prev =th1;
	th2->data = getdata();
	th2->next=th1->next;
	th1->next=th2;
	if(nl!=lp)
		th2->next->prev=th2;
	th1=th2=NULL;
	return;
}
void deletenode()
{
	LINK*th1,*th2;
	int i, lp,nl;
	if(head = = NULL)
	{
		printf("LIST IS EMPTY \n");
		system("PAUSE");
		return;
	}
	printf("\n Enter LINK position:");
	scanf("%d",&lp);
	nl=nodecount();
	if(lp<1||lp>nl)
	{
		printf("invalid link position \n");
		system("PAUSE");
		return;
	}
	if(nl==1)
	{
		free(head);
		head=NULL;
		printf("node id deleted \n");
		system("PAUSE");
		return;
	}
	if(lp= = 1)
	{
		th1=head;
		head =head->next;
		head->prev =NULL;
		th1->next =NULL;
		free(th1);
		th1=NULL;
		return;
	}
	th1 = head;
	for(i =1; i<lp-1; i++)
		th1=th1->next;
	th2=th1->next;
	th1->next=th2->next;
	if(nl!=lp)//if not tail node only required.
	th2->next->prev=th1; //th2->next->prev=th2->prev;
	th2->prev=NULL;
	th2->next=NULL;
	free(th2);
	th1=th2 =NULL;
	return;
}
void updatenode()
{
	LINK*th1;
	int nl,lp,i;
	if(head = = NULL)
	{
		printf("LIST IS EMPTY \n");
		system("PAUSE");
		return;
	}
	printf("Enter link position: ");
	scanf("%d",&lp);
	nl=nodecount();
	if(lp<1||lp>nl)
	{
		printf("invalid node position: ");
		system("PAUSE");
		return;
	}
	if(lp = = 1)
	{
		haed->data=updatedata();
		printf(" Node is updated \n");
		system("PAUSE");
		return;
	}
	th1=head;
	for(i=1;i<lp; i++)
		th1=th1->next;
	th1->data=updatedata();
	printf("node is updateed \n");
	system("PAUSE");
	return;
}
void reversenode()
{
	LINK*temp=NULL;
	LINK*current=head;
	int nl;
	if(head==NULL)
	{
		printf("LIST IS EMPTY \n");
		system("PAUSE");
		return;
	}
	nl=nodecound();
	if(nl = =1)
	{
		printf(" We can't do reverse \n");
		system("PAUSE");
		return;
	}
	while(current!=NULL)
	{
		temp=current->prev;
		current->prev=current->next;
		current->next=temp;
		current=current->prev;
	}
	head=temp->prev;
	return;
}
int main()
{
	int option;
	while(1)
	{
		system("CLS");
		printf("\n n1 FOR ADD NODE:");
		printf("\n n2 FOR ADD NODE:");
		printf("\n n3 FOR ADD NODE:");
		printf("\n n4 FOR ADD NODE:");
		printf("\n n5 FOR ADD NODE:");
		printf("\n n6 FOR ADD NODE:");
		printf("\n n7 FOR ADD NODE:");
		printf("\n n8 FOR EXIT: ");
		scanf("%d", &option);
		switch(option)
		{
			case 1: addnode();
			break;
			case 2: displaynode();
			break;
			case 3:
			printf("NODE: %d\n", nodecount());
			system("PAUSE");
			break;
			case 4: insertnode();
			break;
			case 5: deletenode();
			break;
			case 6: updatenode();
			break;
			case 7: reversenode();
			break;
			case 8: free(head);
			return EXIT_SUCCESS;
			default: printf(" invalid option");
			system("PAUSE");
			break;
		}
	}
}
Scroll Up