【双链表的概念】
每个结点既保存直接后继结点的地址,又保存直接前驱结点的地址。
【双链表的类设计】
templateclass dLinkList :public list { private: struct node { elemType data; node* prev, * next; node(const elemType& x, node* p = NULL, node* n = NULL) { data = x; next = n; prev = p; } node():next(NULL),prev(NULL){} ~node(){} }; node* head, * tail;//头指针和尾指针 int currentLength; node* move(int i)const; public: dLinkList(); ~dLinkList() { clear(); delete head; delete tail; } void clear(); int length()const { return currentLength; } void insert(int i, const elemType& x); void remove(int i); int search(const elemType& x)const; elemType visit(int i)const; void traverse()const; };
【功能函数的设计】
//move函数 templatedLinkList ::node* dLinkList ::move(int i) const { node* p = head; while (i-- >= 0) p = p->next; return p; }
//构造函数 templatedLinkList ::dLinkList() { head = new node;//此处调用node类缺省的构造函数,此时head的prev和next都置为了空指针 head->next = tail = new node; tail->prev = head; currentLength = 0; }
//clear函数 templatevoid dLinkList ::clear() { node* p = head->next, * q; head->next = NULL; while (p != NULL) { q = p->next; delete p; p = q; } node* p = tail->prev, * q; tail->prev = NULL; while (p != NULL) { q = p->prev; delete p; p = q; } currentLength = 0; }
//insert函数 templatevoid dLinkList ::insert(int i, const elemType& x) { node* pos, * tmp; pos = move(i); tmp = new node(x, pos->prev, pos); pos->prev->next = tmp; pos->prev = tmp; currentLength++; }
//remove函数 templatevoid dLinkList ::remove(int i) { node* pos; pos = move(i); pos->prev->next = pos->next; pos->next->prev = pos->prev; delete pos; currentLength--; }
//search函数 templateint dLinkList ::search(const elemType& x) const { node* p = head->next; int i = 0; while (p != NULL && p->data != x) { p = p->next; i++; } if (p == NULL) return -1; else return i; }
//visit函数 templateelemType dLinkList ::visit(int i) const { return move(i)->data; }
//traverse函数 templatevoid dLinkList ::traverse() const { node* p = head->next; cout << endl; while (p != NULL) { cout << p->data; p = p->next; } cout << endl; }
上面的代码没有写很多注释,双链表和单链表的功能函数实现比较类似,只有少部分有改动,详情可以参考下面这篇文章:
(2条消息) 【单链表】【单链表类的设计】【move函数找到第i个结点】【struct结点类】【设置表长currentLength代替每次遍历】_捡到一只姜小鱼的博客-CSDN博客https://blog.csdn.net/qq_46480277/article/details/124523187?spm=1001.2014.3001.5501



