#include <stdio.h>
#include <stdlib.h>
// Node structure for doubly linked list
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
// Create a new node with given data
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
// Append node at the end
void append(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
return;
}
Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
}
// Delete first node with given value
void deleteByValue(Node** head, int value) {
Node* curr = *head;
while (curr != NULL && curr->data != value) {
curr = curr->next; // advance curr to next node
}
if (curr == NULL) {
return; // value not found, nothing to delete
}
if (curr->prev != NULL) {
curr->prev->next = curr->next; // link previous node to next
} else {
*head = curr->next; // deleting head node
}
if (curr->next != NULL) {
curr->next->prev = curr->prev; // link next node to previous
}
free(curr); // free memory of deleted node
}
// Print list forward
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d", temp->data);
if (temp->next != NULL) {
printf(" ↔ ");
}
temp = temp->next;
}
printf("\n");
}
int main() {
Node* head = NULL;
append(&head, 1);
append(&head, 2);
append(&head, 3);
append(&head, 4);
printf("Original list:\n");
printList(head);
deleteByValue(&head, 3);
printf("List after deleting value 3:\n");
printList(head);
return 0;
}
while (curr != NULL && curr->data != value) {
curr = curr->next; // advance curr to next node
}
search for node with target value
if (curr == NULL) {
return; // value not found, nothing to delete
}
stop if value not found
if (curr->prev != NULL) {
curr->prev->next = curr->next; // link previous node to next
} else {
*head = curr->next; // deleting head node
}
unlink node from previous or update head if first node
if (curr->next != NULL) {
curr->next->prev = curr->prev; // link next node to previous
}
unlink node from next
free(curr); // free memory of deleted node
release memory of removed node
Original list:
1 ↔ 2 ↔ 3 ↔ 4
List after deleting value 3:
1 ↔ 2 ↔ 4