티스토리 뷰
저번 리스트에이어 이번엔 연결기반의 리스트.
메모리를 동적할당받아사용하는 이유는 배열의 메모리 특성이 정적이기때문!(필자는 단점이라고 말했지만 난 장점도 될수있다고 생각한다.)
개념적 설명을 하기위해 간단한 코드를 소개하며 동작과정을 개요적으로 설명했다. 노드가 노드끼리 연결되는것이 약간 목걸이 같다고 생각됐다.
자료구조를 제대로 공부하려면 가급적 세가지 순서를 지켜야된다고 한다.
1.자료구조의 ADT 정의
2.정의한 ADT의 구현
3.구현이 완료된 자료구조의 활용
역시 가장 프로그래밍을 체계적으로 설명해주는 저자라고 생각한다. 이분을 우리나라 소프트웨어 교육과정 생성에 동참시켜드려야된다고 생각한다.
문제를 풀어봤다.
예제의 리스트는 전통적인 리스트답게 꼬리에꼬리를 무는 방식으로 요소를 추가하지만 문제는 머리에서 머리로 추가되게 만들라고 했다. 그래서 만들어봤다.
#include <stdio.h>
#include <stdlib.h>
typedef struct _node {
int data;
struct _node *next;
}Node;
int main()
{
Node * head = NULL;
Node * tail = NULL;
Node * cur = NULL;
Node * newNode = NULL;
int readData;
while (1)
{
printf("자연수 입력:");
scanf_s("%d", &readData);
if (readData < 1)
break;
newNode = (Node *)malloc(sizeof(Node));
newNode->data = readData;
newNode->next = NULL;
if (tail == NULL)
tail = newNode;
else
newNode->next = head;
head = newNode;
}
printf("\n");
printf("입력 받은 데이터의 전체출력!\n");
if (head == NULL)
{
printf("저장된 자연수가 존재하지 않습니다.");
}
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;
}
정상적으로 작동했고 문제 풀이를 봤더니 저자는 좀 다르게 했다.
if(head==NULL)
{
head=newNode;
tail=newNode;
}
else
{
newNode->next=head;
head=newNode;
}
이렇게 해놨다. 물론 같은 이야기지만 내 코드가 좀더 읽음과 동시에 삽입구조가 머리속에 잘 그려지지 않나 싶다. 물론 내가 쓴 코드라 그렇겠지만,,
다음 시간에 가서야 본격적으로 연결리스트의 ADT에대해 알아보려는 듯 하다.