Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/Algorithm] 간단한 양방향 List 자료구조의 구현 본문

Programming/Algorithm

[Programming/Algorithm] 간단한 양방향 List 자료구조의 구현

scii 2021. 1. 24. 03:30

main.c
0.00MB
List.h
0.00MB

 

List.c
0.00MB

 

다음은 List 사용의 main.c 파일의 내용이다.

#include <stdio.h>
#include <stdlib.h>
#include "List.h"

/* clinet */
void* AllocData(double data){
    double* p = (double*)malloc(sizeof(double));
    *p = data;
    return p;
}

void FreeData(void* p){
    free(p);
}

void PrintPrevious(LIST* lst){
    printf("prev: ");
    for(ResetTailPos(lst); HasPrevious(lst); Previous(lst)){
        printf("%lf ", *(double*)GetItem(lst));
    }
    puts("");
}

void PrintNext(LIST* lst){
    printf("next: ");
    for(ResetHeadPos(lst); HasNext(lst); Next(lst)){
        printf("%lf ", *(double*)GetItem(lst));
    }
    puts("");
}


int main(int argc, const char * argv[]) {
    LIST lst;
    
    Initialize(&lst);
    
    AddHead(&lst, AllocData(10.5));
    AddHead(&lst, AllocData(3.14));
    AddHead(&lst, AllocData(5.55));
    
    PrintPrevious(&lst);
    
    for(ResetHeadPos(&lst); HasNext(&lst); Next(&lst)){
        FreeData(GetItem(&lst));
    }

    Uninitialize(&lst);

    return 0;
}

/* 결과
prev: 10.500000 3.140000 5.550000 
*/

다음은 위에서 만든 리스트 파일을 이용하여 Queue를 구현하는 예제이다.

#include <stdio.h>
#include <stdlib.h>
#include "List.h"

#pragma warning(disable: 4996)

typedef struct _queue {
    LIST lst;
} Q;

void* AllocData(int data) {
    int* p = (int*)malloc(sizeof(int));
    *p = data;
    return p;
}

void FreeData(void* p) {
    free(p);
}

void InitializeQueue(Q* q) {
    Initialize(&q->lst);
}

void UnInitializeQueue(Q* q) {
    Uninitialize(&q->lst);
}

void AddQueue(Q* q, int data) {
    AddHead(&q->lst, AllocData(data));
}

int DeleteQueue(Q* q) {
    int* pdata;
    int data;
    ResetTailPos(&q->lst);
    pdata = (int*)GetItem(&q->lst);

    data = *pdata;
    FreeData(pdata);
    Remove(&q->lst);
    return data;
}

int main() {
    Q q;
    InitializeQueue(&q);

    AddQueue(&q, 10);
    AddQueue(&q, 20);
    AddQueue(&q, 30);

    printf("%d\n", DeleteQueue(&q));
    printf("%d\n", DeleteQueue(&q));
    printf("%d\n", DeleteQueue(&q));

    UnInitializeQueue(&q);

    return 0;
}

/* 결과
10
20
30
*/

여기서 주의할 점은 정수를 저장하기 위한 동적(heap) 메모리는 Queue가 할당하므로 이 메모리의 삭제 또한 Queue가 담당해야 한다.

Comments