본문 바로가기

Data Structure

원형 이중 리스트

main.cpp


#include
#include
#include"List.h"

int main() {
	List list;
	LData Data;
	LInit(&list);

	LInsert(&list, 1);
	LInsert(&list, 2);
	LInsert(&list, 3);
	LInsert(&list, 4);
	LInsert(&list, 5);

	printf("현재 데이터 수 : %d\n", LCount(&list));
	if (LFirst(&list, &Data)) {
		printf("%d  ", Data);
		for (int i = 0; i < (LCount(&list) * 3) - 1; i++) {
			if (LNext(&list, &Data)) {
				printf("%d  ", Data);
			}
		}
	}
	int num = 0;
	puts("\n");
	printf("삭제하실 데이터 입력 : ");
	scanf("%d", &num);
	if (LFirst(&list, &Data)) {
		if (num == Data) {
			LRemove(&list);
		}
		for (int i = 0; i < (LCount(&list) - 1); i++) {
			if (LNext(&list, &Data)) {
				if (num == Data) {
					LRemove(&list);
				}
			}
		}
	}
	puts("\n");
	printf("현재 데이터 수 : %d\n", LCount(&list));
	if (LFirst(&list, &Data)) {
		printf("%d  ", Data);
		for (int i = 0; i < (LCount(&list) * 3) - 1; i++) {
			if (LNext(&list, &Data)) {
				printf("%d  ", Data);
			}
		}
	}
	puts("\n");
	printf("데이터 역순으로 출력\n");
	if (LFirst(&list, &Data)) {
		for (int i = 0; i < (LCount(&list) * 3); i++) {
			if (LBefore(&list, &Data)) {
				printf("%d  ", Data);
			}
		}
	}
	if (LFirst(&list, &Data)) {
		LRemove(&list);
		for (int i = 0; i < (LCount(&list) - 1); i++) {
			if (LNext(&list, &Data)) {
				LRemove(&list);
			}
		}
	}
	puts("\n");
	return 0;
}


List.h


#pragma once

typedef int LData;

typedef struct _node {
	LData Data;
	_node* Next;
	_node* Prev;
}Node;

typedef struct {
	Node* Tail;
	Node* Cur;
	int Count;
}LinkedList;

typedef LinkedList List;

void LInit(List*);
void LInsert(List*, LData);

bool LFirst(List*, LData*);
bool LNext(List*, LData*);
bool LBefore(List*, LData*);

LData LRemove(List*);
int LCount(List*);


List.cpp


#include
#include"List.h"

void LInit(List* plist) {
	plist->Cur = plist->Tail = NULL;
	plist->Count = 0;
}

void LInsert(List* plist, LData Data) {
	Node* NewNode = (Node*)malloc(sizeof(Node));
	NewNode->Data = Data;
	if (!plist->Tail) {
		plist->Tail = NewNode;
		plist->Tail->Next = plist->Tail->Prev = NewNode;
	}
	else {
		NewNode->Next = plist->Tail->Next;
		plist->Tail->Next->Prev = NewNode;
		plist->Tail->Next = NewNode;
		NewNode->Prev = plist->Tail;
		plist->Tail = NewNode;
	}
	(plist->Count)++;
}

bool LFirst(List* plist, LData* Data) {
	if (!plist->Tail) {
		return false;
	}
	plist->Cur = plist->Tail->Next;
	*Data = plist->Cur->Data;
	return true;
}

bool LNext(List* plist, LData* Data) {
	if (!plist->Tail) {
		return false;
	}
	plist->Cur = plist->Cur->Next;
	*Data = plist->Cur->Data;
	return true;
}

bool LBefore(List* plist, LData* Data) {
	if (!plist->Tail) {
		return false;
	}
	plist->Cur = plist->Cur->Prev;
	*Data = plist->Cur->Data;
	return true;
}

LData LRemove(List* plist) {
	Node* rpos = plist->Cur;
	LData BData = rpos->Data;
	if (rpos == plist->Tail) {
		if (plist->Tail->Next == plist->Tail) {
			plist->Tail = NULL;
		}
		else {
			plist->Tail = plist->Cur->Prev;
		}
	}
	plist->Cur->Prev->Next = plist->Cur->Next;
	plist->Cur->Next->Prev = plist->Cur->Prev;
	plist->Cur = plist->Cur->Prev;
	(plist->Count)--;
	free(rpos);
	return BData;
}

int LCount(List* plist) {
	return (plist->Count);
}



기존 원형 리스트에 



NewNode->Next = NewNode;

를 삭제하고


plist->Tail->Prev = plist->Tail->Next = NewNode;

plist->Tail->Next->Prev = NewNode;

NewNode->Prev = plist->Tail;

를 추가 해 주시면 됩니다.

'Data Structure' 카테고리의 다른 글

삽입 정렬  (0) 2018.05.09
선택정렬  (0) 2018.05.09
버블 정렬  (0) 2018.05.08