본문 바로가기

자료구조

연결리스트(양방향,head 및 tail에 데이터추가)

반응형
//양방향에,헤드에 추가
/*
양방향 연결리스트 기능 
장점:탐색 양방향 가능 
단점:메모리 더많이사용, 구현 복잡 
*/
#include<iostream>
using namespace std;

struct Node {
	int data;
	Node *prev;
	Node *next;
};

struct Linkedlist
{
	Node *dummy; //헤드에 추가할때 ->순서가 그닥 필요하지 않을때 
	Node *tail; //꼬리에 추가할때 -> 연결리스트에 순서가 필요한경우 
	int len = 0;
	Linkedlist() //생성자 
	{
		dummy = (Node*)malloc(sizeof(Node));
		dummy->data = -1;
		dummy->prev = NULL;
		dummy->next = NULL;

		tail = dummy; //같은 위치에 지정 
		tail->data = -1;
		tail->next = NULL;
	}
	
	void HeadInsert(int data)
	{//헤드에 추가해보기 
		Node *newnode = (Node*)malloc(sizeof(Node));
		newnode->data = data;
		newnode->next = NULL;
		if (dummy->next != 0)//연결이 되어있다면 prev와 next 다시연결
		{
			newnode->next = dummy->next;
			newnode->prev = dummy;
			dummy->next->prev = newnode;
			dummy->next = newnode;
		}
		else
		{
			newnode->prev = dummy;
			dummy->next = newnode;
		}
	}
	void TailInsert(int data)
	{//꼬리에 추가해보기 
		Node *newnode = (Node*)malloc(sizeof(Node));
		newnode->data = data;
		newnode->next = NULL;

		
			tail->next = newnode;
			newnode->prev = tail;
		
		//꼬리위치 옮기기 
			tail = tail->next;

	}
	void Delete(int data)
	{//해당 데이터 찾아서 삭제해보기 

		Node *cur = dummy;
		cur = cur->next;
		
		while (cur->next!=0&&cur->data != data)cur = cur->next;

		if (cur->next == NULL) //마지막노드를 삭제한다면 
		{
			cur->prev->next = NULL; //삭제노드이전 노드의 next를 null로 바꿔준다.
		}
		else
		{
			cur->prev->next = cur->next;
			cur->next->prev = cur->prev;
		}
	}
	void print()
	{
		Node *cur = dummy;
		cur = cur->next;//더미다음부터
		while(cur)
		{
			printf("%d ", cur->data);
			cur=cur->next;
		}
		printf("\n");
	}

};

int main()
{
	Linkedlist linkedlist;

	     //헤드에 추가 
		linkedlist.HeadInsert(1);
		linkedlist.HeadInsert(2);
		linkedlist.HeadInsert(3);
		linkedlist.print();//3 2 1
		linkedlist.Delete(2);
		linkedlist.print();//3 1
		linkedlist.Delete(1);
		linkedlist.print();//3
		linkedlist.Delete(3);
		linkedlist.print();//\n만 출력,,연결리스트 비워짐

		// 꼬리에 추가 
		linkedlist.TailInsert(1);
		linkedlist.TailInsert(2);
		linkedlist.TailInsert(3);
		linkedlist.print(); //1 2 3
		linkedlist.Delete(3);
		linkedlist.print();//1 2

	//}
}
반응형

'자료구조' 카테고리의 다른 글

TREE (연결리스트)  (0) 2019.09.26
트라이(Trie) 자료구조  (0) 2019.04.29
HASH(해쉬)  (0) 2019.04.26
연결리스트[큐]  (0) 2019.04.26
정렬 총 정리  (0) 2019.04.24