Data Structure

[Data Structure] ArrayList

자료구조 연습용

대충 그려봄

배열에 속성 몇개 붙여서 구조체로 만든뒤 구조체용 함수 몇개 만들어봄

 

ArrayList.h

#ifndef __ARRAY_LIST_H__
#define __ARRAY_LIST_H__

#include <stdbool.h>

/* ArrayList 정의 */
#define LIST_LEN    100
typedef int LData;

typedef struct __ArrayList
{
    /* data */
    LData arr[LIST_LEN];
    int numOfData;
    int curPosition;
} ArrayList;

/* ArrayList 관련 연산들 */
bool ArrL_Init(ArrayList *pArrList);
bool ArrL_Insert(ArrayList *pArrList, LData data);
bool ArrL_First(ArrayList *pArrList, LData *pdata);
bool ArrL_Next(ArrayList *pArrList, LData *pdata);
bool ArrL_Remove(ArrayList *pArrList, LData *pdata);
int ArrL_Count(ArrayList *pArrList);

#endif

ArrayList 구조체

  • arr - 배열
  • numOfData - 데이터 개수
  • curPosition - 현재 가리키고 있는 데이터

bool ArrL_Init(ArrayList *pArrList); // ArrayList 구조체 초기화 함수

bool ArrL_Insert(ArrayList *pArrListLData data); // 구조체 안에 있는 배열에 값 입력

bool ArrL_First(ArrayList *pArrListLData *pdata); // 커서를 첫번째 값으로 옮기고 포인터에 값 저장 

bool ArrL_Next(ArrayList *pArrListLData *pdata); // 커서를 다음값으로 옮기고 포인터에 값 저장

bool ArrL_Remove(ArrayList *pArrListLData *pdata); // 배열에서 값 삭제 후 포인터에 삭제된 값 저장

int ArrL_Count(ArrayList *pArrList); // 구조체 안에 있는 numOfData 값 반환

 

count 제외하고 모든 함수들은 결과값이 함수가 정상적으로 동작했는지를 반환하도록 통일함

값을 반환해야하는 경우는 전달받은 포인터에 값을 저장하도록 함

 

ArrayList.c

#include <stdio.h>
#include <stdbool.h>
#include "ArrayList.h"

bool isNull(void *ptr)
{
    if(ptr == NULL) 
    {
        return true;
    }
    else{
        return false;
    }
}

bool ArrL_Init(ArrayList *pArrList)
{
    // 전달받은 포인터가 제대로 사용할 수 있는지 검사 방법
    if (isNull(pArrList)) 
    {
        return false;
    }

    (pArrList->numOfData) = 0;
	(pArrList->curPosition) = -1;
    return true;
}

bool ArrL_Insert(ArrayList *pArrList, LData data)
{
    if (isNull(pArrList)) 
    {
        return false;
    }

    if((pArrList -> numOfData) > LIST_LEN)
    {
        printf("save limit over\n");
        return false;
    }

    (pArrList -> arr[pArrList -> numOfData]) = data;
    (pArrList -> numOfData) += 1;
    return true;
}

bool ArrL_First(ArrayList *pArrList, LData *pdata)
{
    if (isNull(pArrList) | isNull(pdata)) 
    {
        return false;
    }

    if((pArrList -> numOfData) == 0)
    {
        return false;
    }

    int first = 0;

    (pArrList->curPosition) = first;
    *pdata = (pArrList -> arr[first]);

    return true;
}

bool ArrL_Next(ArrayList *pArrList, LData *pdata)
{
    if (isNull(pArrList) | isNull(pdata)) 
    {
        return false;
    }

    if((pArrList->curPosition) >= (pArrList -> numOfData)-1)
    {
        return false;
    }

    (pArrList -> curPosition) += 1;
    *pdata = (pArrList -> arr[pArrList -> curPosition]);
    return true;
}

bool ArrL_Remove(ArrayList *pArrList, LData *pdata)
{
    if (isNull(pArrList)) 
    {
        return false;
    }

    int rpos = (pArrList -> curPosition);

    *pdata = pArrList -> arr[rpos];

    for(int i=rpos; i<(pArrList -> numOfData)-1; i++)
    {
        (pArrList ->arr[i]) = (pArrList -> arr[i+1]);
    }

    pArrList -> numOfData -= 1;
    pArrList -> curPosition -= 1;

    return true;
}

int ArrL_Count(ArrayList *pArrList) 
{
    if (isNull(pArrList)) 
    {
        return -1;
    }

    return pArrList -> numOfData;
}

상세 구현

 

ArrayListMain.c

#include <stdio.h>
#include <stdbool.h>
#include "ArrayList.h"

int main(void) 
{
    ArrayList arrList;
    LData data;

    // 초기화
    if (ArrL_Init(&arrList) == false) {
        printf("Init fail\n");
        return -1;
    }
    
	// 값 입력
    if (!ArrL_Insert(&arrList, 11)) {
        printf("insert fail\n");
        return -1;
    }
    if (!ArrL_Insert(&arrList, 22)) {
        printf("insert fail\n");
        return -1;
    }
    if (!ArrL_Insert(&arrList, 33)) {
        printf("insert fail\n");
        return -1;
    }
    if (!ArrL_Insert(&arrList, 44)) {
        printf("insert fail\n");
        return -1;
    }

    printf("number of data: %d \n", ArrL_Count(&arrList));

    // 모든 값 출력
    if (!ArrL_First(&arrList, &data))
    {
        printf("First fail\n");
        return -1;
    }
    else
    {
        printf("%d ", data);

        while (ArrL_Next(&arrList, &data))
        {
            printf("%d ", data);
        }   
    }
    printf("\n");

    // 모든값중 22 값 삭제
    LData removed_value;
    if (!ArrL_First(&arrList, &data))
    {
        printf("First fail\n");
        return -1;
    }
    else
    {
        if(data == 22)
        {
            if (!ArrL_Remove(&arrList, &removed_value)) 
            {
                printf("remove fail\n");
            }
            else
            {
                printf("remove %d\n", removed_value);
            }
        }

        while (ArrL_Next(&arrList, &data))
        {
            if(data == 22)
            {
                if (!ArrL_Remove(&arrList, &removed_value)) 
                {
                    printf("remove fail\n");
                }
                else
                {
                    printf("remove %d\n", removed_value);
                }
            }
        }   
    }

    // 삭제후 모든 값 출력
    if (!ArrL_First(&arrList, &data))
    {
        printf("First fail\n");
        return -1;
    }
    else
    {
        printf("%d ", data);

        while (ArrL_Next(&arrList, &data))
        {
            printf("%d ", data);
        }   
    }
    printf("\n");

    printf("all done\n");
    return 0;
}

ArrayList 사용하는 main 함수

 

'Data Structure' 카테고리의 다른 글

[Data Structure] ArrayList(base on Point)  (0) 2020.12.16