삽입, 삭제, 출력..
..미친듯이 집중이 안되는 오늘...이거 이해하는데 도대체 몇일이 걸린건데..? 한심하게 짝이 없음..
일단 자세한 내용은 더보기로..
#include
#include
using namespace std;
struct Node //노드 즉 데이터 및 link자기참조 구조체
{
int data;
Node *link;
};
class List //노드를 구현할 list클래스
{
private:
Node *head;
public:
List() //생성자 노드를 동적할당하고 data값을 초기화한다. 그리고 link의 주소값을 NULL로 초기화
{
head = new Node;
head->link = NULL;
head->data = 0;
}
~List() //소멸자 동적할당을 해제한다.
{
Node *temp; //temp라는 Node 포인터를 생성 왜냐구? head의 주소를 옮겨가면서 삭제해야하니까
while(head!=NULL) //head의 값이 NULL이 아니라면(삭제가 안된상태라면..)
{
temp=head; //우선 시작과 동시에 head가 죽어버려서 다음head->link의 값을 삭제 못하면 안되니까 temp에
//안전하게 보관
head = head->link; //head는 동시에 다음 head->link의 주소로 도망가고
delete temp; //옮겨놨던 기존의 head주소가 복사된 temp는 영원히 삭제(죽였음)
temp = NULL; //죽인놈 무덤만들어줘야하니 NULL로 대입해주고..
}
}
void Insert(int data) //Node를 삽입할 함수 데이터는 int형으로 받는다.
{
Node *new_node; //일단 새로운 노드를 만들고
Node *temp; //head의 주소를 옮겨다녀야할 temp를 생성
new_node = new Node; //새로운 노드에 데이터 및 link를 넣어야하니까 동적할당한다.
if(head->link==NULL) //찾아보자 근데 head->link==NULL이면 처음인 경우다 아까 생성자에서 NULL로 했으니
//즉, 처음삽입하는거라면..
{
head->link = new_node; //좋아 처음이니까 head->link에 new_node주소를 넣는다.
new_node->link = NULL; //그럼 new_node->link에는? NULL을 넣는다.
new_node->data = data; //data값을 new_node->data에 넣어준다.
}
else
{
temp = head; //만약에 위에처럼 처음이 아니라면..마지막이 어딘지 즉, NULL이라고 선언된곳이 어딘지
//찾아가야하니까 temp에 head넣고. 주소가 head에 계속 덮어씌워지면 안되니까 하는행동..
while(temp->link!=NULL) //찾는다 죽어라..temp->link!=NULL
{
temp = temp->link; //찾다가 NULL이라면..빠져나오면서 temp에는 temp->link값이 NULL인 곳으로 된다.
}
temp->link = new_node; //좋아 새로생긴 temp->link에 new_node의 주소를 넣고
new_node->data = data; //데이터 넣고
new_node->link = NULL; //new_node->link를 결국 NULL로 해준다
}
}
void Remove(int data) //삭제해볼까?
{
Node *dele; //삭제할 값의 장소아니 주소
Node *prev; //삭제되는 이전의 link값을 삭제된 곳의 이후의 값으로 변경해주기 위해
dele = head->link; //dele은 간다 뭐로? prev보다 앞선값으로 출발..(head의 다음주소로부터 출발)
prev = head; //prev는 간다 뭐로? 그냥 순수한 head값으로..
while(dele!=NULL)
{
if(dele->data==data) //삭제할 값과 같다면..
{
prev->link = dele->link; //삭제할 값의 노느의 다음주소를..prev다음주소에 대입
delete dele; //삭제할 주소값 삭제..
return;
}
else
{
prev=prev->link; //이건 계속 dele보다 이전값을 유지하고..
dele=dele->link; //이건 dele값을 유지
}
}
}
void Print()//출력해본다.
{
Node *temp=head->link; //최초 head시작지점이 아닌..데이터를 삽입한 부분부터 출력하기 위해
//이런식으로 head->link를 대입함.
while(temp!=NULL) //자기자신의 값이 NULL인지 아닌지 확인..다음 link값이 아니라..
{
cout << "출력" << temp->data << endl;
temp=temp->link;//다음번으로...
}
}
};
int main()
{
List s;
s.Insert(3);
s.Insert(2);
s.Insert(5);
s.Print();
cout << endl;
s.Remove(5);
s.Print();
getch();
return 0;
}
}
최대한..내가 스스로 이해하려고 이런식으로 주석을 달았다....
...그러므로 모두가 이해할 것임......아호..답답하게 ..근데 제대로 이해를 못한 느낌이 듬.
template으로 만들어봐야겠네..