#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
typedef struct node
{
int value;
struct node* next;
}node;
node* head = NULL;
void insertFrontNode(int data);
void displayNode(void);
void removeFrontNode(void);
void removeAllNode(void);
int getNodeCount(void);
node* searchNode(int target);
void removeTailNode(void);
int removeTarget(int target);
int removekthNode(int k);
void insertTailNode(int data);
node* createNode(int data);
void insertKthNode(int data, int k);
void insertSortedNode(int data);
int main(void)
{
while (1)
{
system("clear");
printf("\n\n\t *** 단일 연결 리스트(Singly Linked List)\n\n");
printf("=======================================================\n");
printf("1. 맨 앞 삽입\n");
printf("2. 맨 뒤 삽입\n");
printf("3. 앞에서부터 N번째 삽입\n");
printf("4. 오름차순 정렬 삽입\n");
printf("=======================================================\n");
printf("5. 맨 앞 삭제\n");
printf("6. 맨 뒤 삭제\n");
printf("7. 전체 노드 삭제\n");
printf("8. 특정 값 삭제\n");
printf("9. 앞에서부터 N번째 삭제\n");
printf("=======================================================\n");
printf("10. 단일 연결 리스트 출력(노드 순회)\n");
printf("11. 노드의 개수 구하기\n");
printf("12. 노드 검색\n");
printf(" 0. 프로그램 종료\n");
printf("=======================================================\n");
printf("\n메뉴 선택: ");
int choice;
scanf("%d", &choice);
int data, k;
switch (choice)
{
case 1:
printf("\n\n정수 입력: ");
scanf("%d", &data);
insertFrontNode(data);
break;
case 2:
printf("\n\n삽입할 정수 입력: ");
scanf("%d", &data);
insertTailNode(data);
break;
case 3:
printf("\n\n삽입할 정수 입력: ");
scanf("%d", &data);
printf("몇 번째 삽입하시겠습니까? ");
scanf("%d", &k);
insertKthNode(data, k);
break;
case 4:
printf("\n\n삽입할 정수 입력: ");
scanf("%d", &data);
insertSortedNode(data);
break;
case 5:
removeFrontNode();
break;
case 6:
removeTailNode();
break;
case 7:
removeAllNode();
break;
case 8:
printf("\n\n삭제할 정수 입력: ");
scanf("%d", &data);
if(removeTarget(data))
{
printf("\n\n\t\t삭제를 성공했습니다.\n");
}
else
{
printf("\n\n\t\t삭제를 실패했습니다.\n");
}
break;
case 9:
printf("\n\n몇 번째 노드를 삭제하시겠습니꺼? ");
scanf("%d", &data);
if (removekthNode(data))
{
printf("\n\n\t\t삭제를 성공했습니다.\n");
}
else
{
printf("\n\n\t\t삭제를 실패했습니다.\n");
}
break;
case 10:
displayNode();
break;
case 11:
printf("\n\n\t\t생성된 노드의 개수는 %d개 입니다.\n", getNodeCount());
break;
case 12:
printf("\n\n검색할 정수 입력: ");
scanf("%d", &data);
if (searchNode(data) == NULL)
{
printf("\n\n\t\t검색한 노드는 존재하지 않습니다.\n");
}
else
{
printf("\n\n\t\t검색한 노드는 존재합니다.");
}
break;
case 0:
removeAllNode();
return 0;
}
printf("\n\n\t\t");
system("read");
}
return 0;
}
void insertFrontNode(int data)
{
node* newNode = createNode(data);
if (head == NULL)
{
head = newNode;
printf("\n\n\t\t노드 삽입(첫 노드로 연결)\n");
return;
}
newNode->next = head;
head = newNode;
printf("\n\n\t\t노드 맨 앞 삽입(일반적인 경우)\n");
}
void displayNode(void)
{
node* curNode = head;
if(head == NULL)
{
printf("\n\n\t\t 연결 리스트가 구성되지 않아 출력할 데이터가 없습니다.");
return;
}
printf("\n\nSingly Linked List: ");
while (curNode->next != NULL)
{
printf("%d -> ", curNode->value);
curNode = curNode->next;
}
printf("%d\n", curNode->value);
}
void removeFrontNode(void)
{
node* delNode = head;
if (head == NULL)
{
printf("\n\n\t\t연결 리스트가 구성되지 않아 삭제할 데이터가 없습니다.");
return;
}
head = head->next;
free(delNode);
printf("\n\n\t\t첫 노드를 제거했습니다.\n");
}
void removeAllNode(void)
{
node* delNode;
if(head == NULL)
{
printf("\n\n\t\t연결 리스트가 구성 되지 않아 삭제할 데이터가 없습니다.");
return;
}
while(head != NULL)
{
delNode = head;
head = head->next;
free(delNode);
}
printf("\n\n\t\t모든 노드를 제거했습니다.");
}
int getNodeCount(void)
{
if(head == 0)
return 0;
int count = 0;
node* curNode = head;
while (curNode != NULL)
{
++count;
curNode = curNode->next;
}
return count;
}
node* searchNode(int target)
{
if (head == NULL)
return NULL;
node* curNode = head;
while (curNode != NULL)
{
if(target == curNode->value)
{
return curNode;
}
curNode = curNode->next;
}
return NULL;
}
void removeTailNode(void)
{
if (head == NULL)
{
printf("\n\n\t\tcase1.연결 리스트가 구성되지 않아 삭제할 데이터가 없습니다.");
return;
}
if (head->next == NULL)
{
free(head);
head = NULL;
printf("\n\n\t\tcase2. 노드가 한 개인 경우 제거\n");
return;
}
node* curNode = head;
while (curNode->next->next != NULL)
{
curNode = curNode->next;
}
free(curNode->next);
curNode->next = NULL;
printf("\n\n\t\tcase3. 마지막 노드를 제거\n");
}
int removeTarget(int target)
{
if (head == NULL)
{
return 0;
}
node* delNode;
node* prevNode;
if(head->value == target)
{
delNode = head;
head = head->next;
free(delNode);
printf("\n\n\t\tcase1. 삭제할 노드가 첫 노드인 경우 제거\n");
return 1;
}
prevNode = delNode = head;
while(delNode->next != NULL)
{
delNode = delNode->next;
if(delNode->value == target)
{
prevNode->next = delNode->next;
free(delNode);
printf("\n\n\t\tcase2. 일반적인 경우 특정 값 제거\n");
return 1;
}
prevNode = prevNode->next;
}
return 0;
}
int removekthNode(int k)
{
if (head == NULL)
{
printf("\n\n\t\t생성된 노드가 없어서 삭제할수 없습니다.\n");
return 0;
}
int nodeCount = getNodeCount();
if( k <= 0 || k > nodeCount)
{
printf("\n\n\t\t입력 값이 범위를 벗어났습니다.\n");
printf("\t\t1~%d 사이의 정수를 입력해주세요.\n", nodeCount);
return 0;
}
node* delNode;
node* prevNode;
if (k == 1)
{
delNode = head;
head = head->next;
free(delNode);
printf("\n\n\t\tcase1. 첫 노드를 제거\n");
return 1;
}
prevNode = head;
int i;
for (i = 0; i < k - 2; i ++)
{
prevNode = prevNode->next;
}
delNode = prevNode->next;
prevNode->next = delNode->next;
free(delNode);
printf("\n\n\t\tcase2. 일반적인 경우 k번째 노드 제거\n");
return 1;
}
void insertTailNode(int data)
{
node* newNode = createNode(data);
node* curNode;
curNode = head;
if (head == NULL)
{
head = newNode;
printf("\n\n\t\t노드 삽입(첫 노드로 연결)\n");
return;
}
while (curNode->next != NULL)
{
curNode = curNode->next;
}
curNode->next = newNode;
printf("\n\n\t\t 노드 맨 뒤 삽입(일반적인 경우)\n");
}
node* createNode(int data)
{
node* newNode;
newNode = (node*)malloc(sizeof(node));
newNode->value = data;
newNode->next = NULL;
return newNode;
}
void insertKthNode(int data, int k)
{
int nodeCount = getNodeCount();
if(k < 1 || k > nodeCount + 1)
{
printf("\n\n\t\t전달 된 값은 범위를 벗어난 값으로 추가할 수 없습니다.\n");
printf("\t\t1 ~ %d 범위를 수를 입력해 주세요.\n", nodeCount + 1);
return;
}
node* newNode = createNode(data);
if (head == NULL)
{
head = newNode;
printf("\n\n\t\tcase1. 노드 삽입(첫 노드로 연결)\n");
return;
}
if (k == 1)
{
newNode->next = head;
head = newNode;
printf("\n\n\t\tcase2. k == 1인 경우 맨 앞 삽입\n");
return;
}
node* curNode = head;
int i;
for(i = 0; i < k - 2; i++)
{
curNode = curNode->next;
}
newNode->next = curNode->next;
curNode->next = newNode;
printf("\n\n\t\tcase3. k번째 노드 삽입(일반적인 경우)\n");
}
void insertSortedNode(int data)
{
node* newNode = createNode(data);
if (head == NULL)
{
head = newNode;
printf("\n\n\t\tcase1. 노드 삽입(첫 노드로 연결)/n");
return;
}
if(head->value > newNode->value)
{
newNode->next = head;
head = newNode;
printf("\n\n\t\tcase2. 가장 작은 값 삽입으로 맨 앞 추가\n");
return;
}
node* prevNode = head;
node* curNode = head;
while(curNode->next != NULL)
{
curNode = curNode->next;
if(curNode->value > newNode->value)
{
prevNode->next = newNode;
newNode->next = curNode;
printf("\n\n\t\tcase3. 일반적인 경우 중간 삽입\n");
return;
}
prevNode = prevNode->next;
}
curNode->next = newNode;
printf("\n\n\t\tcase4. 가장 큰 값 추가로 맨 뒤 삽입\n");
}