프로그래밍[Univ]/데이터구조

리스트(배열리스트, 포인터리스트(Linked list), 혼합리스트)

Cloud Travel 2009. 3. 12. 18:16

* 리스트 작업
 ① create > 리스트 만들기
 ② insert > 위치를 지정하고 데이터 넣기
 ③ delete > 데이터 지우기
 ④ retrieve > 데이터 읽어오기

* 리스트 종류
 1. 배열 리스트
  ① 카운트 변수 > 현재 자기가 사용하는 자료 공간(연산의 효율을 올리기 위해서)
  ② 데이터 배열 > 충분히 쓸 수 있는 배열 선언
  ③ 카운트 + 데이터 구조체
  ex ) typedef struct{

           int count;
           int Data[Max];
        }listType;
        void insert(listType *Lptr, int position, int *itemptr);
                                              >배열번호    >Data값
        void delete(listType *Lptr, int positon);
        void Retrieve(listType *Lptr,int position, int *itemptr);
    ※ insert 함수의 알고리즘
     ① 리스트가 꽉 차 있는지 확인(count 값과 Max비교)
     ② position (사이에 빈 칸이 있는가?)
     ③ position에 값이 있는가?
     ④ 데이터를 뒤로 한 칸씩 밀어야 한다.(뒤에서부터 한칸씩 밀어야 데이터 충돌이없다.)
     ⑤ count값 증가
  >>>>> 데이터 삽입시 메모리의 효율이 떨어질 수 있다.
    
  2. 포인터 스트(Linked list)
  ① 데이터 값이 들어갈 멤버
  ② 자신과 똑같은 타입을 가르키는 포인터
   ex) typedef struct{
            int Data;
            node *next;
         }node;


      (1) insert
p는 새로운 공간을 가질 목적으로 생성된 임시노드

p = (node *)malloc(sizeof(node));
p -> Data = 8;
p -> next = temp -> next //  II
temp -> next = p;            // I

> I부터하면 II연결이 불가능하다
따라서 II부터 연결하고, I를 연결한다
     
     


         (2) delete
 p는 없어질 곳의 메모리를 free시킬 목적

p = temp -> next;
temp -> next = temp -> next -> next;
free(p);

 
 3. 포인터 + 구조체
count변수를 사용하여 리스트의 양을 알아내어
프로그램 관리에 편리함을 준다.






 ex) typedef struct{
          int data;
          node *next;
      }node;
      typedef node* Nptr;
      typedef struct{
           int count;
           Nptr next;
      }listType;
      void insert(listType *Lptr, int position, int item);
     > ① position 위치 확인(count보다 크면 error, 1보다 작으면 error)
        ② 공간확보 후 data저장
        ③ position이 1인가를 확인
        ④ temp를 원하는 위치로 이동
        ⑤ count값 증가

*pointer list          vs       Arraylist
 >삽입시 따름 밀림이 없다.             >삽입될 위치를 찾아 가는게 편하다.
   (삽입이 편하다.)                           (찾아가기 편하다.)

@ 상황에 따라 능동적으로 사용하기!!@
@ 상황에 따라 능동적으로 사용하기!!@
@ 상황에 따라 능동적으로 사용하기!!@