added singly linked list in C
parent
bfcae851a0
commit
2dbfdedb97
|
@ -0,0 +1,268 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
//structure mimic the link node
|
||||
struct node{
|
||||
int data;
|
||||
struct node* next;
|
||||
};
|
||||
|
||||
typedef struct node Node;
|
||||
|
||||
Node *head = NULL;
|
||||
int count = 0;
|
||||
|
||||
void insertAtBegin(int x);
|
||||
void insertAtEnd(int x);
|
||||
void insertAtBefore(int x, int before);
|
||||
void insertAtAfter(int x, int after);
|
||||
int length();
|
||||
void display();
|
||||
void deleteAtBegin();
|
||||
void deleteAtEnd();
|
||||
void deleteAtAfter(int after);
|
||||
void deleteAtBefore(int before);
|
||||
void search(int key);
|
||||
|
||||
int main()
|
||||
{
|
||||
insertAtEnd(40);
|
||||
printf("The no of nodes in the list is %d\n", length());
|
||||
insertAtBegin(10);
|
||||
insertAtBegin(20);
|
||||
display();
|
||||
printf("The no of nodes in the list is %d\n", length());
|
||||
insertAtBegin(30);
|
||||
insertAtEnd(50);
|
||||
insertAtAfter(60, 10);
|
||||
insertAtBefore(70, 10);
|
||||
display();
|
||||
printf("The no of nodes in the list is %d\n", length());
|
||||
search(30);
|
||||
search(10);
|
||||
search(50);
|
||||
printf("The no of nodes in the list is %d\n", length());
|
||||
deleteAtBegin();
|
||||
display();
|
||||
deleteAtEnd();
|
||||
display();
|
||||
deleteAtAfter(60);
|
||||
display();
|
||||
deleteAtBefore(10);
|
||||
display();
|
||||
}
|
||||
|
||||
void display()
|
||||
{
|
||||
if (head == NULL)
|
||||
{
|
||||
printf("The linked list is empty\n");
|
||||
return;
|
||||
}
|
||||
Node *temp = head;
|
||||
while (temp != NULL)
|
||||
{
|
||||
printf("%d --> ", temp->data);
|
||||
temp = temp->next;
|
||||
}
|
||||
printf("NULL\n");
|
||||
}
|
||||
|
||||
int length()
|
||||
{
|
||||
if (head == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
Node *temp = head;
|
||||
int count = 0;
|
||||
while (temp != NULL)
|
||||
{
|
||||
count++;
|
||||
temp = temp->next;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
void insertAtBegin(int x)
|
||||
{
|
||||
Node *newNode = (Node *)malloc(sizeof(Node));
|
||||
if (newNode == NULL)
|
||||
{
|
||||
printf("OVERFLOW\n");
|
||||
return;
|
||||
}
|
||||
newNode->data = x;
|
||||
newNode->next = NULL;
|
||||
if (head == NULL)
|
||||
{
|
||||
head = newNode;
|
||||
}
|
||||
else
|
||||
{
|
||||
newNode->next = head;
|
||||
head = newNode;
|
||||
}
|
||||
}
|
||||
|
||||
void insertAtEnd(int x)
|
||||
{
|
||||
Node *newNode = (Node *)malloc(sizeof(Node));
|
||||
if (newNode == NULL)
|
||||
{
|
||||
printf("OVERFLOW\n");
|
||||
return;
|
||||
}
|
||||
newNode->data = x;
|
||||
newNode->next = NULL;
|
||||
//check if the list is empty and if it is then insert the node at the beginning
|
||||
if (head == NULL)
|
||||
{
|
||||
head = newNode;
|
||||
}
|
||||
else
|
||||
{
|
||||
Node *temp = head;
|
||||
while (temp->next != NULL)
|
||||
{
|
||||
temp = temp->next;
|
||||
}
|
||||
temp->next = newNode;
|
||||
}
|
||||
}
|
||||
|
||||
//assumes after value already exists in the list
|
||||
void insertAtAfter(int x, int after)
|
||||
{
|
||||
Node *newNode = (Node *)malloc(sizeof(Node));
|
||||
if (newNode == NULL)
|
||||
{
|
||||
printf("OVERFLOW\n");
|
||||
return;
|
||||
}
|
||||
newNode->data = x;
|
||||
newNode->next = NULL;
|
||||
|
||||
Node *temp = head;
|
||||
while (temp->data != after)
|
||||
{
|
||||
temp = temp->next;
|
||||
}
|
||||
newNode->next = temp->next;
|
||||
temp->next = newNode;
|
||||
}
|
||||
|
||||
//assumes before value already exist in the list
|
||||
void insertAtBefore(int x, int before)
|
||||
{
|
||||
Node *newNode = (Node *)malloc(sizeof(Node));
|
||||
if (newNode == NULL)
|
||||
{
|
||||
printf("OVERFLOW\n");
|
||||
return;
|
||||
}
|
||||
newNode->data = x;
|
||||
newNode->next = NULL;
|
||||
|
||||
Node *temp = head;
|
||||
while (temp->next->data != before)
|
||||
{
|
||||
temp = temp->next;
|
||||
}
|
||||
newNode->next = temp->next;
|
||||
temp->next = newNode;
|
||||
}
|
||||
|
||||
void deleteAtBegin()
|
||||
{
|
||||
if (head == NULL)
|
||||
{
|
||||
printf("UNDERFLOW\n");
|
||||
return;
|
||||
}
|
||||
Node *temp = head;
|
||||
printf("The value deleted is %d \n", temp->data);
|
||||
head = temp->next;
|
||||
temp->next = NULL;
|
||||
free(temp);
|
||||
}
|
||||
|
||||
void deleteAtEnd()
|
||||
{
|
||||
if (head == NULL)
|
||||
{
|
||||
printf("UNDERFLOW\n");
|
||||
return;
|
||||
}
|
||||
Node *temp = head, *p;
|
||||
while (temp->next->next != NULL)
|
||||
{
|
||||
temp = temp->next;
|
||||
}
|
||||
p = temp->next;
|
||||
printf("The value deleted is %d \n", p->data);
|
||||
temp->next = NULL;
|
||||
free(p);
|
||||
}
|
||||
|
||||
void deleteAtAfter(int after)
|
||||
{
|
||||
if (head == NULL)
|
||||
{
|
||||
printf("UNDERFLOW\n");
|
||||
return;
|
||||
}
|
||||
Node *temp = head, *p;
|
||||
while (temp->data != after)
|
||||
{
|
||||
temp = temp->next;
|
||||
}
|
||||
p = temp->next;
|
||||
printf("The value deleted is %d \n", p->data);
|
||||
temp->next = p->next;
|
||||
free(p);
|
||||
}
|
||||
|
||||
void deleteAtBefore(int before)
|
||||
{
|
||||
if (head == NULL)
|
||||
{
|
||||
printf("UNDERFLOW\n");
|
||||
return;
|
||||
}
|
||||
Node *temp = head, *p;
|
||||
while (temp->next->next->data != before)
|
||||
{
|
||||
temp = temp->next;
|
||||
}
|
||||
p = temp->next;
|
||||
printf("The value deleted is %d \n", p->data);
|
||||
temp->next = p->next;
|
||||
free(p);
|
||||
}
|
||||
|
||||
void search(int key)
|
||||
{
|
||||
if (head == NULL)
|
||||
{
|
||||
printf("UNDERFLOW\n");
|
||||
return;
|
||||
}
|
||||
int count = 1; // counting starts from 1
|
||||
Node *temp = head;
|
||||
while (temp->data != key)
|
||||
{
|
||||
temp = temp->next;
|
||||
count++;
|
||||
}
|
||||
if (count <= length())
|
||||
{
|
||||
printf("The node number %d has the value %d\n", count, key);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("The value %d is not found in the list\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue