/ push_swap / push_swap / ps_deque_utils.c
ps_deque_utils.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   ps_deque_utils.c                                   :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: gychoi <gychoi@student.42seoul.kr>         +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2022/11/13 21:37:23 by gychoi            #+#    #+#             */
 9  /*   Updated: 2022/12/04 22:31:40 by gychoi           ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  #include "push_swap.h"
14  
15  int	deque_sorted(t_deque *deque)
16  {
17  	t_list	*node;
18  
19  	node = deque->head;
20  	if (node == NULL || node->next == NULL)
21  		return (1);
22  	while (node->next)
23  	{
24  		if (node->data > node->next->data)
25  			return (0);
26  		node = node->next;
27  	}
28  	return (1);
29  }
30  
31  void	deque_partition(t_deque *deque_a, t_deque *deque_b, int p_a, int p_b)
32  {
33  	int	size;
34  
35  	size = deque_a->size;
36  	while (--size)
37  	{
38  		if (deque_a->head->data < p_a)
39  		{
40  			pb(deque_a, deque_b);
41  			rb(deque_b);
42  		}
43  		else if (deque_a->head->data < p_b && deque_a->head->data != p_a)
44  			pb(deque_a, deque_b);
45  		else
46  			ra(deque_a);
47  	}
48  	while (deque_a->size > 2)
49  	{
50  		if (deque_a->head->data != p_a && deque_a->head->data != p_b)
51  			pb(deque_a, deque_b);
52  		else
53  			ra(deque_a);
54  	}
55  	sort_small(deque_a, deque_b, deque_a->size);
56  }
57  
58  t_deque	*ps_deqnew(void)
59  {
60  	t_deque	*deq;
61  
62  	deq = (t_deque *)malloc(sizeof(t_deque));
63  	if (deq == NULL)
64  		exit(1);
65  	deq->size = 0;
66  	deq->head = NULL;
67  	deq->tail = NULL;
68  	return (deq);
69  }
70  
71  void	deque_clear(t_deque *deque_a, t_deque *deque_b)
72  {
73  	if (!deque_a || !deque_b)
74  		return ;
75  	ps_lstclear(deque_a);
76  	ps_lstclear(deque_b);
77  	free(deque_a);
78  	free(deque_b);
79  }
80  
81  void	deque_set(t_deque *deque_a, t_list **list, int *array, int argc)
82  {
83  	int	i;
84  
85  	i = 0;
86  	while (i < argc - 1)
87  	{	
88  		ps_lstadd_back(list, ps_lstnew(array[i]));
89  		i++;
90  	}
91  	deque_a->size = argc - 1;
92  	deque_a->head = *list;
93  	deque_a->tail = ps_lstlast(*list);
94  }