문자열의 링크 된 목록을 관리하고 조작하는 여러 함수보다 StringList라는 클래스가 있습니다. AddtoBottom이라는 목록의 맨 위에 추가하는 AddtoTop이 있습니다.이 함수는 문자열을 추가하지만 알파벳 순서, 명확한 함수, 찾기 함수, 인쇄 및 제거 함수로 추가합니다. 모든 단일 기능을 작성했지만 주요 문제가 하나 있습니다. "AddtoTop"과 "AddtoBottom"을 사용할 때 링크 된 목록에 문자열을 추가합니다. 내 두 함수를 사용하여 배치 한 문자열을 제거하도록 요청하면 내 제거 함수가 작동합니다. "추가"기능으로 추가 한 단어를 제거하려고하면 프로그램이 중단됩니다. 함수 "remove"(아래 참조)는 "AddtoBottom"및 "AddtoTop"기능을 사용하여 추가 된 문자열을 제거 할 수 있지만 "add"를 사용하여 추가 한 문자열은 제거 할 수 없습니다. 나는 그것을 다른 방식으로 다시 쓰려고 노력하지만 나는 붙어있다. 여기 내 기능은 다음과 같은링크 된 목록을 관리하는 함수
StringList::StringList() //constructor
{
pTop=NULL;
pBottom=NULL;
}
StringList::~StringList() //destructor
{
StringListNode *next;
for (StringListNode *sp = pTop; sp != 0; sp = next)
{
next = sp->pNext;
delete sp;
}
}
void StringList::add(string s) //adds and places in alphabetical order
{
if(pTop)
{
if(s < pTop->data)
{
StringListNode *A=new StringListNode;
A->data = s;
A->pNext = pTop;
pTop = A; // new top
return;
}
// go further into list
StringListNode *iter = pTop;
while(iter->pNext)
{
if( iter->pNext->data < s)
iter = iter->pNext;
else
break;
}
StringListNode *in=new StringListNode; //actuallly inserts node
in->data = s;
in->pNext = iter->pNext;
iter->pNext = in;
}
else// new item
{
pTop = new StringListNode;
pTop->data = s;
pTop->pNext = NULL;
}
}
StringList::StringListNode *StringList::find(const string &s) //basic search function
{
StringListNode *sp = pTop; // Search
while (sp != 0 && sp->data != s)
sp = sp->pNext;
return sp;
}
void StringList::addToTop(string s) //add to top of nodes
{
if(isEmpty())
{
StringListNode * pNewNode;
pNewNode = new StringListNode;
(*pNewNode).data = s;
pTop=pNewNode;
pBottom=pNewNode;
(*pNewNode).pPrev = NULL;
(*pNewNode).pNext = NULL;
}
else //it's not empty
{
StringListNode * pNewNode;
pNewNode = new StringListNode;
(*pNewNode).data = s;
(*pNewNode).pNext = pTop;
(*pTop).pPrev = pNewNode;
(*pNewNode).pPrev =NULL;
pTop=pNewNode;
}
}
void StringList::addToBottom(string s) // add to bottom
{
if(isEmpty())
{
StringListNode * pNewNode;
pNewNode = new StringListNode;
(*pNewNode).data = s;
pTop=pNewNode;
pBottom=pNewNode;
(*pNewNode).pPrev = NULL;
(*pNewNode).pNext = NULL;
}
else
{
StringListNode * pNewNode;
pNewNode = new StringListNode;
(*pNewNode).data = s;
(*pBottom).pNext = pNewNode;
(*pNewNode).pPrev = pBottom;
(*pNewNode).pNext =NULL;
pBottom=pNewNode;
}
}
string StringList::print() //prints strings in linked list
{
string result;
StringListNode * pCurrent;
pCurrent=pTop;
while(pCurrent!=NULL)
{
result+=(*pCurrent).data+"\n";
pCurrent=(*pCurrent).pNext;
}
return result;
}
void StringList::clear() //clears everything
{
pTop = NULL;
pBottom = NULL;
}
void StringList::remove(string s) //removes a string
{
StringListNode *curr = this->find(s);
if (curr->pPrev != 0)
curr->pPrev->pNext = curr->pNext;
if (curr->pNext != 0)
curr->pNext->pPrev = curr->pPrev;
if (pTop == curr)
pTop = curr->pNext;
if (pBottom == curr)
pBottom = curr->pPrev;
}
가능하면 더 효율적으로 작동하려면이 제거 기능을 작성하는 더 좋은 방법이 있습니까? – WestonBuckeye
당신의'add' 메쏘드는 새로운 아이템을리스트에 단독으로 연결하는 것일뿐입니다 -'pPrev' 멤버는 초기화되지 않은 상태로 남겨 둡니다. –
@JonathanPotter 제 제거 기능이 올바르게 작동합니까? 좋아, 그 pPrev에서 마술을 좀 할 수 있는지 알아 보자. 그래도 모든 제안? – WestonBuckeye