-
문제05-2 더미 노드 기반의 양방향 연결 리스트 구현Data Structure/윤성우의 열혈 자료구조 2019. 7. 2. 03:45
1. 양방향 연결 리스트
2. 더미 노드가 리스트의 앞 뒤에 각각 존재 해야함
3. 포인터 변수 head와 tail이 있어서 리스트의 앞과 뒤를 각각 가리킴.
4. 새노드를 꼬리에 추가하는 방식으로 LInsert 구현
// DlinkedHeader.h
#pragma once;
typedef struct _node
{
int data;
struct _node * next;
struct _node * prev;
}Node;
typedef struct _dlist
{
Node * head;
Node * tail;
Node * cur;
int numOfdata;
} List;
void ListInit(List * plist);
void LInsert(List * plist, int data);
int LFirst(List * plist, int * pdata);
int LNext(List * plist, int * pdata);
int LRemove(List *plist);
int LCount(List *plist);
//DlinkedList.cpp
#include <iostream>
#include "DlinkedHeader.h"
void ListInit(List * plist)
{
plist->head = (Node*)malloc(sizeof(Node));
plist->tail = (Node*)malloc(sizeof(Node));
plist->head->prev = NULL;
plist->head->next = plist->tail;
plist->tail->next = NULL;
plist->tail->prev = plist->head;
plist->cur = NULL;
plist->numOfdata = 0;
}
void LInsert(List * plist, int data)
{
Node * newnode = (Node*)malloc(sizeof(Node));
newnode->data = data;
newnode->prev = plist->tail->prev;
plist->tail->prev->next = newnode;
newnode->next = plist->tail;
plist->tail->prev = newnode;
(plist->numOfdata)++;
}
int LFirst(List * plist, int * pdata)
{
if (plist->head->next == plist->tail)
return false;
plist->cur = plist->head->next;
*pdata = plist->cur->data;
return true;
}
int LNext(List * plist, int * pdata)
{
if (plist->cur->next == plist->tail)
return false;
plist->cur = plist->cur->next;
*pdata = plist->cur->data;
return true;
}
int LRemove(List *plist)
{
Node * temp = plist->cur;
int itemp = temp->data;
plist->cur->prev->next = plist->cur->next;
plist->cur->next->prev = plist->cur->prev;
plist->cur = plist->cur->prev;
free(temp);
(plist->numOfdata)--;
return itemp;
}
int LCount(List *plist)
{
return plist->numOfdata;
}
// Main . cpp
#include <iostream>
#include "DlinkedHeader.h"
using namespace std;
int main()
{
List list;
int data;
ListInit(&list); // 데이터 초기화
LInsert(&list, 1); // 1~8 데이터 저장
LInsert(&list, 2);
LInsert(&list, 3);
LInsert(&list, 4);
LInsert(&list, 5);
LInsert(&list, 6);
LInsert(&list, 7);
LInsert(&list, 8);
if (LFirst(&list, &data)) // 데이터 조회
{
cout << data << " ";
while (LNext(&list, &data))
cout << data << " ";
cout << endl;
}
if (LFirst(&list, &data)) // 2의 배수 데이터 삭제
{
if (data % 2 == 0)
LRemove(&list);
while (LNext(&list, &data))
if (data % 2 == 0)
LRemove(&list);
}
if (LFirst(&list, &data)) // 삭제 후 데이터 조회
{
cout << data << " ";
while (LNext(&list, &data))
cout << data << " ";
cout << endl;
}
}
'Data Structure > 윤성우의 열혈 자료구조' 카테고리의 다른 글
문제 03 -1 리스트 라이브러리의 활용 (0) 2019.09.04 문제 11-1 이진 탐색 트리의 조건 (0) 2019.08.16 문제 09 -1 우선순위 큐의 활용 (0) 2019.07.29 문제 08-1 이진 트리의 소멸 (0) 2019.07.15 문제 06-1 연결 리스트를 이용한 스택의 또 다른 구현 (0) 2019.07.07