[英]Adding nodes to linked list alphabetically in c++
我正在嘗試創建一個鏈接列表,該列表從用戶那里獲取單詞,直到輸入為空,並且添加了每個單詞,以便列表按字母順序排列。 但是,僅打印第一個節點。 我做錯了什么嗎? 這是我所擁有的(減去標題和聲明):
//put in additional nodes until the input is blank
while(in != " "){
cin >> in;
newPtr->data = in;
prevPtr->data = "";
prevPtr->next = NULL;
nextPtr = list;
//shift the prevPtr and nextPtr until newPtr is alphabetically between them
while(!(prevPtr->data<=in && nextPtr->data>in)){
prevPtr = nextPtr;
nextPtr = prevPtr->next;
}
//make newPtr point to the next node
if(nextPtr != NULL){
newPtr->next = nextPtr;
}
//make newPtr the "next" pointer of the previous node, if any
if(prevPtr != NULL){
prevPtr->next = newPtr;
}
//if there's nothing before newPtr, make it the first node
else{
list = newPtr;
}
printList(list);
};
}
我將其發布為評論,因為恐怕我可能會遺漏一些東西,但是我還不能做到這一點,因此這里沒有答案:
是什么讓您無法使用std :: list ? 您可以插入一個單詞,檢查它是否為非空,立即應用標准的排序算法 (它依賴於排序對象的比較運算符)並打印出來。 它速度很快,您的代碼簡短易讀,並且您無需花費時間重新發明輪子。
PS:如果您想測試一個空字符串,我想應該是""
,而不是" "
。
我認為這里有很多問題。
對於初始迭代中的一個,prevPtr-> data指向什么? 如果它什么也沒有指向或尚未分配給任何內存,則不應將其設置為任何值。
另外,您需要在每次迭代時為newPtr分配內存,否則,您將只寫列表中指向它最后的位置的內存位置。
第二個讓我們假設prevPtr指向某個對象,在此過程的第二次迭代(或更多次迭代)上,而循環prevPtr已移到列表的更下方(prevPtr = nextPtr),這將導致prevPtr-> data =“”擦除其中的任何數據。該元素。 因此,您可以隨后打印第一個節點以及一堆空格。
第三,您應該首先在循環中檢查list是否為NULL,因為如果循環為NULL,則nextPtr-> data將指向垃圾,這不好。 列表上的NULL檢查可能是第一個元素的特殊情況。
嘗試這樣的事情,我沒有時間對其進行測試,但是它應該朝着正確的方向發展:
Node *list = NULL;
while(in != " "){
cin >> in;
Node *newPtr = new Node();
newPtr->data = in;
newPtr->next = NULL;
prevPtr = list;
nextPtr = list;
// Do we have an empty list
if(list != NULL)
{
// Corner Case: First on the list
if(newPtr->data <= prevPtr->data)
{
list = newPtr;
newPtr->next = prevPtr;
}
else
{
// CASE: Somewhere between the first and the list
while(nextPtr->next != NULL)
{
nextPtr = nextPtr->next;
if(newPtr->data >= prevPtr->data && newPtr->data <= nextPtr->data)
{
prevPtr->next = newPtr;
newPtr->next = nextPtr;
break;
}
prevPtr = prevPtr->next;
}
// Corner Case: end of list
if(nextPtr->next == NULL)
{
nextPtr->next = newPtr;
}
}
}
else
{
// Corner Case: We had an empty list
list = newPtr;
}
printList(list);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.