双重循环链表实施

时间:2013-07-12 01:15:59

标签: c++ linked-list nodes

这是我的节点和链表

的类
#include <iostream>
#include <string>
#include <iomanip>
#include <stdio.h>  

using namespace std;
//template <class Object>


//template <class Object>
class Node
{   
    //friend ostream& operator<<(ostream& os, const Node&c);
public:
    Node( int d=0);
    void print(){
        cout<<this->data<<endl;
    }
//private:
    Node* next;
    Node* prev;
    int data;

    friend class LinkList;
};
Node::Node(int d):data(d)
{

}

//template <class Object>
class LinkList
{
public:
    //LinkList();
    LinkList():head(NULL),tail(NULL),current(NULL){}
    int base;
    //LinkList(const LinkList & rhs, const LinkList & lhs);
    ~LinkList(){delete head,tail,current;}

    const Node& front() const;//element at current
    const Node& back() const;//element following current 
    void move();
    void insert (const Node & a);//add after current
    void remove (const Node &a);
    void create();
    void print();
private:
    Node* current;//current
    Node* head;
    Node* tail;


};

void LinkList::print()
{
    Node *nodePt =head;
    while(nodePt)
    {
        cout<<"print function"<<endl;
        cout<<nodePt->data<<endl;
        nodePt=nodePt->next;
    }
}
//element at current

void LinkList::create()
{
    Node start(0);

}

const Node& LinkList::back()const
{
    return *current;
}
//element after current
const Node& LinkList::front() const
{
    return *current ->next;
}

void LinkList::move()
{
    current = current ->next;
}
//insert after current 
void LinkList :: insert(const Node& a)
{
    Node* newNode= new Node();
    newNode->prev=current;
    newNode->next=current->next;
    newNode->prev->next=newNode;
    newNode->next->prev=newNode;
    current=newNode;

}
void LinkList::remove(const Node& a)
{
    Node* oldNode;
    oldNode=current;
    oldNode->prev->next=oldNode->next;
    oldNode->next->prev=oldNode->prev;
    delete oldNode;

}


#include <iostream>
#include <string>
#include <iomanip>
#include <stdio.h>  
#include "LinkedList.h"

using namespace std;


int main()
{
    int n;
    cout<<"How many Nodes would you like to create"<<endl;
    cin>>n;
    Node a(n);
    Node b(n+1);
    a.print();
    a.next=&b;


    LinkList list1 ;
    list1.create();

    list1.print();
    list1.insert(0);
    list1.print();

    //for(int i=0 ;i<n;i++)
    //{
        //list1.insert(i);
    //}

我想创建一个双循环链表,但我现在有问题创建了实际的链表。是类的问题。同样对于赋值,列表被假定为模板类,但现在我只想让代码工作。我不知道如何正确创建链表。

1 个答案:

答案 0 :(得分:1)

1 - 您必须缩进代码,在发布前将其清理干净!!

2 - 在你的问题中具体说明,我没有得到你的问题

无论如何,我看到了代码,我注意到很多事情,可能是他们不是你的全部问题

1 - 创建功能有什么作用?根据你的逻辑,我认为它什么都不做 - 正如我猜测的那样 - 你应该通过使用参数来初始化你的头部,尾部和当前的功能,或者如果它什么都不做就完全忽略这个功能然后处理插入的情况在插入函数的开头,这是你的第二个问题

2 - 你的插入函数应该处理一些条件,插入列表的开头和结尾

例如,如果在最后插入,则此语句“newNode-&gt; next-&gt; prev”将无效,因为您的下一个现在为空

处理这些条件后,不要忘记保持头部和尾部的更新

另外,为什么在插入功能结束时更新电流?尽管你可以避免它的问题,但我不认为它在逻辑上是被接受的,最好将“插入”的角色设置为只插入,特别是当你有移动功能时

3 - 在删除功能中你应该处理上面提到的删除功能的相同条件

4 - 主要功能: 那些线是什么?!!!

Node a(n);
Node b(n+1);
a.print();
a.next=&b;

我不知道他们是否只是测试节点类的行,如果不是你应该注意到它不是LOGICAL AT ALL按链表的大小创建一个节点,我真的不知道这样做的原因!!

如果节点和链表之间有任何冲突,请注意!

再次修改所有代码并处理可能遇到的情况。

希望我帮助