세그 먼테이션이 떨어집니다.
글쓴이: nayana / 작성시간: 수, 2004/12/15 - 3:37오후
알고리즘을 공부하다가 예제를 활용하고 있는데...
세그 먼테이션이 떨어 집니다.
#include <cstdio> #include <cstring> #include "HashTable.h" #define MAXBUKETSIZE 1024 void Insert( char* ID, int key ); void Search( HashEntry< char*, int >* entry ); void Delete( HashEntry< char*, int >* entry, HashTable< char*, int > table, char* key ); unsigned long int Hash( char* k ); int main( void ) { HashTable< char*, int > table( MAXBUKETSIZE, Hash ); HashEntry< char*, int >* entry; HashEntry< char*, int >* entry1; table.Insert( "test1", 11 ); Insert( "test1", 11 ); table.Insert( "test2", 21 ); Insert( "test2", 21 ); entry = table.Find( "test1" ); Search( entry ); entry1 = table.Find( "test2" ); Search( entry1 ); Delete( entry, table, "test1" ); Delete( entry1, table, "test2" ); // 이부분에 세그먼테이션 return 0; } //------------------------------------------------------------------------------------------------------------------ unsigned long int Hash( char* k ) //------------------------------------------------------------------------------------------------------------------ { unsigned long int iSum = 0; int iLen = strlen( k ); for ( int iN = 0; iN < iLen; ++iN ) iSum += ( ( iN + 1 ) * k[ iN ] ); return iSum; } //------------------------------------------------------------------------------------------------------------------ void Insert( char* ID, int key ) //------------------------------------------------------------------------------------------------------------------ { printf( "Inserted : ( %s, %d )\n", ID, key ); } //------------------------------------------------------------------------------------------------------------------ void Search( HashEntry< char*, int >* entry ) //------------------------------------------------------------------------------------------------------------------ { if ( entry == 0 ) printf( "key not found\n" ); else printf( "Data Found : ( %s, %d )\n", entry->m_key, entry->m_data ); } //------------------------------------------------------------------------------------------------------------------ void Delete( HashEntry< char*, int >* entry, HashTable< char*, int > table, char* key ) //------------------------------------------------------------------------------------------------------------------ { if ( entry == 0 ) printf( "key not found\n" ); else printf( "Data Removed : ( %s, %d )\n", entry->m_key, entry->m_data ); table.Remove( key ); }
Array.h
#ifndef ARRAY_H #define ARRAY_H #include <stdio.h> template<class Datatype> class Array { public: //------------------------------------------------------------------------------------------------------------------ Array( int p_size ) //------------------------------------------------------------------------------------------------------------------ { m_array = new Datatype[p_size]; m_size = p_size; } //------------------------------------------------------------------------------------------------------------------ ~Array() //------------------------------------------------------------------------------------------------------------------ { if( m_array != 0 ) delete[] m_array; m_array = 0; } //------------------------------------------------------------------------------------------------------------------ void Resize( int p_size ) //------------------------------------------------------------------------------------------------------------------ { Datatype* newarray = new Datatype[p_size]; if( newarray == 0 ) return; int min; if( p_size < m_size ) min = p_size; else min = m_size; int index; for( index = 0; index < min; index++ ) newarray[index] = m_array[index]; m_size = p_size; if( m_array != 0 ) delete[] m_array; m_array = newarray; } //------------------------------------------------------------------------------------------------------------------ Datatype& operator[] ( int p_index ) //------------------------------------------------------------------------------------------------------------------ { return m_array[p_index]; } //------------------------------------------------------------------------------------------------------------------ void Insert( Datatype p_item, int p_index ) //------------------------------------------------------------------------------------------------------------------ { int index; for( index = m_size - 1; index > p_index; index-- ) m_array[index] = m_array[index - 1]; m_array[p_index] = p_item; } //------------------------------------------------------------------------------------------------------------------ void Remove( int p_index ) //------------------------------------------------------------------------------------------------------------------ { int index; for( index = p_index + 1; index < m_size; index++ ) m_array[index - 1] = m_array[index]; } //------------------------------------------------------------------------------------------------------------------ int Size() //------------------------------------------------------------------------------------------------------------------ { return m_size; } //------------------------------------------------------------------------------------------------------------------ operator Datatype* () //------------------------------------------------------------------------------------------------------------------ { return m_array; } //------------------------------------------------------------------------------------------------------------------ bool WriteFile( const char* p_filename ) //------------------------------------------------------------------------------------------------------------------ { FILE* outfile = 0; int written = 0; outfile = fopen( p_filename, "wb" ); if( outfile == 0 ) return false; written = fwrite( m_array, sizeof( Datatype ), m_size, outfile ); fclose( outfile ); if( written != m_size ) return false; return true; } //------------------------------------------------------------------------------------------------------------------ bool ReadFile( const char* p_filename ) //------------------------------------------------------------------------------------------------------------------ { FILE* infile = 0; int read = 0; infile = fopen( p_filename, "rb" ); if( infile == 0 ) return false; read = fread( m_array, sizeof( Datatype ), m_size, infile ); fclose( infile ); if( read != m_size ) return false; return true; } Datatype* m_array; int m_size; }; #endif
DLinkedList.h
#ifndef DLINKEDLIST_H #define DLINKEDLIST_H template<class Datatype> class DListNode; template<class Datatype> class DLinkedList; template<class Datatype> class DListIterator; //================================================================================================================== template<class Datatype> class DListNode { public: DListNode() { }; ~DListNode() { }; //------------------------------------------------------------------------------------------------------------------ void Delink() //------------------------------------------------------------------------------------------------------------------ { if( m_previous != 0 ) m_previous->m_next = m_next; if( m_next != 0 ) m_next->m_previous = m_previous; } //------------------------------------------------------------------------------------------------------------------ void InsertAfter( Datatype p_data ) //------------------------------------------------------------------------------------------------------------------ { DListNode<Datatype>* newnode = new DListNode<Datatype>; newnode->m_data = p_data; newnode->m_next = m_next; newnode->m_previous = this; if( m_next != 0 ) m_next->m_previous = newnode; m_next = newnode; } //------------------------------------------------------------------------------------------------------------------ void InsertBefore( Datatype p_data ) //------------------------------------------------------------------------------------------------------------------ { DListNode<Datatype>* newnode = new DListNode<Datatype>; newnode->m_data = p_data; newnode->m_next = this; newnode->m_previous = m_previous; if( m_previous != 0 ) m_previous->m_next = newnode; m_previous = newnode; } Datatype m_data; DListNode<Datatype>* m_next; DListNode<Datatype>* m_previous; }; //================================================================================================================== template<class Datatype> class DLinkedList { public: //------------------------------------------------------------------------------------------------------------------ DLinkedList() //------------------------------------------------------------------------------------------------------------------ { m_head = 0; m_tail = 0; m_count = 0; } //------------------------------------------------------------------------------------------------------------------ ~DLinkedList() //------------------------------------------------------------------------------------------------------------------ { DListNode<Datatype>* node = m_head; DListNode<Datatype>* next; while( node != 0 ) { next = node->m_next; delete node; node = next; } } //------------------------------------------------------------------------------------------------------------------ void Append( Datatype p_data ) //------------------------------------------------------------------------------------------------------------------ { if( m_head == 0 ) { m_head = m_tail = new DListNode<Datatype>; m_head->m_data = p_data; m_head->m_next = 0; m_head->m_previous = 0; } else { m_tail->InsertAfter( p_data ); m_tail = m_tail->m_next; } m_count++; } //------------------------------------------------------------------------------------------------------------------ void Prepend( Datatype p_data ) //------------------------------------------------------------------------------------------------------------------ { if( m_head == 0 ) { m_head = m_tail = new DListNode<Datatype>; m_head->m_data = p_data; m_head->m_next = 0; m_head->m_previous = 0; } else { m_head->InsertBefore( p_data ); m_head = m_head->m_previous; } m_count++; } //------------------------------------------------------------------------------------------------------------------ void RemoveHead() //------------------------------------------------------------------------------------------------------------------ { DListNode<Datatype>* node = 0; if( m_head != 0 ) { node = m_head->m_next; delete m_head; m_head = node; if( m_head == 0 ) m_tail = 0; else m_head->m_previous = 0; m_count--; } } //------------------------------------------------------------------------------------------------------------------ void RemoveTail() //------------------------------------------------------------------------------------------------------------------ { DListNode<Datatype>* node = 0; if( m_tail != 0 ) { node = m_tail->m_previous; delete m_tail; m_tail = node; if( m_tail == 0 ) m_head = 0; else m_tail->m_next = 0; m_count--; } } //------------------------------------------------------------------------------------------------------------------ void InsertAfter( DListIterator<Datatype>& p_iterator, Datatype p_data ) //------------------------------------------------------------------------------------------------------------------ { if( p_iterator.m_node != 0 ) { p_iterator.m_node->InsertAfter( p_data ); if( p_iterator.m_node == m_tail ) m_tail = m_tail->m_next; m_count++; } else Append( p_data ); } //------------------------------------------------------------------------------------------------------------------ void InsertBefore( DListIterator<Datatype>& p_iterator, Datatype p_data ) //------------------------------------------------------------------------------------------------------------------ { if( p_iterator.m_node != 0 ) { p_iterator.m_node->InsertBefore( p_data ); if( p_iterator.m_node == m_head ) m_head = m_head->m_previous; m_count++; } else Prepend( p_data ); } //------------------------------------------------------------------------------------------------------------------ void Remove( DListIterator<Datatype>& p_iterator ) //------------------------------------------------------------------------------------------------------------------ { DListNode<Datatype>* node; if( p_iterator.m_node == 0 ) return; node = p_iterator.m_node; if( node == m_head ) m_head = m_head->m_next; else if( node == m_tail ) m_tail = m_tail->m_previous; p_iterator.Forth(); node->Delink(); delete node; if( m_head == 0 ) m_tail = 0; m_count--; } //------------------------------------------------------------------------------------------------------------------ DListIterator<Datatype> GetIterator() //------------------------------------------------------------------------------------------------------------------ { return DListIterator<Datatype>( this, m_head ); } //------------------------------------------------------------------------------------------------------------------ int Size() //------------------------------------------------------------------------------------------------------------------ { return m_count; } //------------------------------------------------------------------------------------------------------------------ bool SaveToDisk( char* p_filename ) //------------------------------------------------------------------------------------------------------------------ { FILE* outfile = 0; DListNode<Datatype>* itr = m_head; outfile = fopen( p_filename, "wb" ); if( outfile == 0 ) return false; fwrite( &m_count, sizeof( int ), 1, outfile ); while( itr != 0 ) { fwrite( &(itr->m_data), sizeof( Datatype ), 1, outfile ); itr = itr->m_next; } fclose( outfile ); return true; } //------------------------------------------------------------------------------------------------------------------ bool ReadFromDisk( char* p_filename ) //------------------------------------------------------------------------------------------------------------------ { FILE* infile = 0; Datatype buffer; int count = 0; infile = fopen( p_filename, "rb" ); if( infile == 0 ) return false; fread( &count, sizeof( int ), 1, infile ); while( count != 0 ) { fread( &buffer, sizeof( Datatype ), 1, infile ); Append( buffer ); count--; } fclose( infile ); return true; } DListNode<Datatype>* m_head; DListNode<Datatype>* m_tail; int m_count; }; //================================================================================================================== template<class Datatype> class DListIterator { public: //------------------------------------------------------------------------------------------------------------------ DListIterator( DLinkedList<Datatype>* p_list = 0, DListNode<Datatype>* p_node = 0 ) //------------------------------------------------------------------------------------------------------------------ { m_list = p_list; m_node = p_node; } //------------------------------------------------------------------------------------------------------------------ void Start() //------------------------------------------------------------------------------------------------------------------ { if( m_list != 0 ) m_node = m_list->m_head; } //------------------------------------------------------------------------------------------------------------------ void End() //------------------------------------------------------------------------------------------------------------------ { if( m_list != 0 ) m_node = m_list->m_tail; } //------------------------------------------------------------------------------------------------------------------ void Forth() //------------------------------------------------------------------------------------------------------------------ { if( m_node != 0 ) m_node = m_node->m_next; } //------------------------------------------------------------------------------------------------------------------ void Back() //------------------------------------------------------------------------------------------------------------------ { if( m_node != 0 ) m_node = m_node->m_previous; } //------------------------------------------------------------------------------------------------------------------ Datatype& Item() //------------------------------------------------------------------------------------------------------------------ { return m_node->m_data; } //------------------------------------------------------------------------------------------------------------------ bool Valid() //------------------------------------------------------------------------------------------------------------------ { return (m_node != 0); } //------------------------------------------------------------------------------------------------------------------ bool operator==( DListIterator<Datatype>& p_rhs ) //------------------------------------------------------------------------------------------------------------------ { if( m_node == p_rhs.m_node && m_list == p_rhs.m_list ) return true; return false; } DListNode<Datatype>* m_node; DLinkedList<Datatype>* m_list; }; #endif
HashTable.h
#ifndef HASHTABLE_H #define HASHTABLE_H #include "DLinkedList.h" #include "Array.h" //================================================================================================================== template< class KeyType, class DataType > class HashEntry { public: KeyType m_key; DataType m_data; }; //================================================================================================================== //================================================================================================================== template< class KeyType, class DataType > class HashTable { public: typedef HashEntry<KeyType, DataType> Entry; //------------------------------------------------------------------------------------------------------------------ HashTable( int p_size, unsigned long int (*p_hash)(KeyType) ) : m_table( p_size ) //------------------------------------------------------------------------------------------------------------------ { m_size = p_size; m_hash = p_hash; m_count = 0; } //------------------------------------------------------------------------------------------------------------------ void Insert( KeyType p_key, DataType p_data ) //------------------------------------------------------------------------------------------------------------------ { Entry entry; entry.m_data = p_data; entry.m_key = p_key; int index = m_hash( p_key ) % m_size; m_table[index].Append( entry ); m_count++; } //------------------------------------------------------------------------------------------------------------------ Entry* Find( KeyType p_key ) //------------------------------------------------------------------------------------------------------------------ { int index = m_hash( p_key ) % m_size; DListIterator<Entry> itr = m_table[index].GetIterator(); while( itr.Valid() ) { if( !strncmp( itr.Item().m_key, p_key, strlen( p_key ) ) ) return &(itr.Item()); itr.Forth(); } return 0; } //------------------------------------------------------------------------------------------------------------------ bool Remove( KeyType p_key ) //------------------------------------------------------------------------------------------------------------------ { int index = m_hash( p_key ) % m_size; DListIterator<Entry> itr = m_table[index].GetIterator(); while( itr.Valid() ) { if( !strncmp( itr.Item().m_key, p_key, strlen( p_key ) ) ) { m_table[index].Remove( itr ); m_count--; return true; } itr.Forth(); } return false; } //------------------------------------------------------------------------------------------------------------------ int Count() //------------------------------------------------------------------------------------------------------------------ { return m_count; } int m_size; int m_count; Array< DLinkedList< Entry > > m_table; unsigned long int (*m_hash)(KeyType); }; #endif
Forums:
확인해보니 복사 생성자 문제 였더군요^^일단 첫번째 방법[qu
확인해보니 복사 생성자 문제 였더군요^^
일단
첫번째 방법
void Delete( HashEntry< char*, int >* entry, HashTable< char*, int >& table, char* key );
두번째 방법
Delete( entry, &table, "test1" );
Delete( entry1, &table, "test2" );
void Delete( HashEntry< char*, int >* entry, HashTable< char*, int >* table, char* key );
{
if ( entry == 0 ) printf( "key not found\n" );
else printf( "Data Removed : ( %s, %d )\n", entry->m_key, entry->m_data );
table->Remove( key );
}
세번째 방법
복사 생성자를 하나 만든것 입니다.
HashTable( const HashTable& hashtable )
: m_table( hashtable.m_size )
{
m_size = hashtable.m_size;
m_hash = hashtable.m_hash;
m_count = 0;
}
댓글 달기