미누에요
[자료구조] 윤성우의 열혈 자료구조 04-1 문제풀이 본문
728x90
반응형
SMALL
문제
예제 LinkedRead.c 에 익숙해지는 가장 빠르고도 흥미로운 길은 예제를 조금 수정해 보는 것이다.
따라서 예제를 조금 수정해 볼 기회를 제공하고자 한다. 예제 수정을 위한 주제는 다음과 같다.
- 새 노드를 연결 리스트의 꼬리가 아닌 머리에 추가한다.
LinkedRead.c
#include <stdio.h>
#include <stdlib.h>
typedef struct _node
{
int data;
struct _node *next;
} Node;
int main(void)
{
Node *head = NULL;
Node *tail = NULL;
Node *cur = NULL;
Node *newNode = NULL;
int readData;
while (1)
{
printf("자연수 입력 : ");
scanf("%d", &readData);
if (readData < 1)
break;
newNode = (Node *)malloc(sizeof(Node));
newNode->data = readData;
newNode->next = NULL;
if (head == NULL)
head = newNode;
else
tail->next = newNode;
tail = newNode;
}
printf("\n");
printf("입력받은 데이터의 전체출력!\n");
if (head == NULL)
{
printf("저장된 자연수가 존재하지 않습니다.\n");
}
else
{
cur = head;
printf("%d ", cur->data);
while (cur->next != NULL)
{
cur = cur->next;
printf("%d ", cur->data);
}
}
printf("\n\n");
if (head == NULL)
{
return 0;
}
else
{
Node *delNode = head;
Node *delNextNode = head->next;
printf("%d을(를) 삭제합니다. \n", head->data);
free(delNode);
while (delNextNode != NULL)
{
delNode = delNextNode;
delNextNode = delNextNode->next;
printf("%d을(를) 삭제합니다. \n", delNode->data);
free(delNode);
}
}
return 0;
}
예제에서는 노드를 머리가 아닌 꼬리에 추가하였다. 따라서 3 -> 2 -> 7 -> 8의 순으로 연결되어 있는 리스트에 5를 추가로 삽입하면 3 -> 2 -> 7 -> 8 -> 5의 순으로 저장이 된다.
그런데 이번에는 다음 순으로 저장이 되도록 예제를 변경해보고자 한다.
5 -> 8 -> 7 -> 2 -> 3
즉 연결리스트의 머리에 노드가 추가되도록 예제를 변경하는 것이다. 이 문제가 쉬워 보이더라도 그림을 그려서 머리에 노드가 추가되는 과정을 완전히 정리한 다음에 코드로 옮기기 바란다. 그리고 이를 습관화하기 바란다.
정답
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *link;
} Node;
int main(void)
{
Node *head = NULL;
Node *tail = NULL;
Node *newnode = NULL;
int inputdata = 0;
Node *cur = NULL;
while (1)
{
printf("데이터를 입력하세요 (0 이하의 수를 입력하여 종료) : ");
scanf("%d", &inputdata);
if (inputdata < 1)
{
break;
}
newnode = (Node *)malloc(sizeof(Node));
newnode->data = inputdata;
if (head == NULL)
{
head = newnode;
}
else
{
newnode->link = head;
head = newnode;
}
}
printf("\n");
printf("입력받은 데이터의 전체출력!\n");
if (head == NULL)
{
printf("저장된 자연수가 존재하지 않습니다.\n");
}
else
{
cur = head;
printf("%d ", cur->data);
while (cur->link != NULL)
{
cur = cur->link;
printf("%d ", cur->data);
}
}
printf("\n\n");
int select = 0;
printf("추가로 입력하시겠습니까 ? \n1. 네 2. 아니오 : ");
scanf("%d", &select);
if (select == 1)
{
while (1)
{
printf("데이터를 입력하세요 (0 이하의 수를 입력하여 종료) : ");
scanf("%d", &inputdata);
if (inputdata < 1)
{
break;
}
newnode = (Node *)malloc(sizeof(Node));
newnode->data = inputdata;
if (head == NULL)
{
head = newnode;
}
else
{
newnode->link = head;
head = newnode;
}
}
}
printf("입력받은 데이터의 전체출력!\n");
if (head == NULL)
{
printf("저장된 자연수가 존재하지 않습니다.\n");
}
else
{
cur = head;
printf("%d ", cur->data);
while (cur->link != NULL)
{
cur = cur->link;
printf("%d ", cur->data);
}
}
printf("\n\n");
return 0;
}
코드가 상당히 중복된다. 함수로 따로 만드는 것이 좋을 거 같다.
결과
728x90
반응형
LIST
'자료구조' 카테고리의 다른 글
[자료구조] 원형 연결 리스트(Circular Linked List) 구현 - C (1) | 2024.05.01 |
---|---|
[자료구조] 단일 연결 리스트(Singly Linked List) 노드 삭제(Delete) 구현 - C (0) | 2024.03.30 |
[자료구조] 단일 연결 리스트(Singly Linked List) 입력, 출력함수 구현 - C (0) | 2024.03.30 |
[자료구조] 연결 리스트(Linked List) (0) | 2024.03.30 |
[자료구조] 윤성우의 열혈 자료구조 ch 04. 연결리스트 2 04-2 문제풀이 (0) | 2024.03.25 |