- Programming/- 자료구조
★ 5. 원형 연결 리스트 구현하기
g_u_u
2016. 7. 19. 03:40
반응형
- 원형 연결 리스트 -
각 기능별로 함수로 구현이 된 원형 연결 리스트 예제 소스입니다.
"한번에 이해되는 C 자료구조" 책을 참조하였습니다.
// # 원형 연결 리스트에 원소 추가, 삽입하기 #
#include <iostream>
#include <stdlib.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int element;
struct tagListNode
{
// # 노드를 구성하는 데이터 필드 #
element data;
{
// # 노드를 구성하는 데이터 필드 #
element data;
// # 다음 노드를 가리키는 링크 필드 #
tagListNode* link;
};
tagListNode* link;
};
// # 헤더의 정보를 저장할 구조체 선언 #
struct tagListHead{
tagListNode* head;
};
struct tagListHead{
tagListNode* head;
};
// # 연결 리스트를 초기화하는 함수 #
tagListHead* createLinkedListHead()
{
tagListHead* head;
// # 헤더의 공간을 확보 #
head = new tagListHead;
head->head = NULL;
tagListHead* createLinkedListHead()
{
tagListHead* head;
// # 헤더의 공간을 확보 #
head = new tagListHead;
head->head = NULL;
return head;
}
}
// # 연결 리스트를 출력하는 함수 #
void printList(tagListHead* head)
{
tagListNode* p;
void printList(tagListHead* head)
{
tagListNode* p;
if (head->head == NULL) return;
p = head->head;
do {
cout << p->data;
p = p->link;
} while (p != head->head);
cout << endl;
}
cout << p->data;
p = p->link;
} while (p != head->head);
cout << endl;
}
// # 노드를 동적으로 생성하는 함수 #
tagListNode* getNode()
{
tagListNode* newNode;
newNode = new tagListNode;
tagListNode* getNode()
{
tagListNode* newNode;
newNode = new tagListNode;
if (newNode == NULL)
{
fprintf(stderr, "메모리 할당 에러\n");
exit(1);
}
{
fprintf(stderr, "메모리 할당 에러\n");
exit(1);
}
return newNode;
}
}
// # 원형 연결 리스트 처음에 노드를 삽입하는 함수 #
void addFrontNode(tagListHead* head, element x)
{
tagListNode* newNode;
tagListNode* p;
void addFrontNode(tagListHead* head, element x)
{
tagListNode* newNode;
tagListNode* p;
newNode = getNode();
newNode->data = x; // # 데이터 필드에 데이터 설정 #
newNode->data = x; // # 데이터 필드에 데이터 설정 #
if (head->head == NULL) // # 첫 번째 추가되는 데이터라면 #
{
head->head = newNode;
newNode->link = newNode;
}
else
{
p = head->head;
while (p->link != head->head)
p = p->link;
{
head->head = newNode;
newNode->link = newNode;
}
else
{
p = head->head;
while (p->link != head->head)
p = p->link;
newNode->link = p->link;
p->link = newNode;
head->head = newNode;
}
}
p->link = newNode;
head->head = newNode;
}
}
// # 노드값 검색하는 함수 #
tagListNode* findNode(tagListHead* head, element x)
{
tagListNode* p;
tagListNode* findNode(tagListHead* head, element x)
{
tagListNode* p;
p = head->head;
while (p != NULL) // # NULL에 도달하면 반복문 벗어남 #
{
if (p->data == x) // # 데이터를 찾음 #
{
break;
}
p = p->link;
}
return p;
}
while (p != NULL) // # NULL에 도달하면 반복문 벗어남 #
{
if (p->data == x) // # 데이터를 찾음 #
{
break;
}
p = p->link;
}
return p;
}
// # 원형 연결 리스트 중간에 노드를 삽입하는 함수 #
void insertMiddleNode(tagListHead* head, tagListNode* pre, element x)
{
tagListNode* newNode;
tagListNode* p;
// # 새로 추가할 노드를 저장할 메모리 할당 #
newNode = getNode();
newNode->data = x; // # 데이터 필드에 데이터 설정 #
if (head->head == NULL) // # 첫 번째 추가되는 데이터라면 #
{
head->head = newNode;
newNode->link = newNode;
}
else
{
newNode->link = pre->link;
pre->link = newNode;
}
}
void insertMiddleNode(tagListHead* head, tagListNode* pre, element x)
{
tagListNode* newNode;
tagListNode* p;
// # 새로 추가할 노드를 저장할 메모리 할당 #
newNode = getNode();
newNode->data = x; // # 데이터 필드에 데이터 설정 #
if (head->head == NULL) // # 첫 번째 추가되는 데이터라면 #
{
head->head = newNode;
newNode->link = newNode;
}
else
{
newNode->link = pre->link;
pre->link = newNode;
}
}
void main()
{
tagListHead* head;
tagListNode* p;
{
tagListHead* head;
tagListNode* p;
head = createLinkedListHead();
cout << "연결 리스트 생성하기!" << endl;
printList(head);
printList(head);
cout << "연결 리스트 3개의 노드 추가하기!" << endl;
addFrontNode(head, 10);
addFrontNode(head, 20);
addFrontNode(head, 30);
printList(head);
addFrontNode(head, 10);
addFrontNode(head, 20);
addFrontNode(head, 30);
printList(head);
cout << "연결 리스트 처음에 노드 한개 추가하기!" << endl;
addFrontNode(head, 40);
printList(head);
addFrontNode(head, 40);
printList(head);
cout << "데이터가 30인 노드의 위치를 찾고 50을 30뒤에 삽입!" << endl;
p = findNode(head, 30);
insertMiddleNode(head, p, 50);
printList(head);
p = findNode(head, 30);
insertMiddleNode(head, p, 50);
printList(head);
getchar();
}
}
반응형