c언어를 활용한 원형 연결 리스트

임승혁·2021년 2월 9일
0
#include <stdio.h>
#include <stdlib.h>

typedef int element;
typedef struct ListNode {
	element data;
	struct ListNode* link;
}ListNode;

void printList(ListNode* head) {
	ListNode* p;

	if (head == NULL) return;
	p = head->link;
	do {
		printf("%d->", p->data);
		p = p->link;
	} while (p != head);
	printf("%d->", p->data);
}

ListNode* insertFirst(ListNode* head, element data) {
	ListNode* node = (ListNode*)malloc(sizeof(ListNode));
	node->data = data;
	if (head == NULL) {
		head = node;
		node->link = head;
	}
	else {
		node->link = head->link;
		head->link = node;
	}
	return head;
}
ListNode* insertLast(ListNode* head, element data) {
	ListNode* node = (ListNode*)malloc(sizeof(ListNode));
	node->data = data;
	if (head == NULL) {
		head = node;
		node->link = head;
	}
	else {
		node->link = head->link;
		head->link = node;
		head = node;
	}
	return head;
}

int main(void) {
	ListNode* head = NULL;

	head = insertLast(head, 20);
	head = insertLast(head, 30);
	head = insertLast(head, 40);
	head = insertFirst(head, 10);
	printList(head);
	return 0;
}

코드 설명

(1) head라는 ListNode포인터를 생성

(2) head를 insertLast,insertFirst라는 함수로 데이터와 함께 보낸다
-> 함수에서 return 값으로 노드를 받는다.

(insertLast함수)

head가 NULL일 때, 동적생성한 노드에 data를 넣고 link가 자기
자신을 가리키게 한다.(원형 연결리스트이기 때문에)

head가 NULL이 아닐 때, head의 마지막에 노드를 이어붙이는 함수
이므로 동적생성한 노드의 link가 head의 link를 가리키게 한다.
(여기서 head는 마지막 노드를 가리킨다.)

(insertFirst함수)

head가 NULL일 때, insertLast함수와 같다.

head가 NULL이 아닐 때, insertFirst함수와 같고, head포인터를
마지막에 삽입된 노드를 가리키도록 한다.

(3) head의 모든 노드들을 출력한다.

profile
한성공대생

0개의 댓글