본문 바로가기

Programming/기초

단순연결리스트

#pragma once
#include "Windows.h"
#include "stdio.h"
#include <iostream>
 
using namespace std;
 
struct Node
{
	Node* _Next;
	int value;
};
 
class Linked
{
public:
	Node* _Head;
	Node* _Tail;
 
public:
	// n번째 노드 다음에 삽입
	Node* Insert_After(int k, Node* _node)
	{
		Node *s = new Node();// 새로운 노드 공간 확보
		s->value = k;// 새로운 노드에 갑 대입
		s->_Next = _node->_Next;// 새로운 노드의 다음 노드는 n번째 노드의 다음 노드
		_node->_Next = s;// n번째 노드의 다음 노드는 새로운 노드
		return s;
	}
 
	// n번째 노드의 다음 노드를 삭제
	int Delete_Next(Node *t)
	{
		Node *s;
		if (t->_Next == _Tail)
			return 0;  // n번째의 다음 노드가 꼬리면 리턴
		s = t->_Next;// n번째의 다음 노드를 s가 물어둠
		t->_Next = t->_Next->_Next;// n번째의 다음 노드를 삭제 하면 빈공간은 n번째의 다음 다음 노드로 채운다
		delete s;// n번째의 다음 노드 삭제
		return 1;
	}
 
	// k값을 가지는 노드 찾기
	Node* Find_Node(int k)
	{
		Node *s;
		s = _Head->_Next;
		while (s->value != k && s != _Tail)
			s = s->_Next;
		return s;
	}
 
	// k값을 가지는 노드 삭제
	int delete_node(int k)
	{
		Node *s;// 검색할 노드
		Node *p;// s가 가리키는 노드이 앞 노드
		p = _Head;
		s = p->_Next;
		while (s->value != k && s != _Tail)// 값을 찾든지 꼬리에 도달하면 끝
		{
			p = p->_Next; // p = s			다음 노드로 
			s = p->_Next; // s = s.next	다음 다음 노드로
		}
 
		if (s != _Tail)  /* if find */
		{
			p->_Next = s->_Next; // k값을 가지는 노드를 삭제시 빈공간을 k값노드의 다음 노드를 이전 노드의 다음 노드로 묵는다
			delete s; // k값을 가지는 노드 삭제
			return 1;
		}
		else
			return 0;
	}
 
	// k값을 같는 노드 앞에 t값 같는 새로운 노드 삽입
	Node *Insert_Node(int t, int k)
	{
		Node *s;// 값 검색을 따라가는 노드
		Node *p;// s의 앞노드
		p = _Head;
		s = p->_Next;
		while (s->value != k && s != _Tail)// 값을 찾든지 꼬리에 도달하면 끝
		{
			p = p->_Next; // p = s			다음 노드로 
			s = p->_Next; // s = s.next	다음 다음 노드로
		}
 
		if (s != _Tail)  /* if find */
		{
			Node *r = new Node();// 삽입하기위한 새로운 노드
			r->value = t; // 새로운 노드에 값 대입
			p->_Next = r; // k값노드의 앞 노드에 새로운 노드 대입 		p와 s 사이에 r을 삽입
			r->_Next = s; // 새로운 노드의 다음 노드에 k값노드의 대입	p와 s 사이에 r을 삽입
		}
		return p->_Next;
	}
 
	// 오르차순으로 정령 되있다고 가정하에 정령 순서를 깨지 않고 삽입하기
	Node *Ordered_Insert(int k)
	{
		Node *s;// 값 검색을 따라가는 노드
		Node *p;// s의 앞노드
		p = _Head;
		s = p->_Next;
		while (s->value <= k && s != _Tail)// 값을 찾든지 꼬리에 도달하면 끝
		{
			p = p->_Next; // p = s			다음 노드로 
			s = p->_Next; // s = s.next	다음 다음 노드로
		}
		Node* r = new Node();// 삽입하기위한 새로운 노드
		r->value = k; // 새로운 노드에 값 대입
		p->_Next = r; // k값노드의 앞 노드에 새로운 노드 대입		p와 s 사이에 r을 삽입
		r->_Next = s; // 새로운 노드의 다음 노드에 k값노드의 대입   p와 s 사이에 r을 삽입
		return r;
	}
 
	void Print_List(Node* t)
	{
		printf("\n");
		while (t != _Tail)
		{
			printf("%-8d", t->value);
			t = t->_Next;
		}
	}
 
	Node *delete_all(void)
	{
		Node *s;// 현제 노드
		Node *t;// 이전 노드
		t = _Head->_Next;// 머리 다음이 첫번째 노드, 첫번째 노드부터 삭제
		while (t != _Tail)
		{
			s = t;			// 현제 노드
			t = t->_Next;	// 현제 노드의 다음 노드
			delete s;		// 현제 노드 삭제
		}
		_Head->_Next = _Tail;
		return _Head;
	}
 
	// 노드 역순으로 재배열 해라
	Node* reverse(Node* head)
	{
		Node* p, *c, *n;
		p = head;// 첫번째 원소를 가리킨다
		n = _Tail;// NULL 아니면 꼬리를 가리킨다
		c = _Tail;// NULL 아니면 꼬리를 가리킨다
		while (p != _Tail)
		{
			n = c;			// p의 이전 이전 노드
			c = p;			// p의 이전 노드
			p = p->_Next;	// p의 노드를 한칸 이동
			c->_Next = n;	// p를 한칸 이동 시킨후에 n을 묵음
		}
		return c;
	}
 
public:
	Linked::Linked() {
		_Head = new Node();// 머리 공간 확보
		_Tail = new Node();// 꼬리 공간 확보
		_Head->_Next = _Tail;// 초기에 머리에 다음은 꼬리
		_Tail->_Next = _Tail;// 초기에 꼬리에 다음은 꼬리
	}
	virtual Linked::~Linked() {}
};
 
void main()
{
	Linked _Linked;
 
	Node* A = new Node();
	A->value = 1;
 
	_Linked.Insert_After(4, _Linked._Head);
	_Linked.Insert_After(3, _Linked._Head);
	_Linked.Insert_After(2, _Linked._Head);
	_Linked.Insert_After(1, _Linked._Head);
	_Linked.Print_List(_Linked._Head);
 
	_Linked._Head->_Next = _Linked.reverse(_Linked._Head->_Next);
	_Linked.Print_List(_Linked._Head);
 
	int x = 0;
	cin >> x;
	cout << x << endl;
}


'Programming > 기초' 카테고리의 다른 글

메모리 할당을 몼하는 상황  (0) 2018.05.26
데드락  (0) 2018.05.26
QuickSort  (0) 2018.05.26
문자열 비교  (0) 2018.05.26
문자열 뒤집기  (0) 2018.05.26
버블 정렬 , 삽입 정렬  (0) 2018.05.26
private 상속  (0) 2018.05.26
다중 배열 동적 생성  (0) 2018.05.26