Programing/C- programing

링크드리스트 :: 추가된 리스트 원하는 위치에서 삭제, 찾기, 바꾸기

sosal 2010. 8. 19. 10:31
반응형

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */


LINK_ 에서 단순히 리스트를 추가하고, 출력하는법을 보았습니다.
그럼 원하는 위치에 있는 노드를 어떻게 삭제할까요?

포인터를 이용해 하나하나 각 노드(마디)가 연결되어있으므로,
삭제하기 위해선 삭제되기 전의 노드가 삭제된 노드가 가리키는 위치를 알아야만
삭제를 하더라도 리스트가 깨져버리지 않습니다.

따라서 꼭 노드를 삭제하기 전에, 삭제될 노드 바로 앞의 노드는
삭제될 노드 뒤의 노드를 가리키도록 해줘야 하고,
연결이 끊어진 (삭제될) 노드는 삭제해줘야만 합니다.
만약 연결고리만 끊은 후, 삭제하지 않게 된다면
쓰지는 않지만, 메모리에 올라와있는 노드가 계속 쌓이게 됩니다.
따라서 꼭 삭제하기 전에, 삭제될 노드를 가리키는 포인터를 만들어서
지정시킨 후 꼭 삭제를 해주셔야합니다.

void DeleteNode(int num){             // 매개변수 num은 삭제될 노드의 위치
    node* cur = first;
    node* del;
    if(num<0 || count<num)
        cout<<"숫자를 잘못 입력하셨습니다."<<endl;
    else{
        for(int i=2;i<num;i++){
            cur = cur->next;
        }                                           // 삭제하기 전의 노드까지 도착
        del = cur->next;                     // 삭제하기 위한 노드를 del이 가리킴
        cur->next = cur->next->next;  // 노드 한칸 건너뛰기
        delete del;                              // 건너뛰어진 노드 삭제
        count--;
    }
    return;
}

원하는 위치에 있는 노드를 삭제하는방법을 배웠으니,
원하는 value를 가진 노드를 삭제해봅시다.

일단 원하는 value가 연겨리스트중에 존재 하는지 찾아야겠죠?
그다음에 해당하는 value의 값을 바꿀 수도 있고, 삭제할 수도 있겠습니다.

void find(int val){
    node* cur = first;

    for(int i=0;i<count;i++){
        if(cur->getValue() == val)
            printf("%d번째 노드의 value는 %d입니다.\n",i+1,val);
        cur = cur->next;
    }
}
찾기는 코드가 상당히 간단하게 끝낼 수 있습니다.
여기서 찾은 노드의 값을 바꾸거나 삭제하는일은 일도 아니겠죠.
사용자가 입력한 노드번호의 값을 바꾸도록 해봅시다.


void ChangeNode(int val,int val2){ // val : 노드위치, val2 : 바꾸고자 하는 값
    node* cur = first;
    for(int i=1;i<val;i++){
        cur=cur->next;                    //바꾸고자 하는 노드 도착
    }
    cur->setValue(val2);
    return;
}

LINK_     <- 링크 : 전체소스를 봅시당.