e. 자료구조 및 알고리즘

C언어 단방향 연결리스트 (LinkedList)

로봇쟁이 2019. 6. 27. 13:53
#include <stdio.h>
#include <stdlib.h>

typedef struct _list 
{
	struct __node *cur;			// 현재 커서 위치
	struct __node *head;		// 머리 위치
	struct __node *tail;		// 꼬리 위치
} linkedlist;

typedef struct __node 
{
	int data;					// 노드 데이터
	struct __node *next;		// 해당 노드의 NEXT 노드
} node;

void createNode(linkedlist *L, int tdata)			// 노드 생성
{
	node *newNode = (node *)malloc(sizeof(node));	// 새로운 노드 메모리 확보
	newNode->data = tdata;			// 새로운 노드 데이터 삽입
	newNode->next = NULL;			// 새로운 노드의 NEXT 노드는 NULL
	if (L->head == NULL && L->tail == NULL)			// 기존 노드의 head와 tail이 NULL이면 
	{
		L->head = L->tail = newNode;	// 새로운노드가 head 및 tail이 됨
	}
	else								// 기존 노드의 head 또는 tail에 데이터가 있으면
	{
		L->tail->next = newNode;		// 기존 노드의 tail의 다음 노드는 새로운 노드
		L->tail = newNode;				// 기존 노드의 tail은 새로운 노드
	}
}

void deleteLastNode(linkedlist *L)			// 마지막 노드 삭제 함수
{
	node *p = L->head;				// 노드의 첫번째가 p노드
	while (p->next->next != NULL)	p = p->next;	// p노드의 다다음 이 Null이 될때까지 p를 다음으로 이동
	p->next = p->next->next;		// p노드의 다음번째 즉 마지막 노드를 Null로 변경 (p->next->next는 null)
	L->tail = p;					// tail은 p노드로 변경
}

void printNodes(linkedlist *L)			// 노드 출력 함수
{
	node *p = L->head;
	printf("[");
	while (p != NULL)
	{
		printf("%d  ", p->data);
		p = p->next;
	}
	printf("]\n");
}

int main(void)
{
	linkedlist *L = (linkedlist *)malloc(sizeof(linkedlist));
	L->cur = NULL;
	L->head = NULL;
	L->tail = NULL;

	createNode(L, 1);
	createNode(L, 2);
	createNode(L, 3);
	deleteLastNode(L);
	createNode(L, 5);
	deleteLastNode(L);
	createNode(L, 6);

	printNodes(L);
}

C언어로 작성된 단방향 연결리스트 코드 및 주석설명 :D

반응형