将节点插入双向链表
我想将一个包含名称的新节点插入到双向链表的正确位置。基本上,插入排序就是我想要在这里实现的。
这是插入函数的代码,但是存在问题:
- 如果多次插入具有相同值的节点,它会破坏双向链表!
- 它没有正确对列表进行排序。
这是该类的代码:
class Doubly
{
private:
struct node
{
string name; //stores name
node* next; //points to next node
node* prev; //points to previous node
};
node* head; //points to the first node in the list
node* last; //points to the last node in the list
public:
Doubly(); //cstrctr
~Doubly(); //dstrctr
bool empty() const { return head==NULL; }
void insert(const string& );
void remove(const string& );
void print(ostream& OutStream) const;
void sort (bool);
};
这是插入的代码:
void Doubly::insert (const string& input)
{
// Insertion into an Empty List.
if(empty()) //create a new list with one node = Head/Null
{
node* name = new node;
head = name;
last = name;
name -> prev = NULL;
name -> next = NULL;
name -> name = input; //
}
//Insertion into a populated list
else
{
node* newnode;
newnode = head;
while (input > newnode -> name && newnode -> next != last -> next)
newnode = newnode -> next;
if (newnode == head)
{
node* name = new node;
name -> name = input;
name -> prev = newnode;
name -> next = NULL;
head -> next = name;
last = name;
}
else
{
if (newnode == last && input > last -> name) //Add the name to the end of the linked list
{
last -> next = new node;
(last -> next) -> prev = last;
last = last -> next;
last -> next = NULL;
last -> name = input;
}
else
{
node* name = new node;
name -> name = input;
name -> next = newnode;
(newnode -> prev) -> next = name;
name -> prev = newnode -> prev;
newnode -> prev = name;
}
}
}
}
I am wanting to insert a newnode that will contain a name into the correct position of the Doubly Linked List. Basically an Insertion sort is what I want to achieve here.
This is the code for the insert function however there is problems:
- It breaks the Doubly Linked List if you insert a node with the same value more than once!
- It is not properly sorting the list.
Here is the code for the class:
class Doubly
{
private:
struct node
{
string name; //stores name
node* next; //points to next node
node* prev; //points to previous node
};
node* head; //points to the first node in the list
node* last; //points to the last node in the list
public:
Doubly(); //cstrctr
~Doubly(); //dstrctr
bool empty() const { return head==NULL; }
void insert(const string& );
void remove(const string& );
void print(ostream& OutStream) const;
void sort (bool);
};
Here is the code for insert:
void Doubly::insert (const string& input)
{
// Insertion into an Empty List.
if(empty()) //create a new list with one node = Head/Null
{
node* name = new node;
head = name;
last = name;
name -> prev = NULL;
name -> next = NULL;
name -> name = input; //
}
//Insertion into a populated list
else
{
node* newnode;
newnode = head;
while (input > newnode -> name && newnode -> next != last -> next)
newnode = newnode -> next;
if (newnode == head)
{
node* name = new node;
name -> name = input;
name -> prev = newnode;
name -> next = NULL;
head -> next = name;
last = name;
}
else
{
if (newnode == last && input > last -> name) //Add the name to the end of the linked list
{
last -> next = new node;
(last -> next) -> prev = last;
last = last -> next;
last -> next = NULL;
last -> name = input;
}
else
{
node* name = new node;
name -> name = input;
name -> next = newnode;
(newnode -> prev) -> next = name;
name -> prev = newnode -> prev;
newnode -> prev = name;
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为问题是在列表头部插入时,并且只有一个元素,即
while (input > newnode -> name && newnode -> next != last ->; next)
可以因为 2 个原因而退出,并且您假设如果指针仍然位于头部,则必须随后将其插入,但也许它只是因为只有一个元素而退出了 while必须将新的插入到头部之前。所以你可能必须做类似的事情:
I think the problem is when inserting at the head of the list, and you only have one element, the
while (input > newnode -> name && newnode -> next != last -> next)
can exit because of 2 reasons, and you are asuming that if the pointer is still at the head you have to insert it afterwards, but maybe it just went out of the while because there was only one element and you have to insert the new one before the head.So you probably have to do something like: