[英]Linked List of sorted names C++
我必須創建一個鏈接列表時遇到問題。 該程序應接受用戶輸入的名稱,然后將其放入鏈接列表中。 該列表應按字母順序排序,因此,當添加新節點時,其位置應正確。
我的代碼現在看起來像這樣:
struct node
{
string info;
node *next;
};
class Passenger
{
private:
node* pname;
public:
void insert(string);
Passenger();
};//closes Passenger class
Passenger::Passenger()
{
pname = new node;
pname -> info = "ABC";
pname -> next = NULL;
}
void Passenger::insert(string name)
{
node *temp, *p, *s;
p = pname;
s = pname;
temp = new node;
temp->info = name;
if(p-> info == "ABC") //new pname linked list, put temp at the front
{
p->info = name;
p->next = NULL;
}
//if there is already one in the list
while(s != NULL)
{
cout<<"inside while loop"<<endl;
//if new node goes to left
if(temp->info < s->info)
{
temp->next = p;
pname = temp;
}//closes if
if(temp->info > s->info)
{
if(p->next != NULL)
{
s = s->next;
if(s->next == NULL)
s->next = temp;
}//closes if
}//closes if
p = p->next;
s = s->next;
}//closes while
我真的不知道如何更改它的工作原理。 當列表中有一個節點時,我就完成了,然后添加了第二個。 但是如果已經有2個節點,我不知道如何在其中排序第三個或第四個節點。
戴夫
用包含“ ABC”的標記節點表示一個空列表的BTW是荒謬的。 如果有人要存儲以該名稱開頭的列表怎么辦? 使用NULL指針表示空列表是一種幾乎通用的約定。
同樣,節點不必是其他類型。 列表類本身可以是一個節點。 因此,該類的實例只是第一個節點的實例,帶有指向列表其余部分的指針。 或者,為了更好地處理空列表,您可以有一個容器類,該類保留指向頭的指針(並可以選擇指向尾的指針,以便快速插入尾部)。 如果需要,實現幫助器函數可以是節點的成員函數,而不是容器類,因此可以在任何子列表中調用它們。
當我學習鏈接列表時,我經常發現它有助於在紙上繪制節點的圓圈和指針的箭頭,就像在數據結構教科書中一樣。 這樣一來,您在思考整個過程和任何特殊情況(列表的開頭或結尾)時就不必花太多時間在腦海中。
您可以將問題分為兩部分:搜索和插入。
您的搜索功能應返回一個指向插入位置之前的節點的指針。 也就是說,最后一個節點的字符串比您要插入的字符串少。 你在功能回路則需要要么展望下一個元素,或保持prev
指針。 無論哪種方式,您都需要返回到停止循環的節點之前的節點。
在節點之后插入非常容易。 在特殊情況下,您需要插入列表的新標題,因為沒有節點可以修改以指向新的當前列表。 但是,您不必擔心要插入的節點是否在列表的末尾。
您可以通過使用指向實際第一個元素的“虛擬”節點來減少特殊情況的數量。 與InsertNth相比,此技巧可能不適用於基於比較的插入。 我對這個問題的回答將事情分解為查找和插入操作,並且即使它是Java代碼審查問題,也以類似C的風格編寫。 請參見InsertAfter
和InsertBefore
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.