์๋ฃ๊ตฌ์กฐ 5๊ฐ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ค์ต
- October 28, 2018
- 4 minute read
์ฌํด ์ด ๋ถํฐ ํ๋ก๊ทธ๋๋ฐ์ ๊ณต๋ถ ์ค์ด๋ค. ์๋ฐ๊ธฐ์๋ ์ด์ฌํ ๊ณต๋ถํ๋ค๊ฐ, ์ง๊ธ์ ์ง๋๊ฐ ๋งค์ฐ ๋๋์ง๋ง..
๊ทธ ์ค์ ์ฌ๋ฐ๊ฒ ๊ณต๋ถํ๊ณ ์๋ ์๋ฃ๊ตฌ์กฐ์์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ฐฐ์ด ๊ฑธ ์์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์ง ๋ดค๋ค.
์๋ฃ๊ตฌ์กฐ ์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ์ต๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฏธ๋ฆฌ ์ ํ์ง ์๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ํ ๋นํ์ฌ ํ๋ก๊ทธ๋จ ์คํ ์ค์ ๋ ธ๋(Node)๊ฐ ์ถ๊ฐ๋ ๋ ๋ง๋ค ๊ณต๊ฐ์ ํ๋ณดํ๋ค. ๋ ธ๋(Node)๋ ๋ฐ์ดํฐ์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฅดํค๋ ๋งํฌ์ ํ ๋ฉ์ด๋ฆฌ๋ก, ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์์ ๋ฌผ๋ฆฌ์ ์ธ ์์์ ์๊ด์์ด ๋ฐ์ดํฐ ๊ฐ์ ๋ ผ๋ฆฌ์ ์ธ ์์๋ฅผ ๋ง๋ค ์ ์๋ ์ฅ์ ์ด ์๋ค.
์ค๋ช
์ ์ด์ฏคํ๊ณ , ๊ทธ๋์ ํ๋ก๊ทธ๋จ์ ์ด๋ ๋ค.
๊ฐ์ ๋ด์ฉ์ ์์ฉํ์ฌ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ง์ง๋ง์ ๋ฐ์ดํฐ ์ฝ์
/์ญ์ , ํน์ ์์น์ ์ฝ์
/์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ค.
//
// main.c
// DataStructures_05_02
//
// Created by Jinjoo on 2018. 10. 27..
// Copyright ยฉ 2018๋
Jinjoo. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h> //๋์ ํ ๋น์ ์ํด ํ์
/* ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋
ธ๋ ๊ตฌ์กฐ ์ ์ */
typedef struct ListNode {
int data;
struct ListNode* link;
}listNode;
/* ๋ฆฌ์คํธ์ ํค๋(first) ๋
ธ๋ ๊ตฌ์กฐ ์ ์ */
typedef struct {
listNode* head;
}headNode;
headNode* createLinkedList_h(void){ //ํค๋ ๋
ธ๋๋ฅผ ํ๋ ์์ฑํ์ฌ ๋ฐํ
headNode* H; //ํค๋ ๋
ธ๋๋ฅผ ๊ฐ๋ฅดํค๋ ํฌ์ธํฐ ๋ณ์ H ์์ฑ
H = (headNode*)malloc(sizeof(headNode)); //ํฌ์ธํฐ ๋ณ์ ์ฌ์ด์ฆ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋น๋ฐ๊ณ , ๊ทธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฃผ์๋ฅผ ๋ฐํ
H->head = NULL; //๊ฐ๋ฅดํฌ ๋
ธ๋๊ฐ ์์ผ๋ NULL๊ฐ ์ ์ฅ
return H;
}
/* ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋
ธ๋ ์ฝ์
*/
void addNode(headNode* H, int x){
listNode* newNode;
listNode* lastNode;
newNode = (listNode*)malloc(sizeof(listNode));
newNode->data = x; //๋ฐ์ดํฐ๋ก x์
๋ ฅ๋ฐ์
newNode->link = NULL; //์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ง์ง๋ง์ ์ถ๊ฐ๋๋ ๋
ธ๋์ด๋ฏ๋ก link๋ NULL์ ๊ฐ๋ฅดํด
if(H->head==NULL){ //ํค๋ ๋
ธ๋๊ฐ NULL์ ๊ฐ๋ฆฌํค๊ณ ์์ผ๋ฉด
H->head = newNode; //ํค๋ ๋
ธ๋์ ์๋ก ์์ฑํ ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํจ
return;
}//ํค๋ ๋
ธ๋๊ฐ NULL์ํ๊ฐ ์๋๋ฉด,
lastNode = H->head;
while(lastNode->link != NULL)lastNode = lastNode->link; //NULL์ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ง์ง๋ง ๋
ธ๋๋ฅผ ์ฐพ์
lastNode->link = newNode; //์๋ก์ด ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ค
}
/* ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋
ธ๋ ์ญ์ */
void deleteNode(headNode* H){
listNode* prevNode;
listNode* delNode;
if(H->head->link == NULL){
free(H->head);
H->head = NULL;
return;
}else{
prevNode = H->head;
delNode = H->head->link;
while(delNode->link != NULL){ //link๊ฐ NULL๊ฐ์ ๊ฐ์ง, ๋ง์ง๋ง ๋
ธ๋๋ฅผ ์ฐพ์
prevNode = delNode;
delNode = delNode->link;
}
free(delNode); //ํด์ ํ๋ค
prevNode->link = NULL; //๊ทธ๋ฆฌ๊ณ ๊ทธ ์์ ์๋ ๋
ธ๋์ link๋ฅผ NULL๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
}
}
/* ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ํน์ ๋
ธ๋ ๋ค์์ ์ฝ์
*/
void additNode(headNode* H, int itdata, int *x){
listNode* prevNode;
prevNode = H->head;
while(prevNode->data != itdata)
{
if(prevNode->link == NULL){
printf("[์ ํํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์์ด, ์ถ๊ฐํ์ง ๋ชปํ์ต๋๋ค.]\n\n");
return;
}
else{
prevNode = prevNode->link;
}
}
printf("[์ ํํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ต๋๋ค! ์ด ๋ค์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.]\n\n");
*x+=100;
listNode* newNode;
newNode = (listNode*)malloc(sizeof(listNode));
newNode->data = *x;
newNode->link = NULL;
newNode->link = prevNode->link;
prevNode->link = newNode;
return;
}
/* ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ํน์ ๋
ธ๋ ์ญ์ */
void deleteitNode(headNode* H, int itdata){
listNode* delNode;
listNode* prevNode;
if(H->head->link == NULL && H->head->data == itdata){
free(H->head);
H->head = NULL;
return;
}else if(H->head->link != NULL && H->head->data == itdata){
delNode = H->head;
H->head = H->head->link;
free(delNode);
return;
}else{
delNode = H->head;
prevNode = delNode;
while(delNode->data != itdata)
{
if(delNode->link == NULL && delNode->data != itdata){
printf("[์ ํํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์์ด, ์ญ์ ํ์ง ๋ชปํ์ต๋๋ค.]\n\n");
return;
}
else{
prevNode = delNode;
delNode = delNode->link;
}
}
printf("[์ ํํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ต๋๋ค! ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํฉ๋๋ค.]\n\n");
prevNode->link = delNode->link;
free(delNode);
return;
}
}
/* ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ถ๋ ฅ */
void printList(headNode* H){
listNode* p;
if(H->head == NULL){
printf("== ์ฐ๊ฒฐ ๋ฆฌ์คํธ: ๋ฐ์ดํฐ ์์ ==\n\n");
}else{
printf("== ์ฐ๊ฒฐ ๋ฆฌ์คํธ: ");
p = H->head;
while(p != NULL){
printf("%d", p->data);
p = p->link;
if(p != NULL){
printf("->");
}
}
printf(" ==\n\n");
}
}
int main() {
headNode* L;
L = createLinkedList_h();
int select_function=0, nodeData=0, selectNodeData;
printf("์๋ฃ๊ตฌ์กฐ 5์ฅ ์ค์ต : ์ฐ๊ฒฐ ๋ฆฌ์คํธ developed by Perlpark\n");
printf("============================================================\n");
printf("์ํํ ๋์์ ์ ํํด ์ฃผ์ธ์.\nโป์ซ์ ์ธ ๋ฌธ์๋ฅผ ์
๋ ฅํ๋ฉด ์ค๋ฅ๊ฐ ๋๋ฉฐ, ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.\n");
printf("============================================================\n");
printf("0:๋ฐ์ดํฐ ์ฝ์
| 1:๋ฐ์ดํฐ ์ญ์ | 2:ํน์ ์์น์ ๋ฐ์ดํฐ ์ฝ์
| 3:ํน์ ๋ฐ์ดํฐ ์ญ์ | 9:์ข
๋ฃ\n\n");
while(select_function != 9){
printf("๋์ ์ ํ: ");
scanf("%d", &select_function);
switch (select_function) {
case 0:
nodeData+=100;
addNode(L, nodeData);
printf("\n[์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ง์ง๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.]\n\n");
printList(L);
break;
case 1:
if(L->head == NULL){
printf("\n[๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. ๋ฐ์ดํฐ ์ฝ์
๋ถํฐ ํด์ฃผ์ธ์.]\n\n");
}else{
deleteNode(L);
printf("\n[์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ง์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ์ต๋๋ค.]\n\n");
printList(L);
}
break;
case 2:
if(L->head == NULL){
printf("\n[๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. ๋ฐ์ดํฐ ์ฝ์
๋ถํฐ ํด์ฃผ์ธ์.]\n\n");
}else{
printf("\n[์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ํน์ ์์น์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ๋ค์ ์ถ๊ฐํ ๊น์?]\n\n");
printf("๋ฐ์ดํฐ ์ ํ: ");
scanf("%d", &selectNodeData);
printf("\n");
additNode(L, selectNodeData, &nodeData);
printList(L);
}
break;
case 3:
if(L->head == NULL){
printf("\n[๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. ๋ฐ์ดํฐ ์ฝ์
๋ถํฐ ํด์ฃผ์ธ์.]\n\n");
}else{
printf("\n[์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ญ์ ํฉ๋๋ค. ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๊น์?]\n\n");
printf("๋ฐ์ดํฐ ์ ํ: ");
scanf("%d", &selectNodeData);
printf("\n");
deleteitNode(L, selectNodeData);
printList(L);
}
break;
case 9:
printf("\n[์ข
๋ฃํฉ๋๋ค.]\n");
break;
default:
printf("\n[์ ํจํ์ง ์์ ๋ช
๋ น์
๋๋ค. ๋ค๋ฅธ ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.]\n");
break;
}
}
}
** ์ฐธ๊ณ ๋ธ๋ก๊ทธ
์ดํด๊ฐ ์๋๊ฑฐ๋ ์ค๋ฅ๊ฐ ์๊ฒจ์ ๋งํ๋ ๋ถ๋ถ์ ์๋ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๋ค.
https://blog.naver.com/simonmatthew/221304432762
https://massy2002.blog.me/12433974