insert_node
=====================================================================
void insert_node(Node **start, int insert_after_value, int value)
{
Node *current = *start;
do {
if(insert_after_value == current->data) {
Node *new_node = (Node*)malloc(sizeof(Node));
new_node->data = value;
new_node->next = NULL;
if(current->next == *start) {
current->next = new_node;
new_node->next = *start;
break;
}
else {
new_node->next = current->next;
current->next = new_node;
break;
}
}
current = current->next;
}while(current != *start);
}
=====================================================================
add_node
=====================================================================
void add_node(Node **start, int value)
{
Node *new_node = (Node*)malloc(sizeof(Node));
new_node->data = value;
new_node->next = NULL;
if(*start == NULL) {
*start = new_node;
(*start)->next = *start;
return;
}
else {
Node *current;
current = *start;
while(current->next != *start) {
current = current->next;
}
current->next = new_node;
new_node->next = *start;
return;
}
}
=====================================================================
delete node
=====================================================================
void delete_node(Node **start, int value)
{
Node *current = *start;
Node *temp;
if(value == current->data) {
*start = current->next;
(*start)->prev = NULL;
free(current);
return;
}
while(current != NULL) {
if(current->next->data == value) {
temp = current->next;
current->next = current->next->next;
if(current->next != NULL)
current->next->prev = current;
free(temp);
return;
}
current = current->next;
}
}
=====================================================================
print
=====================================================================
void print_list(Node *node)
{
Node *first_node = node;
printf("%d ", node->data);
node = node->next;
while(node != NULL) {
if(node == first_node) break;
printf("%d ", node->data);
node = node->next;
}
printf("%d\n", node->data);
}
=====================================================================
free
=====================================================================
void free_list(Node *node)
{
int total_node = 1;
Node *first = node;
node = node->next;
while(node != first) {
node = node->next;
total_node++;
}
Node *current = first;
Node *temp;
int i;
for(i = 0; i < total_node; i++) {
temp = current;
current = current->next;
free(temp);
}
}
=====================================================================
inverse_print_list
=====================================================================
void inverse_print_list(Node *node)
{
printf("Inverse List:\n");
while(node != NULL) {
printf("%d ", node->data);
node = node->prev;
}
printf("\n");
}
=====================================================================
main
=====================================================================
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
struct node *prev;
}Node;
void add_node(Node **start, int value);
void print_list(Node *node);
void insert_node(Node **start, int insert_after_value, int value);
void delete_node(Node **start, int value);
void inverse_print_list(Node *node);
void free_list(Node *node);
int main(int argc, char* argv[])
{
// create first node "head"
Node *head = NULL;
add_node(&head, 5);
add_node(&head, 128);
add_node(&head, 41);
// insert non-exist node, linked list would not have changed
insert_node(&head, 77, 92);
// insert after node of data 128
insert_node(&head, 128, 84);
// insert after the last node
insert_node(&head, 41, 97);
// delete the first node
delete_node(&head, 5);
// delete the node of data 41
delete_node(&head, 41);
// delete the last node
delete_node(&head, 97);
print_list(head);
Node *last = head;
while(last->next != NULL) {
last = last->next;
}
inverse_print_list(last);
free_list(head);
return 0;
}
=====================================================================