Language/C C++

[C 자료구조] 배열 기반의 리스트 구현 하나로 묶기

nineil91 2021. 1. 19. 17:29

배열 기반의 리스트는 생성은 쉬우나 배열의 길이를 처음에 정해야 하기 때문에 크기 변경이 불가능하다는 단점이 있다.


ListMain.c

#include <stdio.h>
#include "ArrayList.h"

int main(void) {

	List list;
	int data;
	ListInit(&list);

	LInsert(&list, 11); LInsert(&list, 11);
	LInsert(&list, 22); LInsert(&list, 22);
	LInsert(&list, 33);

	printf("현재 데이터의 수 : %d \n", LCount(&list));

	if (LFirst(&list, &data)) {
		printf("%d ", data);

		while (LNext(&list, &data)) {
			printf("%d ", data);
		}
	}
	printf("\n\n");

	if (LFirst(&list, &data)) {
		if (data == 22) {
			LRemove(&list);
		}

		while (LNext(&list, &data)) {
			if (data == 22) {
				LRemove(&list);
			}
		}
	}

	printf("현재 데이터의 수 : %d \n", LCount(&list));

	if (LFirst(&list, &data)) {
		printf("%d ", data);

		while (LNext(&list, &data)) {
			printf("%d ", data);
		}
	}
	printf("\n\n");

	system("pause");
	return 0;
}

 

ArrayList.c

#include <stdio.h>
#include "ArrayList.h"

void ListInit(List *plist) {
	(plist->numOfData) = 0;
	(plist->curPosition) = -1;
}

void LInsert(List *plist, LData data) {
	if (plist->numOfData >= LIST_LEN) {
		puts("저장이 불가능합니다.");
		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) {
	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;
	int i;
	LData rdata = plist->arr[rpos];

	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;
}

 

ArrayList.h

#ifndef __ARRAY_LIST_H__
#define __ARRAY_LIST_H__

#define TRUE 1
#define FALSE 0

#define LIST_LEN 100
typedef int LData;

typedef struct __ArrayList {
	LData arr[LIST_LEN];
	int numOfData;
	int curPosition;
} 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

 

+) 아래에는 위의 예제를 이용할 수 있는 예제로 구성하였다. 

 

1. 문제 : 리스트 라이브러리의 활용

리스트 생성 및 초기화 후 정수 1~9저장. 저장된값 순차적 참조하여 합 출력. 2의 배수와 3의배수 삭제. 리스트에 저장된데이터 출력

이 경우 Main 함수만 건들면 된다. ArrayList.c와 ArrayList.h는 배열리스트의 동작을 구현해둔 것이므로 이용하면 된다.

 

ListUseMain.c

#include <stdio.h>
#include "ArrayList.h"

int main(void) {

	List list;
	int data;
	int sum = 0;
	ListInit(&list);

	for (int i = 1; i < 10; i++) {
		LInsert(&list, i);
	}

	if (LFirst(&list, &data)) {
		sum = sum + data;

		while (LNext(&list, &data)) {
			sum = sum + data;
		}
	}
	printf("SUM = %d \n\n", sum);

	if (LFirst(&list, &data)) {
		if (data % 2 == 0 || data % 3 == 0) {
			LRemove(&list);
		}

		while (LNext(&list, &data)) {
			if (data % 2 == 0 || data % 3 == 0) {
				LRemove(&list);
			}
		}
	}

	printf("현재 리스트에 저장된 데이터를 순서대로 출력합니다 : ");

	if (LFirst(&list, &data)) {
		printf("%d ", data);

		while (LNext(&list, &data)) {
			printf("%d ", data);
		}
	}
	printf("\n\n");

	system("pause");
	return 0;
}

'Language > C C++' 카테고리의 다른 글

[C언어] 사용자 정의 자료형  (0) 2021.02.05
[C언어] 배열과 포인터  (0) 2021.02.05
[C] Pointer 개념정리  (0) 2021.02.03
[C 자료구조] 배열이란  (0) 2021.01.20
[C 자료구조] 연결리스트 구현  (0) 2021.01.20