Linked List

29923 ワード

  • の最大ノード数を決定し、動的割り当てではなく静的割り当てを使用してメモリプールを作成します.
  • head、tailはノードとして虚値を入力します.→ノードを追加し、削除する際に数を考慮する必要はありません.
  • SLL → head/nxt
    DLL → head, tail/prv, nxt
  • 1. Single Linked List

    #include <iostream>
    
    #define MAX_NODE 10002
    
    using namespace std;
    
    typedef class c_node
    {
    public :
    	int				data;
    	class c_node	*nxt;
    
    	class c_node	*get_new_node(int new_data)
    	{
    		data = new_data;
    		nxt = nullptr;
    		return (this);
    	}
    }					t_node;
    
    t_node	g_mem_pool[MAX_NODE];
    t_node	*g_head;
    int		g_node_cnt;
    
    void	print_lst(void);
    
    void	init_lst(void)
    {
    	g_node_cnt = 0;
    	g_head = g_mem_pool[g_node_cnt++].get_new_node(-1); // dummy
    }
    
    void	lst_add_front(int data)
    {
    	t_node	*new_node;
    
    	new_node = g_mem_pool[g_node_cnt++].get_new_node(data);
    	new_node->nxt = g_head->nxt;
    	g_head->nxt = new_node;
    }
    
    void	lst_add_back(int data)
    {
    	t_node	*cur;
    	t_node	*new_node;
    
    	cur = g_head;
    	while (cur->nxt)
    		cur = cur->nxt;
    	new_node = g_mem_pool[g_node_cnt++].get_new_node(data);
    	cur->nxt = new_node;
    }
    
    void	lst_add_by_idx(int data, int idx)
    {
    	t_node	*cur;
    	t_node	*new_node;
    
    	cur = g_head;
    	while (--idx && cur->nxt)
    		cur = cur->nxt;
    	new_node = g_mem_pool[g_node_cnt++].get_new_node(data);
    	new_node->nxt = cur->nxt;
    	cur->nxt = new_node;
    }
    
    void	lst_rm_by_data(int data)
    {
    	t_node	*cur, *trail;
    
    	trail = cur = g_head;
    	while (cur)
    	{
    		if (cur->data == data)
    		{
    			trail->nxt = cur->nxt;
    			return ;
    		}
    		trail = cur;
    		cur = cur->nxt;
    	}
    }
    
    int	get_lst(int output[MAX_NODE])
    {
    	t_node	*cur;
    	int		cnt;
    
    	cur = g_head->nxt;
    	cnt = 0;
    	while (cur)
    	{
    		output[cnt] = cur->data;
    		++cnt;
    		cur = cur->nxt;
    	}
    	return (cnt);
    }
    
    void	print_lst(void)
    {
    	t_node	*cur;
    
    	cur = g_head->nxt;
    	cout << "lst: ";
    	while (cur->nxt)
    	{
    		cout << cur->data << " ";
    		cur = cur->nxt;
    	}
    	cout << endl;
    }

    2. Double Linked List

    #include <iostream>
    
    #define MAX_NODE 10002
    
    using namespace std;
    
    typedef class c_node
    {
    public :
    	int				data;
    	class c_node	*prv;
    	class c_node	*nxt;
    
    	class c_node	*get_new_node(int new_data)
    	{
    		data = new_data;
    		prv = nxt = nullptr;
    		return (this);
    	}
    }					t_node;
    
    t_node	g_mem_pool[MAX_NODE];
    t_node	*g_head;
    t_node	*g_tail;
    int		g_node_cnt;
    
    void	print_lst(void);
    
    void	init_lst(void)
    {
    	g_node_cnt = 0;
    	g_head = g_mem_pool[g_node_cnt++].get_new_node(-1);
    	g_tail = g_mem_pool[g_node_cnt++].get_new_node(-1);
    	g_head->nxt = g_tail;
    	g_tail->prv = g_head;
    }
    
    void	lst_add_front(int data)
    {
    	t_node	*new_node;
    
    	new_node = g_mem_pool[g_node_cnt++].get_new_node(data);
    	new_node->prv = g_head;
    	new_node->nxt = g_head->nxt;
    	g_head->nxt->prv = new_node;
    	g_head->nxt = new_node;
    }
    
    void	lst_add_back(int data)
    {
    	t_node	*new_node;
    
    	new_node = g_mem_pool[g_node_cnt++].get_new_node(data);
    	new_node->prv = g_tail->prv;
    	new_node->nxt = g_tail;
    	g_tail->prv->nxt = new_node;
    	g_tail->prv = new_node;
    }
    
    void	lst_add_by_idx(int data, int idx)
    {
    	t_node	*cur;
    	t_node	*new_node;
    
    	cur = g_head;
    	while (--idx && cur->nxt)
    		cur = cur->nxt;
    	new_node = g_mem_pool[g_node_cnt++].get_new_node(data);
    	new_node->prv = cur;
    	new_node->nxt = cur->nxt;
    	cur->nxt->prv = new_node;
    	cur->nxt = new_node;
    }
    
    int	get_node_idx(int data)
    {
    	t_node	*cur;
    	int		cnt;
    
    	cur = g_head->nxt;
    	cnt = 1;
    	while (cur)
    	{
    		if (cur->data == data)
    			return (cnt);
    		++cnt;
    		cur = cur->nxt;
    	}
    	return (-1);
    }
    
    void	lst_rm_by_data(int data)
    {
    	t_node	*cur, *trail;
    
    	cur = g_head;
    	while (cur)
    	{
    		if (cur->data == data)
    		{
    			trail->nxt = cur->nxt;
    			cur->nxt->prv = trail;
    			return ;
    		}
    		trail = cur;
    		cur = cur->nxt;
    	}
    }
    
    int	get_lst(int output[MAX_NODE])
    {
    	t_node	*cur;
    	int		cnt;
    
    	cur = g_head->nxt;
    	cnt = 0;
    	while (cur->nxt)
    	{
    		output[cnt] = cur->data;
    		++cnt;
    		cur = cur->nxt;
    	}
    	return (cnt);
    }
    
    int	get_reversed_lst(int output[MAX_NODE])
    {
    	t_node	*cur;
    	int		cnt;
    
    	cur = g_tail->prv;
    	cnt = 0;
    	while (cur->prv)
    	{
    		output[cnt] = cur->data;
    		++cnt;
    		cur = cur->prv;
    	}
    	return (cnt);
    }
    
    void	print_lst(void)
    {
    	t_node	*cur;
    
    	cur = g_head->nxt;
    	cout << "lst: ";
    	while (cur->nxt)
    	{
    		cout << cur->data << " ";
    		cur = cur->nxt;
    	}
    	cout << endl;
    }