c언어 단순연결리스트 삭제함수

c언어 단순연결리스트 삭제함수

작성일 2015.02.19댓글 1건
    게시물 수정 , 삭제는 로그인 필요

c언어 단순 연결 리스트 삭제 함수 만들기 입니다


위에 구조체로 노드는 만든는건 걍 생략할게요 어차피 다 아실테니


//phead:헤드 포인터에 대한 포인터

p:삭제될 노드의 선행 노드

removed:삭제될 노드


void removed_node(Listnode **phead,List node *p,Listnode *removed)

{

 if(p==NULL)

  *phead=(*phead)->link;

else

  p->link=removde->link;

free(removed);
}


질문드릴게 세가지인데요.


1,일단 (*phead)->link 이걸 해석하면 *(*phead).link 이렇게 되는건가요 이중포인터라 헷갈리네요

 의미도 모르겠고


2.p==NULL 일 경우 연결 리스트의 첫번쨰 노드를 삭제하는데 그냥 암기로 외우긴했는데

논리적으로 이해가안가네요 삽입의경우도 그렇고 마지막 노드뒤에다가 삽입하거나 삭제해야한다고 생각하는데...

 *phead=(*phead)->link  이부분 *phead=removed->link 로는 안되는건가요?


3.그리고 phead는 헤드포인터에 대한 포인터인데 그 이유는 함수안에서 헤드포인터를 변경해야하기 떄문이라는데 이것도 이해가 안가네요;;;



죄송하게;; 질문들이 좀 정리가 안되는데 ㅠ_ㅠ 일단 질문 해봅니다







#c언어 단순연결리스트

profile_image 익명 작성일 -


프로그램에서

    removed_node(&gplnHead, NULL,  pnode); // 님의 프로그램은 이렇게 첫번째를 지정한 것임.

       if (*phead == removed)       // 첫번째와 헤더가 같으면
           *phead=(*phead)->link;  // 첫번째를 이렇게 삭제해도 됨.
 이런경우      
           *phead=removed->link;  ===  *phead=(*phead)->link;
 와 같은 코드가 됩니다.

그러나 main  예에서
removed_node(&gplnHead, NULL,  pnode3);  // 3번재 로드를 지정하면
 
       *phead != removed 

이렇게 되죠. 이런 경우 다음과 같이 하면 문제가 되죠.
           *phead=(*phead)->link;

이런 경우 코드 내에서 탐색과정을 추가 했습니다.

정리하면
질문하신 내용은
removed_node(&gplnHead, NULL,  pnode);
처럼 p가 NULL이면 반드시 첫번째 pnode가 노드가 되어야 합니다.
이런식의 규칙을 설정하고 짜여진 코드 입니다.


1. 기본적으로 포인터이므로 ->를 사용하는것이 정석인데요.
    *phead=(*phead)->link;
   static 변수로 사용한다면
           *phead = (**phead).link;
           *phead = (*(*phead)).link;
 이런 방식도 존재 하내요.

3. phead는 헤더가 있어야 처음 노드를 쉽게 알수 있죠. 위의 메인 처럼 간단하다면 변수가 쉽게 보입니다만, 복잡해 지면 헤더를 찾는 것이 쉽지 않죠.
pnode가 처음 만들어 진것이므로 이것을 초기 노드로 알수는 있느나 함수가 복잡해 지면 그게 그리 쉽지 않습니다. 따라서 Listnode *gplnHead = NULL;를 만들고 이 변수를 사용하면 됩니다.

Listnode *gplnHead = NULL;
Listnode *getHeader()
{
   return  *gplnHead;
}

int main(int argc, char* argv[])
{
    Listnode *pnode;

    pnode = new_node(1);
    insert_node(&gplnHead, NULL, pnode);

    Listnode *pnode2;
    pnode2 = new_node(2);
    insert_node(&gplnHead, pnode, pnode2);
    insert_node(&gplnHead, NULL, new_node(3));

    void printList(Listnode *pnode);
    printList(getHeader());
    // ...
}

void printList(Listnode *pnode)
{
    for (;pnode;pnode = pnode->link) {
        printf("[0x%08x] %d", pnode,  pnode->data);
        if (pnode->link)
           printf(" -> ");
    }
}
실행결과 :
[0x008a9df0] 1 -> [0x008a9e38] 2 -> [0x008a9e80] 3

c언어 단순연결리스트 삭제함수

c언어 단순 연결 리스트 삭제 함수 만들기 입니다 위에 구조체로 노드는 만든는건 걍 생략할게요 어차피 다 아실테니 //phead:헤드...

단순 연결 리스트삭제함수 이해

... 이므로, 연결 리스트의 첫번째( head )를 지우는 함수 입니다. 첫번째( head )를... 위 소스는 이를 해결하기 위해서, 삭제 대상인 첫번째를 removed 로 기억해...

c언어 단순연결리스트 삭제 구현

... break; } } } 대충코딩햇습니다 일단 저도 공부하는입장에서 리스트 삭제할때 free를 정확히어디서 어떻게 넣어야 될지 몰라서 일단...

c언어 단순연결리스트

제가 단순연결리스트를 코딩해봤는데 합하는 함수리스트 추가함수는 정상적으로 작동하는데 삭제함수가 작동을...