二重リンクリストに対する操作
二重リンクリストに対して前方または後方からノードを追加したり、指定された数字を元でノードを削除したりするコードは下記となります。
doublylist.c
# include <stdio.h>
# include <stdlib.h>
//node declaration
struct dnode{
struct dnode *prev;
int data;
struct dnode *next;
};
//function declaration
void d_append(struct dnode **, int);
void d_display(struct dnode *);
int d_count(struct dnode *);
void d_addatbeg(struct dnode **, int);
void d_addafter(struct dnode *, int, int);
void d_delete(struct dnode **, int);
void r_display(struct dnode *);
void main(){
//declare pointer to point to the front of doubly linked list
struct dnode *p;
//set pointer to point to empty doubly linked list
p = NULL;
//append node to doubly linked list
d_append(&p,11);
d_append(&p,21);
//show nodes in doubly linked list
d_display(p);
printf("No. of elements in the DLL = %d\n",d_count(p));
//add node at beginning of doubly linked list
d_addatbeg(&p, 33);
d_addatbeg(&p, 55);
//show nodes in doubly linked list
d_display(p);
printf("No. of elements in the DLL = %d\n",d_count(p));
//add node after the specified number of nodes
d_addafter(p,1,4000);
d_addafter(p,2,9000);
//show nodes in doubly linked list
d_display(p);
printf("No. of elements in the DLL = %d\n",d_count(p));
//delete node in doubly linked list
d_delete(&p,51);
d_delete(&p,21);
//show nodes in doubly linked list
d_display(p);
printf("No. of elements in the DLL = %d\n",d_count(p));
}
//append node to doubly linked list
void d_append(struct dnode **q, int num){
struct dnode *r, *temp;
//create new node
r = malloc(sizeof(struct dnode));
//set value of new node
r->data = num;
//set next link of new node to null
r->next = NULL;
//if doubly linked list is empty
if(*q == NULL){
//set prev link of new node to null
r->prev = NULL;
//set p pointer to the new node
*q = r;
}else{ //if doubly linked list is not empty
//set locator pointor to the front of doubly linked list
temp = *q;
//loop through doubly linked list to the last node
while(temp->next!=NULL){
temp = temp->next;
}
//set prev link of new node to last node of doubly linked list
r->prev = temp;
//set link of last node to point to new node
temp->next = r;
}
}
//add node to the beginning of doubly linked list
void d_addatbeg(struct dnode **q, int num){
struct dnode *r;
//create new node
r = malloc(sizeof(struct dnode));
//set data of new node
r->data = num;
//set previous link to NULL
r->prev = NULL;
//set next link to the front node
r->next = *q;
//if doubly linked list is not empty
if(*q != NULL){
//set prev link of current front node to new node
(*q)->prev = r;
}
//set p pointer to point to the new node
*q = r;
}
//add node after the specified number of nodes
void d_addafter(struct dnode *q, int loc, int num){
int i;
struct dnode *r, *temp;
//set locator pointer to the front node of doubly linked list
temp = q;
//if provided location is not valid, print message and return to main
if(loc > d_count(q) || loc <= 0){
printf("Please give a number bigger than 0 or less than the size of linked list. If the list is empty, please add node before using this function.\n");
return;
}
//move locator pointer to the insertion location.
for(i=1;i<loc;i++){
temp = temp->next;
}
//create new node
r = malloc(sizeof(struct dnode));
//set data of new node
r->data = num;
//set prev link of new node
r->prev = temp;
//set next link of new node
r->next = temp->next;
//if next node after new node is not null
if(r->next != NULL){
//set prev of node after new node to point to it
(r->next)->prev = r;
}
//set next link of node pointed by locator to new node
temp->next = r;
}
//delete node in doubly linked list
void d_delete(struct dnode **q, int num){
struct dnode *temp;
//set locator pointer to front of doubly linked list
temp = *q;
//loop through linked list to find target node
while(temp!=NULL){
if(temp->data == num){
break;
}
//go to next node
temp = temp->next;
}
//if target is not found, print message and return to main
if(temp == NULL){
printf("Target not found.\n");
return;
}
//if first node is target for deletion
if(temp == *q){
//move p to point to the next node
*q = temp->next;
//if linked list is not empty after deletion
if(*q != NULL){
//set prev link of next node to null
(*q)->prev = NULL;
}
//delete node
free(temp);
}else{
//set node before target to point to the next node
(temp->prev)->next = temp->next;
//if node after target is not null
if(temp->next != NULL){
//set node after target to point to the node before target
(temp->next)->prev = temp->prev;
}
//delete node
free(temp);
}
}
//display nodes in doubly linked list
void d_display(struct dnode *q){
while(q!=NULL){
printf("%d\n",q->data);
q = q->next;
}
}
//count number of nodes in doubly linked list
int d_count(struct dnode *q){
int c = 0;
//loop through doubly linked list
while(q!=NULL){
c++;
q = q->next;
}
return c;
}
//display nodes in reverse order
void r_display(struct dnode *q){
struct dnode *s;
//if doubly linked list is empty
if(q == NULL){
return;
}
//loop through doubly linked list to the last node
while(q->next != NULL){
q = q->next;
}
//set locator pointer to point to the last node
s = q;
//loop through doubly linked list from last node to first node
while(s!=NULL){
printf("%d\n",s->data);
s = s->prev;
}
}