-
Star
(229)
You must be signed in to star a gist -
Fork
(60)
You must be signed in to fork a gist
-
-
Save mycodeschool/7429492 to your computer and use it in GitHub Desktop.
| /* Doubly Linked List implementation */ | |
| #include<stdio.h> | |
| #include<stdlib.h> | |
| struct Node { | |
| int data; | |
| struct Node* next; | |
| struct Node* prev; | |
| }; | |
| struct Node* head; // global variable - pointer to head node. | |
| //Creates a new Node and returns pointer to it. | |
| struct Node* GetNewNode(int x) { | |
| struct Node* newNode | |
| = (struct Node*)malloc(sizeof(struct Node)); | |
| newNode->data = x; | |
| newNode->prev = NULL; | |
| newNode->next = NULL; | |
| return newNode; | |
| } | |
| //Inserts a Node at head of doubly linked list | |
| void InsertAtHead(int x) { | |
| struct Node* newNode = GetNewNode(x); | |
| if(head == NULL) { | |
| head = newNode; | |
| return; | |
| } | |
| head->prev = newNode; | |
| newNode->next = head; | |
| head = newNode; | |
| } | |
| //Inserts a Node at tail of Doubly linked list | |
| void InsertAtTail(int x) { | |
| struct Node* temp = head; | |
| struct Node* newNode = GetNewNode(x); | |
| if(head == NULL) { | |
| head = newNode; | |
| return; | |
| } | |
| while(temp->next != NULL) temp = temp->next; // Go To last Node | |
| temp->next = newNode; | |
| newNode->prev = temp; | |
| } | |
| //Prints all the elements in linked list in forward traversal order | |
| void Print() { | |
| struct Node* temp = head; | |
| printf("Forward: "); | |
| while(temp != NULL) { | |
| printf("%d ",temp->data); | |
| temp = temp->next; | |
| } | |
| printf("\n"); | |
| } | |
| //Prints all elements in linked list in reverse traversal order. | |
| void ReversePrint() { | |
| struct Node* temp = head; | |
| if(temp == NULL) return; // empty list, exit | |
| // Going to last Node | |
| while(temp->next != NULL) { | |
| temp = temp->next; | |
| } | |
| // Traversing backward using prev pointer | |
| printf("Reverse: "); | |
| while(temp != NULL) { | |
| printf("%d ",temp->data); | |
| temp = temp->prev; | |
| } | |
| printf("\n"); | |
| } | |
| int main() { | |
| /*Driver code to test the implementation*/ | |
| head = NULL; // empty list. set head as NULL. | |
| // Calling an Insert and printing list both in forward as well as reverse direction. | |
| InsertAtTail(2); Print(); ReversePrint(); | |
| InsertAtTail(4); Print(); ReversePrint(); | |
| InsertAtHead(6); Print(); ReversePrint(); | |
| InsertAtTail(8); Print(); ReversePrint(); | |
| } |
thank you very much! understand easily!
Quick question, when inserting at the tail why not use head->prev instead of iteration. Doubly linked makes tail insertion much faster this way right? Or have I made a wrong assumption?
because head->prev will always point to NULL
This code is clear and understandable, thanks for the code. Its helping me to learn more clearly.
thanks with all my heart
i have added delete function too.. if anyone wants it hop onto my repository... I have posted link to the file here double linked list
Thank you so much for this implementation.
You are my hero in this field.
thanks a lot
good luck
thanks,my teacher
Anyone knows about how to reverse the doubly linked list?
My code:
struct List* Reverse_Recursion(List* head)
{
if (head == nullptr || head->next == nullptr)
return head;
List* newHead = Reverse_Recursion(head->next);
head->next->next = head;
head->prev = head->next;
head->next = nullptr;
return newHead;
}
didn't work at all!!
Yes, you are right. I thought constant time complexity is part of requirements for a doubly linked list. Sorry for the confusion.