자료구조 : 단순 연결 리스트 2

ROK·2022년 10월 12일
0

열혈 자료구조

목록 보기
8/30

단순 연결 리스트

앞에서 단순 연결 리스트 1-1에서 단순 연결 리스트를 구현해보았지만
중간에 잠시 넘기고 간 부분이 있다.

정렬 기준을 제공하는 부분인데 그 부분을 추가한 단순 연결리스트

단순 연결 리스트 1-1

앞서 헤더파일은 그대로 사용하면 된다.

소스파일과 메인파일에서 조금의 변화가 있다

정렬 기준 설정

우선 연결리스트에서 정렬 기준을 설정하는 부분에 대해서 ARABOJA

정렬 기준 설정 동작 순서
우선 SetSortRule 함수가 호출되면 리스트 구조체 comp에 등록하고, SInsert 함수 내에서 comp에 등록된 정렬 기준을 근거로 데이터를 정렬해 저장한다

우선 소스파일에서 연결 리스트의 정렬 기준이 되는 함수를 등록하는 SetSortRule함수가 있다.

SetSortRule

void SetSortRule(List * plist, int (*comp)(LData d1, LData d2)) {
	plist->comp = comp;
}

그리고 SInsert 함수
comp를 사용하는 부분이 낯설다. 하지만 전체적인 틀은 지금까지 데이터를 추가하던 방식과 다르지 않다.

SInsert

void SInsert(List * plist, LData data) {
	Node * newNode = (Node*)malloc(sizeof(Node));
    Node * pred = plist->head;
    
    newNode->data = data;
    
    // 새 노드가 들어갈 위치를 찾기 위한 반복문
    while (pred->next != NULL && plist->comp(data, pred->next->data) != 0) {
    	pred = pred->next;
	}
    
    newNode->next = pred->next;
    pred->next = newNode;
    
    (plist->numOfData)++;
}

위 코드에서 주목할 점은 반복문이다

while (pred->next != NULL && plist->comp(data, pred->next->data) != 0) {
	pred = pred->next;
}

조건 중 하나인 comp(data, pred->next->data) != 0은 포인터 함수로 이 포인터 함수에 대한 함수를 정의해야 한다

int sortFunc(int d1, int d2) {
	if(d1 < d2) {
    	return 0;
	} else {
    	return 1;
	}
}    

메인파일

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


// 정렬 기준 함수 추가
int SortFunc(int d1, int d2)
{
   if (d1 < d2)
   {
      return 0;
   }
   else
   {
      return 1;
   }
}

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

   // 정렬 기준 등록
   SetSortRule(&list, SortFunc);		// 추가된 코드

   // 데이터 5개 저장
   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");

   // 숫자 22 검색해서 모두 삭제
   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");

   return 0;
}
profile
하루에 집중하자

0개의 댓글