[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 *ppoint, int xpos, int ypos); // 구조체 안에 값 저장
bool ShowPointPos(Point *ppoint); // 구조체 좌표 출력
CompRes PointCompX(Point *ppoint1, Point *ppoint2); // x 좌표 비교
CompRes PointCompY(Point *ppoint1, Point *ppoint2); // y 좌표 비교
CompRes PointComp(Point *ppoint1, Point *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 |
---|