-
Notifications
You must be signed in to change notification settings - Fork 212
/
Doubly_linked_list.cpp
128 lines (100 loc) · 2.85 KB
/
Doubly_linked_list.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
using namespace std;
// A doubly linked list node
struct Node {
int data;
struct Node* next;
struct Node* prev;
};
//inserts node at the front of the list
void insert_front(struct Node** head, int new_data)
{
//allocate memory for New node
struct Node* newNode = new Node;
//assign data to new node
newNode->data = new_data;
//new node is head and previous is null, since we are adding at the front
newNode->next = (*head);
newNode->prev = NULL;
//previous of head is new node
if ((*head) != NULL)
(*head)->prev = newNode;
//head points to new node
(*head) = newNode;
}
/* Given a node as prev_node, insert a new node after the given node */
void insert_After(struct Node* prev_node, int new_data)
{
//check if prev node is null
if (prev_node == NULL) {
cout<<"Previous node is required , it cannot be NULL";
return;
}
//allocate memory for new node
struct Node* newNode = new Node;
//assign data to new node
newNode->data = new_data;
//set next of newnode to next of prev node
newNode->next = prev_node->next;
//set next of prev node to newnode
prev_node->next = newNode;
//now set prev of newnode to prev node
newNode->prev = prev_node;
//set prev of new node's next to newnode
if (newNode->next != NULL)
newNode->next->prev = newNode;
}
//insert a new node at the end of the list
void insert_end(struct Node** head, int new_data)
{
//allocate memory for node
struct Node* newNode = new Node;
struct Node* last = *head; //set last node value to head
//set data for new node
newNode->data = new_data;
//new node is the last node , so set next of new node to null
newNode->next = NULL;
//check if list is empty, if yes make new node the head of list
if (*head == NULL) {
newNode->prev = NULL;
*head = newNode;
return;
}
//otherwise traverse the list to go to last node
while (last->next != NULL)
last = last->next;
//set next of last to new node
last->next = newNode;
//set last to prev of new node
newNode->prev = last;
return;
}
// This function prints contents of linked list starting from the given node
void displayList(struct Node* node) {
struct Node* last;
while (node != NULL) {
cout<<node->data<<"<==>";
last = node;
node = node->next;
}
if(node == NULL)
cout<<"NULL";
}
//main program
int main() {
/* Start with the empty list */
struct Node* head = NULL;
// Insert 40 as last node
insert_end(&head, 40);
// insert 20 at the head
insert_front(&head, 20);
// Insert 10 at the beginning.
insert_front(&head, 10);
// Insert 50 at the end.
insert_end(&head, 50);
// Insert 30, after 20.
insert_After(head->next, 30);
cout<<"Doubly linked list is as follows: "<<endl;
displayList(head);
return 0;
}