#include <bits/stdc++.h>
using namespace std;
class DoubleLinkedList {
private:
struct node {
int val;
node *next, *prior;
node() {}
node(int x) {
this->val = x;
}
};
node *head;
int size;
public:
DoubleLinkedList() {
head = new node();
head->next = head->prior = NULL;
size = 0;
}
~DoubleLinkedList() {
while (head->next!=NULL && head->prior!=NULL) {
delTail();
}
delete head;
}
void insert(int index, int x) {
if (index<0 || index>size) {
cout << "the index is invalid!" << endl;
return;
}
node *p = head;
for (int i=0; i<index; ++i) p = p->next;
/*
node *q = new node(q)
q->next = p->next; p->next可能是NULL指针
*/
node *q = new node(x);
q->next = p->next;
if (p->next) p->next->prior = q;
q->prior = p;
p->next = q;
size ++;
}
void insertHead(int x) {insert(0, x);}
void insertTail(int x) {insert(size, x);}
int del(int index) {
if (index<0 || index>=size) {
cout << "the index is invalid!" << endl;
return -1;
}
if (head->next==NULL && head->prior==NULL) {
cout << "the DoubleLinkedList is null!" << endl;
return -1;
}
node *p = head;
for (int i=0; i<index; ++i) p = p->next;
node *del = p->next;
int res = del->val;
if (del->next) {
del->next->prior = p;
p->next = del->next;
delete del;
} else {
p->next = NULL;
delete del;
}
size --;
return res;
}
int delHead() {del(0);}
int delTail() {del(size-1);}
int get(int index) {
if (index<0 || index>=size) {
cout << "the index is invalid!" << endl;
return -1;
}
if (head->next==NULL && head->prior==NULL) {
cout << "the DoubleLinkedList is null!" << endl;
return -1;
}
node *p = head->next;
for (int i=0; i<index; ++i) p = p->next;
return p->val;
}
int getHead() {return get(0);}
int getTail() {return get(size-1);}
void show() {
node *p = head->next;
while (p) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
bool isEmpty() {
return head->next==NULL && head->prior==NULL;
}
};
int main() {
int a[] = {1,2,3,4,5};
int n = sizeof(a)/sizeof(int);
DoubleLinkedList l = DoubleLinkedList();
for (int i=0; i<n; ++i) l.insertTail(a[i]);
l.show();
l.delHead();
l.show();
l.delTail();
l.show();
cout << l.getHead() << endl;
cout << l.getTail() << endl;
return 0;
}
数据结构:带头结点双向链表的实现(考研)
最新推荐文章于 2026-04-09 14:39:56 发布
本文详细介绍了一种双向链表的C++实现方法,包括插入、删除和获取元素等核心操作,通过具体代码展示了双向链表的数据结构设计与管理。
&spm=1001.2101.3001.5002&articleId=102794429&d=1&t=3&u=abe884dcbc99435aa33459c49846405c)
1538

被折叠的 条评论
为什么被折叠?



