Doubly Linked List (양방향 연결리스트)
typedef struct _node
{
Data data;
struct _node * next;
struct _node * prev; // 이전 노드를 가리키는 멤버가 추가됨
} Node;
양방향 연결리스트의 LNext
왼쪽 노드의 주소값을 얻을 수 있기 때문에,
단순 연결리스트와 달리 before를 유지할 필요 없음
int LPrevious(List * plist, Data * pdata);
첫번째 노드 추가
newMode->next = NULL;
-> newMode->next = plist->head;
첫번째 노드를 추가할 때 plist->head는 NULL이기 때문에 위의 바뀐 문장으로 두가지 역할을 할 수 있다.
두번째 노드의 추가는 다음과 같이 이뤄진다.
void LInsert(List * plist, Data data)
{
Node * newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = plist->head; // (1) 새 노드의 next가 이전 노드에 연결
if(plist->head != NULL) // NULL이 아니기 때문에
plist->head->prev = newNode; // (2) 이전 node의 prev가 새 노드에 연결
(...생략)
}
void LInsert(List * plist, Data data)
{
Node * newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
(...생략)
newNode->prev = NULL; // (1)
plist->head = newNode; // (2)
(plist->numOfData)++;
}
데이터 조회
LFirst, LNext는 사실상 차이가 없으며
LPrevious함수는 prev를 통해 이전 노드의 위치를 쉽게 가리킬 수 있다는 점에서 차이가 있다.
int LPrevious(List * plist, Data * pdata)
{
if(plist->cur->prev == NULL)
return FALSE;
plist->cur = plist->cur->prev;
*pdata = plist->cur->data;
return TRUE;
}
원형 연결 리스트의 활용 예제
: 직원 정보 등록 프로그램 (원형 연결리스트 기반)
- 직원 정보 등록 가능
직원 정보는 사번과 이름으로 구성
- 직원 정보를 담을 구조체 정의
구조체를 기반으로 네명의 직원정보를 원형 연결리스트에 저장 (임의 결정, 입력받지 않고 미리 결정해도 됨)
직원 사번은 int형 변수에 담음
원형 연결리스트에는 구조체 변수의 주소 값을 저장
- 직원은 순서대로 돌아가며 당직근무
등록순서대로 당직근무
(A,B,C순 직원등록시 당직근무도 A-B-C-A-B...)
- 직원 이름과 숫자를 이용해 당직자 확인
직원의 이름과 숫자를 인자로 전달받는 함수 정의
- 이 함수는 다음과 같은 직원의 정보 반환
예를 들어 '이수정'과 숫자 7이 전달되면 이수정의 당직근무 7일후
누가 당직근무를 하는지에 대한 정보 반환
'Data Structure' 카테고리의 다른 글
이진 트리의 구현과 순회(Traversal) (0) | 2016.09.12 |
---|---|
Binary Tree (0) | 2016.09.12 |
Circular Linked List (0) | 2016.09.09 |
연결리스트2 (0) | 2016.09.08 |
연결리스트 (0) | 2016.09.05 |