이번 프로그램은 사진의 출간년도, 사진의 제목, 사진감독 3가지 데이터를 general list로 구성하는 것이다

non generic으로 진행하며 multi linked list로 구성한다

먼저 multi linked list를 보게 되면 일반적인 linked list와 차이점은

일반적인 linked list가 하나의 key값을 사용하여 oreder를 한다면

multi linked list는 2개 이상 복수개의 key값을 사용하여 oreder를 하는 특징이 있다

예를 들어 이번 코드처럼 3가지 데이터를 가지고 구성한다면 사진의 출간년도 뿐만 아니라

사진의 제목으로도 정렬을 하는 것이다

물리적인 데이터는 일반적인 single linked list와 동일하지만 HeadNode에서 두개의 key값을 선택하여

연결하는 것이다

필요한 구조체들을 선언한다

사진의 정보를 담고있는 SPICTURE 구조체이다

사진의 출간년도 year

사진의 이름 char형 배열으로 arrTitle

사진 감독 이름 동일하게 char형 배열으로 arrDirector

사진의 정보를 담고있는 SPICTURE 포인터

Key를 year로 했을 경우 다음 노드를 가리키기 위하여 자기 자신의 주소를 담는 포인터 yearNode

Key를 title로 했을 경우 다음 노드를 가리키기 위하여 자기 자신의 주소를 담는 포인터 titleNode

SDataNode의 경우 typedef을 구조체 선언보다 앞에서 진행하는데

이유는 구조체 선언에서 구조체 내부에서 자기 자신의 포인터를 사용하기 때문에

구조체보다 앞에서 미리 선언을 하는 전방선언을 한다

만약 하지 않으면 구조체 선언부에서 SDataNode* 에 대한 정보가 없다고 오류가 뜨게 된다

다음은 SHeadNode인데

현재 요소의 개수를 알려주는 count

Key값을 year로 했을 때 첫번 째 노드를 가리키는 yearFront 마지막 노드를 가리키는 yearRear

Key값을 title로 했을 때 첫번 째 노드를 가리키는 titleFront 마지막 노드를 가리키는 titleRear

마지막 preNode같은 경우는 Search 같은 함수를 실행 할 때 찾고자 하는 target data 뿐만 아니라

직전의 데이터 또한 필요한데 이때 저장을 위한 임시 저장소로 사용된다

1image

구현한 구조체인 SHeadNode SDataNode SPICTURE 인데

SPICTURE 에는 각각 임의의 값을 지정해 두었다

SDataNode 의 요소중 picture이 SPICTURE을 가리키는데 주소값으로 연결하면

2image

그 다음 Key값인 year 와 title에 대해서 정렬 된 순서로 연결을 하여야 하는데

year의 경우 오름차순으로 정렬을 하여 8 -> 9 -> 10 순서가 되어야 한다

SHeadNode의 yearFront는 첫번째 노드인 8을 가지고있는 노드를 가리키고

첫번 째 노드의 yearNode는 9을 가지고 있는 노드를

10을 가지고 있는 노드는 마지막 10을 가지고 있는 노드를 가리키고

10을 가지고 있는 노드는 마지막 노드임으로 NULL을 가리킨다

yearRear는 마지막 노드를 가리킨다

3image

Year에 대해서 연결을 했으니 이번엔 Title에 대해서 연결을 해야한다

Title 또한 Year와 같은 방식으로 알파벳 순서로 가장 앞선 apple 노드를 titleFront가 가리키고

apple 노드의 titleNode는 다음 순서인 bear 노드를

bear노드는 마지막 노드인 cat 노드를 가리킨다

cat 노드는 마지막 노드임으로 NULL을 가리키고 동시에 titleRear도 cat노드를 가리키게 된다

4image

'자료구조' 카테고리의 다른 글

스택(Stack) Decimal to Binary  (0) 2020.04.25
스택 (Stack)  (0) 2020.04.24
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int count(int num, int* stack, int* chk);
int* createStack(int n);
void push(int target, int* stack, int* chk);
int pop(int* stack, int* chk);
int isEmptyStack(int* stack, int* chk);
int main(void)
{
    int* stack;
    int* chk = (int*)malloc(sizeof(int));
    chk[0] = -1;
    int n = 10;
    int dec;
    printf("scan\n");
    scanf("%d",&dec);
    
    dec = 10;
    stack = createStack(n);
    int tmp = 0;
    int tmp2 = -1;
    tmp = count(dec, stack, chk);

	tmp2 = pop(stack,chk);
	while(1)
	{
	 if(tmp2 == 0)
	 {
	     return 0;
	 }
	 tmp2 = pop(stack,chk);
	}



    return 0;
}
int count(int num, int* stack, int* chk)
{

    int result = -1;
    int out;
    if(num == 0)
    {
        return 1;
    }

    result = num / 2;
    out = num % 2;
    push(out, stack, chk);
    return count(result, stack, chk);
    
}
int* createStack(int n)
{
    int *stack;
    stack = (int*)malloc(sizeof(int) * n);
    return stack;
}
void push(int target, int* stack, int* chk)
{
    stack[chk[0] + 1] = target;
    chk[0] += 1;
}
int pop(int* stack, int* chk)
{
    if(isEmptyStack(stack, chk) == 1)
    {
        printf("(2)");
        return 0;
    }
    int data;
    printf("%d\t",stack[chk[0]]);
    data = stack[chk[0]];
    chk[0] -= 1;
    return 1;
}
int isEmptyStack(int* stack, int* chk)
{
    if(chk[0] == -1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
    
}

10진법 Decimal을 입력 받아 2진법으로 변환하여 출력한다

입력받은 decimal을 2로 나눈다

몫을 result에 저장하고

나머지를 out에 저장한다

out은 스택에 push를 하고

result는 Recursion을 통해서 함수를 다시 호출하게 된다

스택에 저장된 데이터를 empty상태가 될 때까지 pop한다

예시로 10을 입력했을때 출력이다

'자료구조' 카테고리의 다른 글

Multi Linked List(다중 연결 리스트) -구조체 선언  (0) 2020.05.22
스택 (Stack)  (0) 2020.04.24

Stack

Createstack

char형 데이터를 보관할수 있는 stack 생성

Push

데이터를 추가하고 chk를 1 증가해서 push

Pop

데이터 제거하고 chk 1 감소

Stackpop

스택의 데이터를 제거하지 않고 출력만 한다

Destorypop

스택의 메모리를 해제함으로써 스택을 제거한다

'자료구조' 카테고리의 다른 글

Multi Linked List(다중 연결 리스트) -구조체 선언  (0) 2020.05.22
스택(Stack) Decimal to Binary  (0) 2020.04.25

+ Recent posts