Data Structure

[Data Structure] ArrayList(base on Point)

memobishil.tistory.com/5

 

[Data Structure] ArrayList

자료구조 연습용 배열에 속성 몇개 붙여서 구조체로 만든뒤 구조체용 함수 몇개 만들어봄 ArrayList.h #ifndef __ARRAY_LIST_H__ #define __ARRAY_LIST_H__ #include /* ArrayList 정의 */ #define LIST_LEN 100 t..

memobishil.tistory.com

이전에 구현했던 ArrayList 는 int 형 배열에 값을 넣어서 동작함

이번에는 Point 라는 구조체를 만들고 구조체의 주소값을 배열에 넣어서 동작하도록 함

 

Point.h

#ifndef __POINT_H__
#define __POINT_H__

#include <stdbool.h>

typedef struct _point
{
    int xpos;
    int ypos;
} Point;

// 비교결과용 열거형
typedef enum _compRes {
    yes = 1,
    no = 0,
    error = -1
} CompRes;

// 포인터에 값 저장
bool SetPointPos(Point *ppoint, int xpos, int ypos);

// 포인터 값 출력
bool ShowPointPos(Point *ppoint);

// 포인터 비교
CompRes PointCompX(Point *ppoint1, Point *ppoint2);
CompRes PointCompY(Point *ppoint1, Point *ppoint2);
CompRes PointComp(Point *ppoint1, Point *ppoint2);

#endif

Point 구조체

  • xpos - x 좌표
  • ypos - y 좌표

CompRes 열거형

  • yes - 비교결과 같다
  • no - 비교결과 다르다
  • error - 비교도중 에러발생

Point 구조체 관련 함수들

bool SetPointPos(Point *ppointint xposint ypos); // 구조체 안에 값 저장

bool ShowPointPos(Point *ppoint); // 구조체 좌표 출력

CompRes PointCompX(Point *ppoint1Point *ppoint2); // x 좌표 비교

CompRes PointCompY(Point *ppoint1Point *ppoint2); // y 좌표 비교

CompRes PointComp(Point *ppoint1Point *ppoint2); // x, y 좌표 둘다 비교

 

Point.c

#include <stdio.h>
#include <stdbool.h>
#include "Point.h"
#include "Util.h"

bool SetPointPos(Point *ppoint, int xpos, int ypos)
{
    if (isNull(ppoint))
    {
        return false;
    }

    (ppoint->xpos) = xpos;
	(ppoint->ypos) = ypos;
    
    return true;
}

bool ShowPointPos(Point *ppoint) 
{
    if (isNull(ppoint))
    {
        return false;
    }

    printf("[%d, %d] \n", (ppoint->xpos), (ppoint->ypos));
    return true;
}

CompRes PointCompX(Point *ppoint1, Point *ppoint2)
{
    if (isNull(ppoint1) | isNull(ppoint2))
    {
        return error;
    }

    if ((ppoint1 -> xpos) == (ppoint2 -> xpos))
    {
        return yes;
    }
    else
    {
        return no;
    }
}

CompRes PointCompY(Point *ppoint1, Point *ppoint2)
{
    if (isNull(ppoint1) | isNull(ppoint2))
    {
        return error;
    }

    if ((ppoint1 -> ypos) == (ppoint2 -> ypos))
    {
        return yes;
    }
    else
    {
        return no;
    }
}

CompRes PointComp(Point *ppoint1, Point *ppoint2)
{
    if (isNull(ppoint1) | isNull(ppoint2))
    {
        return error;
    }

    if ((PointCompX(ppoint1, ppoint2)) & PointCompY(ppoint1, ppoint2))
    {
        return yes;
    }
    else
    {
        return no;
    }
}

 

Util.h

#ifndef __UTIL_H__
#define __UTIL_H__

#include <stdbool.h>

bool isNull(void *ptr);

#endif

Util.c

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

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

 

 

ArrayList.h

#ifndef __ARRAY_LIST_H__
#define __ARRAY_LIST_H__

#include <stdbool.h>
#include "Point.h"

