双向链表的实现


#include <iostream>

using namespace std;

struct DLinkNode{

int data;

DLinkNode* prior;

DLinkNode* next;

};

void Initalize(DLinkNode*& L) { //创建双向链表

L = new DLinkNode;

L->prior = 0;

L->next = 0;

}

void Push_Back(DLinkNode*& L, int x) { //头部插入

DLinkNode* p = L, * A = new DLinkNode;

A->data = x;

while (p->next != 0) {

p = p->next;

}

p->next = A;

A->prior = p;

A->next = 0;

}

void Push_Head(DLinkNode*& L, int x) { //尾部插入

DLinkNode* A = new DLinkNode;

A->data = x;

A->next = L->next;

L->next->prior = A;

L->next = A;

A->prior = L;

}

int Length(DLinkNode* L) { //计算单链表的长度

DLinkNode* p;

p = L->next;

int len = 0;

while (p) {

len++;

p = p->next;

}

return len;

}

DLinkNode* Find(DLinkNode*& L, int i) { //找到第i个元素的地址

if (i<0 || i>Length(L)) return 0;

DLinkNode* p;

p = L;

int j = 0;

while (j < i) {

p = p->next;

j++;

}

return p;

}

void Insert(DLinkNode*& L, int i, int x) { //在第i个位置插入

if (i<0 || i>Length(L) + 1) return;

if (i == Length(L) + 1)

Push_Back(L, x);

else {

DLinkNode* p = Find(L, i - 1);

Push_Head(p, x);

}

}

void Pop_Back(DLinkNode*& L) { //尾部删除

DLinkNode* p;

p = L;

while (p->next != 0) {

p = p->next;

}

p->prior->next = 0;

delete p;

}

void Pop_Head(DLinkNode*& L) { //头部删除

DLinkNode* p;

p = L;

p->next->prior = L;

L = L->next;

delete p;

}

void Delete(DLinkNode*&L,int i) { //删除第i个元素

if (i<0 || i>Length(L)) return;

if (i == 0)

Pop_Head(L);

if (i == Length(L))

Pop_Back(L);

else {

DLinkNode* p = Find(L, i);

p->prior->next = p->next;

p->next->prior = p->prior;

delete p;

}

}

void Print(DLinkNode* L) { //打印链表

DLinkNode* p;

p = L->next;

while (p) {

cout << p->data;

p = p->next;

if (p)

cout << ' ';

}

cout << endl;

}

int main() {

DLinkNode* L;

Initalize(L);

Push_Back(L, 1);

Push_Back(L, 2);

Push_Back(L, 3);

Push_Back(L, 4);

Push_Head(L, 5);

Push_Head(L, 6);

Push_Head(L, 7);

Push_Head(L, 8);

Print(L);

Delete(L, 3);

Print(L);

Pop_Head(L);

Print(L);

return 0;

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 6,261评论 0 2
  • 含头结点 创建双向链表 创建节点 判断双向链表是否为空 遍历打印双向链表 头插法建立双向链表 尾插法建立双向链表 ...
    虎太郎丨C阅读 6,049评论 0 0
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 12,211评论 0 10
  • 好像从不写公众号之后就很少写东西了,但我觉得自己还是喜欢写东西的,因为我喜欢跟自己对话,而且也需要静下心来反思。 ...
    大人世界里的孩子阅读 1,783评论 0 0
  • 假如明天死亡来到,我还有好多的工作没有完成,月末结报,月初台账,一个咨询件,未完成的学习计划,承诺书,两次学习笔记...
    9102小潘潘阅读 2,286评论 0 1

友情链接更多精彩内容