[Node.h]
/*
1.단순 연결 리스트에 정수가 저장되어 있다. 단순 연결 리스트의 모든 데이터 값을 더한 합을 출력하는 프로그램을 작성한다
2. 단순 연결리스트에 특정한 데이터 값을 갖는 노드의 개수를 계산하는 함수를 작성한다
*/
#include <iostream>
using namespace std;
class Node
{
private:
Node *link; //다음 노드를 가리키는 포인터 변수
int data; //노드의 데이터 필드
public:
Node(int val = 0) :data(val), link(NULL)
{
}
int getData()
{
return data;
}
Node *getLink()
{
return link;
}
void setLink(Node *next)
{
link = next;
}
void display()
{
cout << "<" << data << "> ";
}
bool hasData(int val)
{
return data == val;
}
//자신의 다음에 새로운 노드 n을 삽입하는 함수
void insertNext(Node *n)
{
if (n != NULL)
{
n->link = link;
link = n;
}
}
//자신의 다음 노드를 리스트에서 삭제하는 함수
Node *removeNext()
{
Node *removed = link;
if (removed != NULL)
link = removed->link;
return removed;
}
};
[LinkedList.h]
/*
단순 연결리스트 클래스
*/
#include "listNode.h"
class LinkedList
{
private:
Node org; //헤드 노드(헤드 포인터 아님)
public:
LinkedList() :org(0)
{
}
~LinkedList()
{
clear(); //소멸자
}
void clear()
{
while (!isEmpty())
delete remove(0);
}
Node *getHead()
{
return org.getLink();
}
bool isEmpty()
{
return getHead() == NULL;
}
//pos번째 항목을 반환
Node *getEntry(int pos)
{
Node *n = &org;
for (int i = -1; i < pos; i++, n = n->getLink())
if (n == NULL)
break;
return n;
}
//리스트의 어떤 위치에 항목 삽입
void insert(int pos, Node *n)
{
Node *prev = getEntry(pos - 1);
if (prev != NULL)
prev->insertNext(n);
}
//리스트의 어떤 위치의 항목 삭제
Node *remove(int pos)
{
Node *prev = getEntry(pos - 1);
return prev->removeNext();
}
//탐색 함수
Node *find(int val)
{
for (Node *p = getHead(); p != NULL; p = p->getLink())
if (p->hasData(val))
return p;
return NULL;
}
//리스트의 어떤 위치에 항목 삽입
void replace(int pos, Node *n)
{
Node *prev = getEntry(pos - 1);
if (prev != NULL)
{
delete prev->removeNext();
prev->insertNext(n);
}
}
//리스트의 항목 개수를 반환
int size()
{
int count = 0;
for (Node *p = getHead(); p != NULL; p = p->getLink())
count++;
return count;
}
//화면에 보기 좋게 출력
void display()
{
cout << "[전체 항목 수 = " << size() << "] : ";
for (Node *p = getHead(); p != NULL; p = p->getLink())
p->display();
cout << endl;
}
//모든 데이터 값을 더한 합을 출력하는 함수
void sum()
{
int Add = 0;
cout << "[전체 항목의 합 = ";
for (Node *p = getHead(); p != NULL; p = p->getLink())
Add += p->getData();
cout << Add << "]" << endl;
}
//단순 연결 리스트에서 특정한 데이터 값을 갖는 노드의 개수를 계산하는 함수
int count(int val)
{
int cnt = 0;
for (Node *p = getHead(); p != NULL; p = p->getLink())
if (p->hasData(val))
cnt++;
return cnt;
}
};
[LinkedList.cpp]
/*
단순 연결리스트 테스트 프로그램
*/
#include "LinkedList.h"
int main(void)
{
LinkedList list;
list.insert(0, new Node(10));
list.insert(0, new Node(20));
list.insert(1, new Node(30));
list.insert(list.size(), new Node(40));
list.insert(2, new Node(50));
list.display();
list.sum();
cout << "리스트 내 90을 갖고 있는 노드의 수: " << list.count(90) << endl;
list.remove(2);
list.remove(list.size() - 1);
list.remove(0);
list.replace(1, new Node(90));
list.display();
cout << "리스트 내 90을 갖고 있는 노드의 수: " << list.count(90) << endl;
list.clear();
list.display();
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] C++로 쉽게 풀어쓴 자료구조
'C++ > C++로 쉽게 풀어쓴 자료구조' 카테고리의 다른 글
C++로 쉽게 풀어쓴 자료구조 7장 연습문제 (0) | 2017.10.07 |
---|---|
C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 6 (6) | 2017.10.04 |
C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 5 (25) | 2017.10.01 |
C++로 쉽게 풀어쓴 자료구조 연습문제 4-8 (0) | 2017.09.27 |
C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 4 (7) | 2017.09.27 |