1부터 9까지 입력해서 전부 다 합한 거 출력하고, 2의 배수나 3의 배수인 경우 삭제한다.
이후, 조회한다.
1. 헤더 파일
#pragma once
#ifndef __ARRAY_LIST_H__
#define __ARRAY_LIST_H__
#define TRUE 1
#define FALSE 0
/*** ArrayList의 정의 ****/
#define LIST_LEN 100
typedef int LData;
typedef struct __ArrayList
{
LData arr[LIST_LEN];
int numOfData;
int curPosition;
} ArrayList;
/*** ArrayList와 관련된 연산들 ****/
typedef ArrayList List;
void ListInit(List * plist);
void LInsert(List * plist, LData data);
int LFirst(List * plist, LData * pdata);
int LNext(List * plist, LData * pdata);
LData LRemove(List * plist);
int LCount(List * plist);
#endif
2. 소스 파일
#pragma once
#ifndef __ARRAY_LIST_H__
#define __ARRAY_LIST_H__
#define TRUE 1
#define FALSE 0
/*** ArrayList의 정의 ****/
#define LIST_LEN 100
typedef int LData;
typedef struct __ArrayList
{
LData arr[LIST_LEN];
int numOfData;
int curPosition;
} ArrayList;
/*** ArrayList와 관련된 연산들 ****/
typedef ArrayList List;
void ListInit(List * plist);
void LInsert(List * plist, LData data);
int LFirst(List * plist, LData * pdata);
int LNext(List * plist, LData * pdata);
LData LRemove(List * plist);
int LCount(List * plist);
#endif
3. 메인 함수
#include <stdio.h>
#include "ArrayList.h"
int main() {
List list;
List* plist = &list;
int data, sum=0;
ListInit(plist);
printf("\n\n▶데이터 저장\n\n");
for (int i = 1; i < 10; i++) {
LInsert(plist, i+1);
}
printf("\n\n▶조회 및 총합 출력\n\n"); //int data를 통해 &data만 참조해서 data 값 안변하도록
if (LFirst(plist, &data)) {
printf(" 첫 데이터 %d\n", data);
sum += data;
while (LNext(plist, &data)) {
printf(" 그 다음 데이터%d\n", data);
sum += data;
}
}
printf("총합은 %d", sum);
printf("\n\n▶삭제\n\n");
if (LFirst(plist, &data)) {
if (data % 2 == 0 || data % 3 == 0) {
LRemove(plist);
}
}
while (LNext(plist, &data)) {
if (data % 2 == 0 || data % 3 == 0) {
LRemove(plist);
}
}
printf("\n\n▶재조회 및 총합 출력\n\n"); //int data를 통해 &data만 참조해서 data 값 안변하도록
if (LFirst(plist, &data)) {
printf(" 첫 데이터 %d\n", data);
}
while (LNext(plist, &data)) {
printf(" 그 다음 데이터%d\n", data);
}
return 0;
}
NP 1) 구조체명 List 에서 배열, 배열유효수(numOfdata), 현재배열요소(Cur) 선언한 구조체변수명 list를 참조해 arr 배열 안에 데이터를 저장한다. 이때, 나는 포인터변수 plist를 만들어 List * 포인터 plist에 list의 주소값을 담고 모든 함수에서 plist를 매개변수로 프로그램을 실행시켰는데 사실 plist 포인터 따로 만들지않고 그냥 list의 주소값인 *&list를 함수의 매개변수로 넣어도 된다.
HP 1) 본 프로그램은 헤더파일과 배열기반리스트를 정의한 함수만 보고 (ADT만 보고) 자료구조가 어떤 요소로 어떻게 구성되어있는지 신경쓰지 않은 채 메인 함수에서 해당 자료구조를 이용한 연산 기능을 활용하는 것이 목적이다. 따라서 직접 구조체에 접근하여 참조하는 코드를 지양한다.
HP 2) 헤더파일에서 프로토타입 int LFirst (List* plist, LData* pdata); 선언 시 data가 필요한 이유는 메인함수에서 int data 선언후 LFirst (plist, &data)로 활용하여 data의 주소로 접근해 LFirst나 Lnext의 배열요소가 가진 데이터를 반환하고 출력하는 데에 활용할 수 있기 때문이다.
'자료구조' 카테고리의 다른 글
[이실직고 day 4] 배열기반 연결리스트 마무리 (0) | 2021.08.11 |
---|---|
이실직고 day 3 배열리스트 (0) | 2021.08.10 |
[ADT 2] 배열 기반 리스트로 보는 ADT (0) | 2021.08.05 |
[ADT] ADT 정의, 예시 (0) | 2021.08.05 |