자료구조 연습용

배열에 속성 몇개 붙여서 구조체로 만든뒤 구조체용 함수 몇개 만들어봄
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 *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); // 구조체 안에 있는 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 |
---|