-
Notifications
You must be signed in to change notification settings - Fork 0
/
target_doubly_ll.h
100 lines (76 loc) · 2 KB
/
target_doubly_ll.h
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
#include <stdio.h>
#include <stdlib.h>
struct Target_Node {
int tag;
int target;
struct Target_Node *next, *prev;
};
struct Target_Node *createTargetNode(int tag, int target) {
struct Target_Node *node = (struct Target_Node*) malloc(sizeof(struct Target_Node));
node -> tag = tag;
node -> target = target;
node -> prev = NULL;
node -> next = NULL;
return node;
}
void push_target_tag(struct Target_Node **head, int tag, int target) {
if(*head == NULL) {
struct Target_Node *temp = createTargetNode(tag, target);
temp -> next = (*head);
(*head) = temp;
return;
}
struct Target_Node *temp = createTargetNode(tag, target);
temp -> next = (*head);
struct Target_Node *prevHead = temp -> next;
prevHead -> prev = temp;
(*head) = temp;
}
void move_to_head_tag(struct Target_Node **head, int search_tag) {
struct Target_Node *temp = (*head);
if(temp -> tag == search_tag) {
return;
}
while(temp -> next != NULL && temp -> next -> tag != search_tag)
temp = temp -> next;
if(temp -> next != NULL && temp -> next -> tag == search_tag) {
struct Target_Node *tag_frame = temp -> next;
if(tag_frame -> next != NULL) {
temp -> next = tag_frame -> next;
temp -> next -> prev = temp;
}
else {
temp -> next = NULL;
}
tag_frame -> prev = NULL;
struct Target_Node *prevHead = (*head);
tag_frame -> next = prevHead;
prevHead -> prev = tag_frame;
(*head) = tag_frame;
}
}
void delete_last_tag(struct Target_Node **head) {
struct Target_Node *temp = (*head);
if(temp == NULL) {
return;
}
else if(temp -> next == NULL) {
(*head) == NULL;
return;
}
while(temp -> next -> next != NULL)
temp = temp -> next;
if(temp -> next -> next == NULL) {
free(temp -> next);
temp -> next = NULL;
}
}
struct Target_Node *search_target(struct Target_Node **head, int search_tag) {
struct Target_Node *temp = (*head);
while(temp != NULL && temp -> tag != search_tag)
temp = temp -> next;
if(temp != NULL && temp -> tag == search_tag) {
return temp;
}
return NULL;
}