/* ArrayList 정의 */
#define LIST_LEN    100
typedef Point *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

기존의 코드와 거이다 같고 LData 의 타입만 Point가 되었다

 

ArrayList.c

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

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);

    if (!isNull(pdata)) 
    {
        *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 <stdlib.h>
#include <stdbool.h>
#include "Point.h"
#include "ArrayList.h"

int main(void) 
{
    ArrayList arrList;
    Point *ppoint;
    bool insertRes;
    bool showRes;

    Point compPoint;
    SetPointPos(&compPoint, 2, 0);
    // ShowPointPos(&compPoint);

    // 초기화
    ArrL_Init(&arrList);

    // 값 입력
    ppoint = (Point *)malloc(sizeof(Point));
    if(!SetPointPos(ppoint, 2, 1))
    {
        printf("set point fail\n");
        return -1;
    }
    insertRes = ArrL_Insert(&arrList, ppoint);
    if (insertRes == false)
    {
        printf("insert fail\n");
        return -1;
    }

    ppoint = (Point *)malloc(sizeof(Point));
    if(!SetPointPos(ppoint, 2, 2))
    {
        printf("set point fail\n");
        return -1;
    }
    insertRes = ArrL_Insert(&arrList, ppoint);
    if (insertRes == false)
    {
        printf("insert fail\n");
        return -1;
    }

    ppoint = (Point *)malloc(sizeof(Point));
    if(!SetPointPos(ppoint, 3, 1))
    {
        printf("set point fail\n");
        return -1;
    }
    insertRes = ArrL_Insert(&arrList, ppoint);
    if (insertRes == false)
    {
        printf("insert fail\n");
        return -1;
    }

    ppoint = (Point *)malloc(sizeof(Point));
    if(!SetPointPos(ppoint, 3, 2))
    {
        printf("set point fail\n");
        return -1;
    }
    insertRes = ArrL_Insert(&arrList, ppoint);
    if (insertRes == false)
    {
        printf("insert fail\n");
        return -1;
    }

    // 데이터 수 출력
    printf("number of data : %d \n", ArrL_Count(&arrList));

    // 데이터 전체 출력
    if(!ArrL_First(&arrList, &ppoint))
    {
        printf("First fail\n");
        return -1;
    }
    else
    {
        showRes = ShowPointPos(ppoint);
        if (showRes == false)
        {
            printf("show fail\n");
            return -1;
        }

        while(ArrL_Next(&arrList, &ppoint))
        {
            showRes = ShowPointPos(ppoint);
            if (showRes == false)
            {
                printf("show fail\n");
                return -1;
            }
        }
    }

    // compPoint 와 x 값이 같은 값을 리스트에서 삭제
    if(!ArrL_First(&arrList, &ppoint))
    {
        printf("First fail\n");
        return -1;
    }
    else
    {
        Point *removed_point;

        if(PointCompX(ppoint, &compPoint) == yes)
        {
            if(!ArrL_Remove(&arrList, &removed_point))
            {
                printf("remove fail\n");
            }
            else
            {
                free(removed_point);
            }
        }
        
        while(ArrL_Next(&arrList, &ppoint))
        {
            if(PointCompX(ppoint, &compPoint) == yes)
            {
                if(!ArrL_Remove(&arrList, &removed_point))
                {
                    printf("remove fail\n");
                }
                else
                {
                    free(removed_point);
                }
            }
            
        }
    }
    
    printf("x = 2 all delete\n");
    // 데이터 전체 출력
    if(!ArrL_First(&arrList, &ppoint))
    {
        printf("First fail\n");
        return -1;
    }
    else
    {
        showRes = ShowPointPos(ppoint);
        if (showRes == false)
        {
            printf("show fail\n");
            return -1;
        }

        while(ArrL_Next(&arrList, &ppoint))
        {
            showRes = ShowPointPos(ppoint);
            if (showRes == false)
            {
                printf("show fail\n");
                return -1;
            }
        }
    }
    
    printf("all done\n");
    return 0;
}

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

[Data Structure] ArrayList  (0) 2020.12.15