코딩 이야기

[C언어] 단순 연결 리스트를 이용하여 노드 삽입하기

고주망고 2021. 10. 19. 22:42

오늘은 단순 연결 리스트에서 노드를 삽입하는 프로그램을 짜보겠습니다.

 

조건

1. 공백 리스트를 사용하기

2. 첫번째 노드로 삽입하는 함수 구현

3. 가운데 노드로 삽입하는 함수 구현

4. 마지막 노드로 삽입하는 함수 구현


실행 예시

주석을 따라가면서 천천히 따라와 보세요!!

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct ListNode {
	char data[4];
	struct ListNode* link;
}listNode;

typedef struct {
	listNode* head;
}linkedList_h;


linkedList_h* createdLinkedList_h(void) {
	linkedList_h* L;
	L = (linkedList_h*)malloc(sizeof(linkedList_h));
	L->head = NULL;
	return L;
}

void freelinkedList_h(linkedList_h* L) {
	listNode* p;
	while (L->head != NULL) {
		p = L->head;
		L->head = L->head->link;
		free(p);
		p = NULL;
	}
}

void printList(linkedList_h* L) {
	listNode* temp;
	temp = L->head;

	printf(" L -> ");
	while (temp != NULL) {
		printf(" %s", temp->data);
		temp = temp->link;
	}
	printf("\n");
}

//첫번쨰 노드로 넣는 경우, 매개변수: (리스트,넣을 값)
void insertFirstNode(linkedList_h* L,char* x) {
	listNode* newNode;
	newNode = (listNode*)malloc(sizeof(listNode));
	strcpy(newNode->data, x);
	newNode->link = L->head;
	L->head = newNode;
}

//중간 노드로 넣는 경우, 매개변수:(리스트,이전 노드,넣을 값)
void insertMiddleNode(linkedList_h* L, char* pre, char* x) {
	listNode* newNode;
	listNode* findpre;
	newNode = (listNode*)malloc(sizeof(listNode));
	strcpy(newNode->data, x);

	/*이전 노드를 찾는것이 중요함*/
	findpre = L->head;
	while (strcmp(findpre->data,pre)) {
		findpre = findpre->link;
	}

	if (L->head == NULL) {
		newNode->link = NULL;
		L->head = newNode;
	}
	else if (pre == NULL) { //이전 노드 오지않은 경우
		newNode->link = NULL;
		L->head = newNode;
	}
	else  { // 연결 리스트가 공백 리스트가 아니고 pre가 NULL이 아닌 경우
		newNode->link = findpre->link;
		findpre->link = newNode;
	}
}

//마지막 노드로 넣는 경우, 매개변수:(리스트,넣을 값)
void insertLastNode(linkedList_h* L, char* x) {
	listNode* newNode;
	listNode* temp;
	newNode = (listNode*)malloc(sizeof(listNode));
	strcpy(newNode->data, x); //newNode의 data값 설정
	newNode->link = NULL; //마지막 노드이기때문에 NULL값이 들어가야한다.
	if (L->head == NULL) {
		L->head = newNode;
		return;
	}
	else {
		temp = L->head;
		while (temp->link!=NULL) { //마지막 노드 찾기
			temp = temp->link;
		}
		temp->link = newNode;
	}
}


void main() {
	linkedList_h* L;
	L = createdLinkedList_h();
	printf("공백 리스트 생성\n");
	printList(L);

	printf("리스트에 [수]노드 삽입하기\n");
	insertFirstNode(L, "수");
	printList(L);

	printf("리스트 마지막에 [금]노드 삽입하기\n");
	insertLastNode(L, "금");
	printList(L);

	printf("리스트 [수] 뒤에 [목]노드 삽입하기\n");
	insertMiddleNode(L, "수", "목");
	printList(L);

	printf("리스트 처음에 [월]노드 삽입하기\n");
	insertFirstNode(L, "월");
	printList(L);

	printf("리스트 공간 해제\n");
	freelinkedList_h(L);
	printList(L);
}

가장 중요한 부분이라고하면 역시

 

findpre = L->head;
while (strcmp(findpre->data,pre)) {
findpre = findpre->link;
}

이 부분이라고 생각합니다.

 

포인터를 제일 첫번째를 가르키게 한다음 strcmp을 이용하여 값이 같은지 하나하나씩 비교해주면 되는겁니다.