헬창 개발자

이중 연결 리스트 구현 : C언어 본문

자료구조

이중 연결 리스트 구현 : C언어

찬배 2021. 7. 21. 13:22

<설계도>

<코드>

#include <stdio.h>
typedef struct NodeList { //노드 리스트 구조체
	struct NodeList* Llink; // L링크: 이전 노드를 가리킴
	struct NodeList* Rlink; // R링크: 다음 노드를 가리킴
	int data; // 데이터
}Node;

void reverseprint(Node* head) { //노드 역출력 함수
	Node* search;// 헤드가 가리키는 링크를 검색노드에 대입 -> 마지막 노드를 가리키는 것이다.
	printf("데이터 정상 출력\n");
	for (search= head->Llink; search!=head ; search = search->Llink)// Llink를 타면서 정상방향으로 노드를 탐색한다.
	{
		printf("%d\n", search->data); // 해당 데이터 출력
	}
	printf("데이터 역순 출력\n");
	for (search = head->Rlink; search != head; search = search->Rlink) // Rlink를 타면서 역뱡향으로 노드를 탐색한다.
	{
		printf("%d\n", search->data); // 해당 데이터 출력
	}
}
void Insert(Node** head,int data) { // 노드삽입 함수 머리노드, 선행 노드, 데이터값을 받음
	Node* NewNode = (Node*)malloc(sizeof(Node)); // 새로운 노드 동적할당
	NewNode->data = data; // NewNode의 데이터 삽입
	NewNode->Llink = *head; // NewNode의 Llink에 선행노드 대입
	NewNode->Rlink = (*head)->Rlink; // NewNode의 Rlink에 선행노드가 가리키는 노드 대입
	(*head)->Rlink->Llink = NewNode; //  선행노드가 가리키는 노드의 Llink는 NewNode를 가리킴
	(*head)->Rlink = NewNode; // 선행노드의 Rlink는 NewNode 가리킴

}
int main() {

	Node* head = (Node*)malloc(sizeof(Node)); // 머리 노드 생성

	head->Rlink = head; // 초기화
	head->Llink = head; // 초기화

	int num = NULL; // 입력 받을 노드의 개수

	printf("노드의 개수입력: ");
	scanf_s("%d", &num);

	for (int i = 0; i < num; i++) // 노드의 개수 만큼 반복
	{
		int data = NULL; //입력 받을 데이터 값
		printf("노드 #%d 데이터 : ", i + 1);
		scanf_s("%d", &data);
		Insert(&head,data); // 노드 생성 함수

	}
	reverseprint(head); // 노드의 데이터값 역출력 함수 호출
}

<결과 화면>

Comments