티스토리 뷰

 

2021.03.08 - [자료구조 공부일지] - Chapter 03. 배열을 이용한 리스트의 구현

 

Chapter 03. 배열을 이용한 리스트의 구현

주의 사항! 이 글은 제가 직접 공부하는 중에 작성되고 있습니다. 따라서 제가 이해하는 그대로의 내용이 포함됩니다. 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다. 현재 배우는 리

koey.tistory.com

위 글에서 Point 구조체의 주소값을주소 값을 저장하기 위해 배열 기반의 리스트를 사용했습니다. 이번에도 마찬가지로 연결 리스트를 이용해 Point 구조체의 주소 값을 저장할 수 있도록 합니다. 단, 다음의 주어지는 main 함수를 변경하여서는 안 됩니다. 그리고 ArrayList.h와 ArrayList.c 파일을 대신해서 DLinkedList.h와 DLinkedList.c를 사용해 그 결과를 확인해야 합니다. 물론 그 과정에서 typedef 선언 및 헤더 파일 선언의 일부 변경은 있을 수 있습니다.

다음의 주어지는 Point.h, Point.c, main.c를 사용합니다.

//Point.h 헤더 파일로 저장
#ifndef POINT_H
#define POINT_H

typedef struct
{
	int xpos;
	int ypos;
} Point;

void SetPointPos(Point* ppos, int xpos, int ypos);
void ShowPointPos(Point* ppos);
int PointComp(Point* pos1, Point* pos2);

#endif
//Point.c 소스 파일로 저장
#include "Point.h"

void SetPointPos(Point* ppos, int xpos, int ypos)
{
	ppos->xpos = xpos;
	ppos->ypos = ypos;
}
void ShowPointPos(Point* ppos)
{
	printf("[%d, %d]\n", ppos->xpos, ppos->ypos);
}
int PointComp(Point* pos1, Point* pos2)
{
	if (pos1->xpos == pos2->xpos)
	{
		if (pos1->ypos == pos2->ypos) return 0;
		else return 1;
	}
	else
	{
		if (pos1->ypos == pos2->ypos) return 2;
		else return -1;
	}
}
//main.c 소스 파일로 저장
#include <stdio.h>
#include <stdlib.h>
#include "ArrayList.h"

int main(void)
{
	List list;
	Point compPos = {2, 0};
	Point* ppos;
	ListInit(&list);

	//4개의 데이터 저장
	ppos = (Point*)malloc(sizeof(Point));
	SetPointPos(ppos, 2, 1);
	LInsert(&list, ppos);

	ppos = (Point*)malloc(sizeof(Point));
	SetPointPos(ppos, 2, 2);
	LInsert(&list, ppos);

	ppos = (Point*)malloc(sizeof(Point));
	SetPointPos(ppos, 3, 1);
	LInsert(&list, ppos);

	ppos = (Point*)malloc(sizeof(Point));
	SetPointPos(ppos, 3, 2);
	LInsert(&list, ppos);

	//저장된 데이터의 전체 출력
	printf("현재 데이터의 수 : %d\n", LCount(&list));

	if (LFirst(&list, &ppos))
	{
		ShowPointPos(ppos);
		while (LNext(&list, &ppos))
		{
			ShowPointPos(ppos);
		}
	}
	printf("\n\n");

	//xpos가 2인 모든 데이터 삭제
	if (LFirst(&list, &ppos))
	{
		if (PointComp(ppos, &compPos) == 1)
		{
			ppos = LRemove(&list);
			free(ppos);
		}

		while (LNext(&list, &ppos))
		{
			if (PointComp(ppos, &compPos) == 1)
			{
				ppos = LRemove(&list);
				free(ppos);
			}
		}
	}
	
	//삭제 후 남은 데이터 전체 출력
	printf("현재 데이터의 수 : %d\n", LCount(&list));

	if (LFirst(&list, &ppos))
	{
		ShowPointPos(ppos);
		while (LNext(&list, &ppos))
		{
			ShowPointPos(ppos);
		}
	}
	printf("\n\n");

	return 0;
}

제가 작성한 코드는 아래의 '더보기'를 클릭하여 확인할 수 있습니다.

혹시 이해가 되지 않거나 추가 설명이 필요하다면 언제든지 댓글로 물어봐주시기 바랍니다.

더보기

Point.h, Point.c, main.c 파일은 위에서 제시되어 있으므로 DLickedList.h와 DLinkedList.c 파일만 올리겠습니다.

//DLickedList.h 헤더 파일로 저장
#ifndef D_LINKEDLIST_H
#define D_LINKEDLIST_H
#include "Point.h"

#define TRUE 1
#define FALSE 0

typedef Point* LData;

typedef struct Node
{
	LData data;
	struct Node* next;
} Node;

typedef struct LinkedList
{
	Node* head;
	Node* cur;
	Node* before;
	int numOfData;
	int (*comp)(LData d1, LData d2);
} LinkedList;

typedef LinkedList 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);
void SetSortRule(List* plist, int (*comp)(LData d1, LData d2));

#endif
//DLinkedList.c 소스 파일로 저장
#include <stdio.h>
#include <stdlib.h>
#include "DLinkedList.h"

void ListInit(List* plist)
{
	plist->head = (Node*)malloc(sizeof(Node));
	plist->head->next = NULL;
	plist->comp = NULL;
	plist->numOfData = 0;
}
void FInsert(List* plist, LData data)
{
	Node* newNode = (Node*)malloc(sizeof(Node));
	newNode->data = data;

	newNode->next = plist->head->next;
	plist->head->next = newNode;

	plist->numOfData++;
}
void SInsert(List* plist, LData data)
{
	//잠시 후 설명합니다.
}
void LInsert(List* plist, LData data)
{
	if (plist->comp == NULL) FInsert(plist, data);
	else SInsert(plist, data);
}
int LFirst(List* plist, LData* pdata)
{
	if (plist->head->next == NULL) return FALSE;

	plist->before = plist->head;
	plist->cur = plist->head->next;

	*pdata = plist->cur->data;

	return TRUE;
}
int LNext(List* plist, LData* pdata)
{
	if (plist->cur->next == NULL) return FALSE;

	plist->before = plist->cur;
	plist->cur = plist->cur->next;

	*pdata = plist->cur->data;

	return TRUE;
}
LData LRemove(List* plist)
{
	Node* delNode = plist->cur;
	LData delNodeData = delNode->data;

	plist->before->next = plist->cur->next;
	plist->cur = plist->before;

	free(delNode);
	plist->numOfData--;

	return delNodeData;
}
int LCount(List* plist)
{
	return plist->numOfData;
}
void SetSortRule(List* plist, int (*comp)(LData d1, LData d2));

수정한 것은 거의 없습니다.

DLinkedList.h 파일에 Point.h 파일을 인클루드한 것,

main.c 파일에 DLickedList.h 파일을 인클루드한 것,

DLickedList.h 파일의 아래 코드를

typedef int LData;

다음과 같이 수정한 것이 전부 입니다.

typedef Point* LData;

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함