-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy path1000-sort_deck.c
115 lines (108 loc) · 2.45 KB
/
1000-sort_deck.c
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "deck.h"
#include <stdio.h>
/**
*_strcmp - compare two strings
*@str1: string
*@str2: string
*Return: 1 str1 and str2 is equal, 0 they are not equal
*/
int _strcmp(const char *str1, char *str2)
{
size_t i = 0;
if (str1 == '\0')
return (0);
while (str1[i])
{
if (str1[i] != str2[i])
return (0);
i++;
}
if (str1[i] == '\0' && str2[i])
return (0);
return (1);
}
/**
* get_card_position - return the position based on card you put in
* @node: represent the card
* Return: return the card position
*/
int get_card_position(deck_node_t *node)
{
int value;
value = (*node).card->value[0] - '0';
if (value < 50 || value > 57)
{
if (_strcmp((*node).card->value, "Ace") == 1)
value = 1;
else if (_strcmp((*node).card->value, "10") == 1)
value = 10;
else if (_strcmp((*node).card->value, "Jack") == 1)
value = 11;
else if (_strcmp((*node).card->value, "Queen") == 1)
value = 12;
else if (_strcmp((*node).card->value, "King") == 1)
value = 13;
}
value += (*node).card->kind * 13;
return (value);
}
/**
*swap_card - swap a card for his previous one
*@card: card
*@deck: card deck
*Return: return a pointer to a card which was enter it
*/
deck_node_t *swap_card(deck_node_t *card, deck_node_t **deck)
{
deck_node_t *back = card->prev, *current = card;
/*NULL, 19, 48, 9, 71, 13, NULL*/
back->next = current->next;
if (current->next)
current->next->prev = back;
current->next = back;
current->prev = back->prev;
back->prev = current;
if (current->prev)
current->prev->next = current;
else
*deck = current;
return (current);
}
/**
* insertion_sort_deck - function that sorts a doubly linked deck
* of integers in ascending order using the Insertion sort algorithm
* @deck: Dobule linked deck to sort
*/
void insertion_sort_deck(deck_node_t **deck)
{
int value_prev, value_current;
deck_node_t *node;
if (deck == NULL || (*deck)->next == NULL)
return;
node = (*deck)->next;
while (node)
{
/* preparing the previous value */
if (node->prev)
{
value_prev = get_card_position((node->prev));
value_current = get_card_position(node);
}
while ((node->prev) && (value_prev > value_current))
{
value_prev = get_card_position((node->prev));
value_current = get_card_position(node);
node = swap_card(node, deck);
}
node = node->next;
}
}
/**
* sort_deck - sort a deck you put in using
* insertion sort algorithm
* @deck: deck
*/
void sort_deck(deck_node_t **deck)
{
insertion_sort_deck(deck);
}