在双向链表中插入元素

时间:2012-10-06 16:10:38

标签: c++ list linked-list

我或多或少得到了单个链表后面的基本思想,但是在双向链表中插入元素时遇到了麻烦。 基本上我无法将prev和next指针链接到适当的节点。 在此先感谢您的帮助。这是我的代码的样子。

LinkedList.h

template <class T>
class LinkedList{
      protected:
        LinkedListNode<T>* head;
      public:
        LinkedList():head(NULL){}
        ~LinkedList();
        void insert(const T& x);
};


//inserting
template <class T>
void LinkedList<T>::insert(const T& x) {
 LinkedListNode<T>* head = new LinkedListNode<T>(head->prev, x, head->next);
 if(head != NULL){
         head->prev = head->next;
         head->next = head;
  }       
}

LinkedListNode.h

class LinkedListNode{
      protected:
        LinkedListNode<T>* prev;
        T value;
        LinkedListNode<T>* next;
        LinkedListNode(LinkedListNode<T>* p, const T& x, LinkedListNode<T>* n):prev(p), value(x), next(n) {}
        ~doublyLinkedListNode();
        template <class S> friend class doublyLinkedList;
};

我尝试修改插入函数如下,但它给出了分段错误。 我的实施有什么问题?

template <class T>
void LinkedList<T>::insert(const T& x) {
 LinkedListNode<T>* head;
 if(head == NULL){
        head->value = x;
        head->prev = NULL;
        head->next = head;

 }
else{   LinkedListNode<T>* newnode;
        newnode->value = x;
        newnode->prev = head->next;
        newnode->next = newnode;
        head = newnode;
 }

1 个答案:

答案 0 :(得分:1)

你是variable shadowing的受害者。

让我们看看你的原始版本:

//inserting
template <class T> void LinkedList<T>::insert(const T& x) {
   LinkedListNode<T>* head = new LinkedListNode<T>(head->prev, x, head->next);
   // ...

我们将剖析你的功能的第一条指令:

   LinkedListNode<T>* head; // not initialized value
   new LinkedListNode<T>(head->prev, x, head->next); // oh oh....

head是一个新变量,您的原始this->head会被遮蔽。但即使你解决了这个问题,最初的this->head仍然是NULL,因此this->head->prev会导致细分错误。你在第二个版本中修复了后者,但只是仍然有问题:

模板

void LinkedList<T>::insert(const T& x) {
 LinkedListNode<T>* head; // #1
 if(head == NULL){
        // #2
        head->value = x;
        head->prev = NULL;
        head->next = head;

 }
else{   LinkedListNode<T>* newnode;
        newnode->value = x;
        newnode->prev = head->next; // #3
        newnode->next = newnode;    // #3
        head = newnode;
 }

第一个错误(#1)同样是变量阴影。 #2再次成为分段错误,因为您没有为头部分配内存。

#3是逻辑错误。前一个节点应该是头本身,节点后面的节点不应该是节点本身。