IT/Programming

기본 자료 구조(1-1) - 링크드 리스트

Hotman 2010. 12. 2. 02:20
/* Single Linked List */
 
#include 
#include 

typedef int ElementType;

// 노드 선언
typedef struct tagNode
{
      ElementType Data;
      struct tagNod* NextNode;
}


// 노드 생성
Node* SLL_CreateNode(ElementType NewData)
{
        Node* NewNode = (Node*)malloc(sizeof(Node));

        NewNode->Data = NewData; // 데이터 저장
        NewNode->NextNode = NULL; // 다음 노드에 대한 포인터 NULL 저장

        return NewNode;    // 노드의 주소 반환
  }
 // 노드 소멸
  void SLL_DestroyNode(Node* Node)
  {
         free(Node);     // 노드의 힙 할당 해제
  }
  // 노드 추가
  void SLL_AppendNode(Node** Head, Node* NewNode){
         if((*Head) == NULL){          // 헤드 노드가 NULL이라면 새로운 노드가 Head
         *Head = NULL;
         }else{                              // 테일을 찾아 NewNode를 연결한다.
         Node* Tail = (*Head);
         while(Tail->NextNode != NULL){
               Tail = Tail->NextNode;
         }
         Tail->NextNode = NewNode;
        }
  }
  // 노드 삽입
  void SLL_InsertAfter(Node* Current, Node* NewNode){
         NewNode->NextNode = Current->NextNode;
         Current->NextNode = NewNode;
  }

  void SLL_InsertNewHead(Node** Head, Node* NewHead){
         if(Head == NULL){
                (*Head) = NewHead;
         }else{
                NewHead->NextNode = (*Head);
                (*Head) = NewHead;
         }
  }
  // 노드 제거
  void SLL_RemoveNode(Node** Head, Node* Remove){
         if(*Head == Remove){        // 제거 대상 노드가 Head 이면
                *Head = Remove->NextNode; // Head의 NextNode를 Head로 지정
         }else{
                Node* Current = *Head;
                while(Current != NULL && Current->NextNode != Remove){
                Current = Current->NextNode; // 제거 대상 앞의 노드를 찾아서
          }

         if(Current != NULL){
                Current->NextNode = Remove->NextNode; // 그 NextNode를 제거 대상 노드
         }           // 의 다음 노드로 지정
  }
   // 노드 탐색
  Node* SLL_GetNodeAt(Node* Head, int Location){
         Node* Current = Head;

         while(Current != NULL && (--Location) >= 0){
                Current = Current->NextNode;
         }
         return Current;
  }

   // 노드 수 세기
  int SLL_GetNodeCount(Node* Head){
         int Count = 0;
         Node* Current = Head;

         while(Current != NULL){
                Current = Current->NextNode;
                Count++;
         }
         return Count;
  }