Programming/Data Structure and Algorithm

윤성우의 열혈자료구조 문제 03-1

fishersheep 2021. 12. 25. 16:03
반응형
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1		//TRUE는 1로 정의
#define FALSE 0		//FALSE는 0으로 정의
#define LIST_LEN 100	//리스트의길이는 100으로 정의
typedef int LData;		//int를 LData로 정의

typedef struct __ArrayList		//구조체 ArrayList 정의
{
	LData arr[LIST_LEN];
	int numOfData;
	int curPosition;
}ArrayList;

typedef ArrayList List;

void ListInit(List* plist) {		//리스트 초기화함수
	plist->numOfData = 0;
	plist->curPosition = -1;
}

void LInsert(List* plist, LData data) {		//리스트의 값을 삽입하는 함수
	if (plist->numOfData >= LIST_LEN) {
		printf("저장불가능합니다.");
		return;
	}
	plist->arr[plist->numOfData] = data;
	plist->numOfData++;
}

int LFirst(List* plist, LData* pdata) {		//첫번째 데이터 참조를 위한 함수
	if (plist->numOfData == 0) {
		return FALSE;
	}

	plist->curPosition = 0;
	*pdata = plist->arr[0];
	return TRUE;
}

int LNext(List* plist, LData* pdata) {		//LFirst 이후의 데이터를 참조하기 위한 함수
	if (plist->curPosition >= plist->numOfData - 1)
		return FALSE;

	plist->curPosition++;
	*pdata = plist->arr[plist->curPosition];

	return TRUE;
}

LData LRemove(List* plist) {		//데이터를 삭제하는 함수
	int rpos = plist->curPosition;
	int num = plist->numOfData;
	LData rdata = plist->arr[rpos];
	int i;
	for (i = rpos; i < num - 1; i++) {
		plist->arr[i] = plist->arr[i + 1];
	}

	plist->numOfData--;
	plist->curPosition--;

	return rdata;
}

int LCount(List* plist) {		//데이터의 개수를 반환하는 함수
	return plist->numOfData;
}


int main()		
{
	List list;		//리스트선언
	int sum = 0;	//데이터들의 합을 위한 변수
	int data;		//데이터참조를 위한 변수
	ListInit(&list);
	
	for (int i = 1; i < 10; i++)		//1부터9를 삽입하기 위한 반복문
	{
		LInsert(&list, i);
	}

	if (LFirst(&list, &data)) {		//sum에 데이터의 값을 더하기 위한 조건문
		sum+=data;
			while(LNext(&list,&data))
				sum+=data;
	}

	printf("리스트출력:");

	if (LFirst(&list, &data)) {		//리스트의 현재 상태를 출력하는 조건문
		printf("%d ", data);
		while (LNext(&list, &data))
			printf("%d ", data);
	}

	printf("\nsum = %d\n", sum);

	if (LFirst(&list, &data)) {		//리스트에서 2와 3의 배수를 제거하는 조건문
		if (data % 2 == 0 || data % 3 == 0)
			LRemove(&list);
		while (LNext(&list, &data)) {
			if (data % 2 == 0 || data % 3 ==0)
				LRemove(&list);
		}	
	}

	printf("2와 3의 배수를 제거한 리스트 결과:");

	if (LFirst(&list, &data)) {		//리스트의 현재 상태를 출력하는 조건문
		printf("%d ", data);
		while (LNext(&list, &data))
			printf("%d ", data);
	}
	return 0;
}

ArrayList.h 및 ArrayList.c 의 내용들을 모두 추가하였습니다.

반응형