본문 바로가기

자료구조

[이실직고 day 2] problem 3-1

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의 배열요소가 가진 데이터를 반환하고 출력하는 데에 활용할 수 있기 때문이다.