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; }