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 |