링크드리스트에서 노드추가는 잘되는데 , 모든 노드를 삭제하는 부분에서 세그멘테이션 오류가 뜹니다;
아래부분은 링크드리스트 함수들이 모여있는 부분입니다.
gcc에서 컴파일하고 있었고요,,
그런데 , 링크드리스트로 메모리에 올리고 나서 , 노드들의 내용 출력은 잘되는데,
마지막에 , 프로그램 종료하기전에 KillAllBookNode(); 함수를 호출하여
모든 노드들을 지워주려하면 "세그멘테이션 오류" 가 뜹니다;;
일단 링크드리스트 부분에 무슨 잘못이 있지는 않는지 좀 봐주시면 감사하겠습니다 ㅎ;
고수님들의 많은 지적 부탁드립니다
#include "linkedbook.h"
// 링크드리스트에 새로운 노드를 추가하기 위한 함수.
void AddBookNode ( BOOKNODE *pHead , BOOKNODE node )
{
BOOKNODE *pFind;
BOOKNODE *pNew;
// 새로운 노드를 동적할당.
pNew = (BOOKNODE *) malloc ( sizeof(BOOKNODE) );
// 동적할당된 노드에 인자로 받은 노드의 데이터를 대입.
*pNew = node;
// 탐색을 위한 포인터를 head에 위치한다.
pFind = pHead;
// next가 NULL일 때까지 계속 다음 노드를 따라간다.
while ( pFind->next != NULL )
{
pFind = pFind->next;
}
// pFind가 맨 마지막 노드를 가리키게 되면 ,
// pFind의 다음노드가 새롭게 할당된 노드를 가리키게 하고,
pFind->next = pNew;
// 새 노드는 NULL을 가리키게 한다.
pNew->next = NULL;
}
// 총 노드의 갯수를 새서 반환하는 함수.
int CountBookNode ( BOOKNODE *pHead )
{
BOOKNODE *pFind;
int nNode = 0;
pFind = pHead->next;
while ( pFind != NULL )
{
nNode++;
pFind = pFind->next;
}
return nNode;
}
/*
void DeleteBookNode ( BOOKNODE *pHead , BOOKNODE node )
{
BOOKNODE *pCurrent;
BOOKNODE *pPrev;
char szTarget[NAME_MAX];
pCurrent = pHead->next; // 현재 노드를 head노드 다음노드를 가르키게함.
pPrev = pHead; // 현재노드의 전 노드를 head노드를 가리키게 함.
while ( pCurrent != NULL )
{
if ( strcmp ( node.m_szPatiCode , pCurrent->m_szPatiCode ) == 0
&& strcmp ( node.m_szDescCode , pCurrent->m_szDescCode ) == 0 )
{
pPrev->next = pCurrent->next;
free ( pCurrent ); // 노드를 메모리에서 삭제한다.
break;
}
pCurrent = pCurrent->next;
pPrev = pPrev->next;
}
}
*/
// 프로그램이 끝날 때 , 메모리에 올라가있는 모든 노드를 삭제하는 함수.
void KillAllBookNode ( BOOKNODE *pHead )
{
BOOKNODE *pCurrent;
BOOKNODE *pPrev;
pCurrent = pHead->next;
pPrev = pHead;
while ( pCurrent != NULL )
{
pPrev = pPrev->next;
pCurrent = pCurrent->next;
free ( pPrev );
}
}
***메인함수부분입니다!!**
#include "common.h"
#include "bookproc.h"
#include "parsedata.h"
#include "linkedbook.h"
#include "linkedmagazine.h"
#include "linkednews.h"
#include "linkedstudent.h"
#include "dataloadmain.h"
#include "main.h"
int main ( void )
{
BOOK *pBookHead;
MAGAZINE *pMagazineHead;
NEWS *pNewsHead;
BOOK book;
pBookHead = (BOOK *) malloc ( sizeof(BOOK) );
pMagazineHead = (MAGAZINE *) malloc ( sizeof(MAGAZINE) );
pNewsHead = (NEWS *) malloc ( sizeof(NEWS) );
printf ( "INPUT TEMP data : " );
scanf ( "%s %s %s %s"
, book.m_szCode
, book.m_szName
, book.m_szAuthor
, book.m_szPublisher
);
AddBookNode ( pBookHead , book );
AddBookNode ( pBookHead , book );
AddBookNode ( pBookHead , book );
AddBookNode ( pBookHead , book );
AddBookNode ( pBookHead , book );
AddBookNode ( pBookHead , book );
KillAllBookNode ( pBookHead );
return 0;
}
우선, 소스를
우선, 소스를 올리실땐
로 감싸서 올려주시구요.
Dobule linked list군요. 그렇다면, 지우실때, 맨 마지막 포인트로 이동하시고, current를 free하시는게 좋습니다.
그리고, 특정한 포인터를 하나 만드셔서, 항상 끝을 지정하게 하는 방법도 좋습니다.
대충 생각나는대로 적은 코드라 오류가 있을겁니다. 뭐, 결론은 마지막 노드를 기억하고 있고, 마지막 노드부터 역순으로 free 하는것이 편할 수도 있다라는겁니다.
時日也放聲大哭
時日也放聲大哭
아마도 지운 포인터를 참조해서 생기는게 아닐까요?
void KillAllBookNode ( BOOKNODE *pHead )
{
BOOKNODE *pCurrent;
BOOKNODE *pPrev;
pCurrent = pHead->next;
pPrev = pHead;
while ( pCurrent != NULL )
{
pPrev = pPrev->next;
pCurrent = pCurrent->next;
free ( pPrev );
}
}
pPrev의 next를 pPrev로 해서 pPrev를 지웠는데 다음 loop에 pPrev의 next를 사용하려면 pPrev는 이미 지워졌기 때문에 에러가 생기는거 같습니다.
위 부분을 다음과 같이 수정하시면 될듯합니다.
void KillAllBookNode ( BOOKNODE *pHead )
{
BOOKNODE *pCurrent;
BOOKNODE *pTemp;
pCurrent = pHead->next;
while ( pCurrent != NULL )
{
pTemp = pCurrent;
pCurrent = pCurrent->next;
free ( pTemp );
}
}
====================================
BornAgain !!
Email: jskim98@gmail.com
====================================
====================================
BornAgain !!
Email: jskim98@gmail.com
====================================
그리고 위의 예제는
그리고 위의 예제는 doubly linked list는 아닌거 같습니다.
next 만 있으니까요 pre 가 있으면 doubly linked list 가 되겠죠
그리고 pHead는 지우는게 아닌게 맞지요? pHeader까지 지워야 한다면
조금 수정되어야 할듯하네요
pCurrent = pHead->next; 를
pCurrent = phead; 로 바꿔야 될듯 합니다.
====================================
BornAgain !!
Email: jskim98@gmail.com
====================================
====================================
BornAgain !!
Email: jskim98@gmail.com
====================================
댓글 달기