[자료구조] 3.2 배열을 이용한 리스트의 구현 (4)

Updated:

배열을 이용한 리스트의 구현 (4)


배열 기반 리스트

배열 기반 리스트 초기화

  • 실제 초기화 대상은 구조체 변수의 멤버

      typedef struct __ArrayList {
          LData arr[LIST_LEN]; // 데이터 저장위치
          int numOfData; // 저장된 데이터 수
          int curPosition; // 마지막 참조 위치 정보
      } ArrayList;
    
      void ListInit(List * plist) {
      // 구조체 변수가 선언되고 그 주솟값이 인자로 전달
          (plist->numOfData) = 0; 
          // plist 주소가 가리키는 구조체의 변수 numOfData 멤버를 초기화 
          (plist->curPosition) = -1; 
          // LFirst 함수와 LNext 함수에서 사용
          // -1은 아무런 위치도 참조하지 않았음을 의미
      }
    

배열 기반 리스트 삽입

```
typedef struct __ArrayList {
	LData arr[LIST_LEN]; /
	int numOfData; // 초기화(0)
	int curPosition; // 초기화(-1)
} ArrayList;

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) {
		// 저장된 데이터가 하나도 없다면 : false
			return FALSE;
	}


	(plist->curPosition) = 0; 
	// 참조 위치 초기화
	// 첫 번째 데이터 참조

	*pdata = plist->arr[0]; 
	// pdata가 가리키는 공간에 데이터 저장
	return TRUE;
}

int LNext(List * plist, LData * pdata) {
// 그 다음 데이터 참조
	if(plist->curPosition >= (plist->numOfData)-1) {
	// 더 이상 참조할 데이터가 없다면 : false	
		return FALSE;
	}

	(plist->curPosition)++; 
	// 현재 위치 1 증가
	*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; 
          // 삭제 데이터 반환 : 삭제되는 데이터는 반환과정으로 돌려줘야함
      
      }
      

참고

Leave a comment