티스토리 뷰
2021.03.08 - [자료구조 공부일지] - Chapter 03. 배열을 이용한 리스트의 구현
위 글에서 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;
'공부 일지 > 자료구조 공부 일지' 카테고리의 다른 글
연습문제 04. 4 정렬의 기준으로 활용되는 함수의 정의 (0) | 2021.03.10 |
---|---|
Chapter 04. 연결 리스트의 정렬 삽입의 구현 (0) | 2021.03.10 |
Chapter 04. 단순 연결 리스트의 ADT(추상 자료형)와 구현(2) (0) | 2021.03.10 |
연습문제04. 2 더미 노드를 적용했을 때의 코드변화 확인하기 (0) | 2021.03.10 |
Chapter 04. 단순 연결 리스트의 ADT(추상 자료형)와 구현(1) (0) | 2021.03.10 |