c++双循环链表的输出函数
时间: 2023-12-16 16:04:08 浏览: 30
双循环链表的输出函数可以按照正序或倒序输出链表中的元素。以下是两种方法:
1. 正序输出:
```c
void printList(Node *head) {
Node *current = head;
do {
printf("%d ", current->data);
current = current->next;
} while (current != head);
printf("\n");
}
```
2. 倒序输出:
```c
void printListBackwards(Node *head) {
Node *current = head->prev;
do {
printf("%d ", current->data);
current = current->prev;
} while (current != head->prev);
printf("\n");
}
```
相关问题
用C++语言实现一个双向循环链表
双向循环链表是一种链式存储结构,每个节点包含一个指向前驱节点和后继节点的指针。在C++语言中,可以通过定义一个双向循环链表类来实现该数据结构。
以下是一个简单的双向循环链表类的实现:
```cpp
class Node {
public:
int value;
Node* prev;
Node* next;
Node(int v) : value(v), prev(nullptr), next(nullptr) {}
};
class DoublyLinkedList {
public:
DoublyLinkedList() : head(nullptr), tail(nullptr), size(0) {}
~DoublyLinkedList() {
while (head != nullptr) {
Node* temp = head;
head = head->next;
delete temp;
}
tail = nullptr;
size = 0;
}
bool empty() const {
return size == 0;
}
int length() const {
return size;
}
void push_front(int v) {
Node* newNode = new Node(v);
if (empty()) {
head = tail = newNode;
} else {
newNode->next = head;
head->prev = newNode;
head = newNode;
}
tail->next = head;
head->prev = tail;
size++;
}
void push_back(int v) {
if (empty()) {
push_front(v);
} else {
Node* newNode = new Node(v);
newNode->prev = tail;
tail->next = newNode;
tail = newNode;
tail->next = head;
head->prev = tail;
size++;
}
}
void pop_front() {
if (size == 1) {
delete head;
head = tail = nullptr;
size = 0;
} else if (!empty()) {
Node* temp = head;
head = head->next;
head->prev = tail;
tail->next = head;
delete temp;
size--;
}
}
void pop_back() {
if (size == 1) {
pop_front();
} else if (!empty()) {
Node* temp = tail;
tail = tail->prev;
tail->next = head;
head->prev = tail;
delete temp;
size--;
}
}
private:
Node* head;
Node* tail;
int size;
};
```
该类包含两个私有成员变量 `head` 和 `tail`,分别指向链表的头节点和尾节点,以及一个整型变量 `size` 表示链表的长度。类的公有成员函数包括:
- `empty()`:判断链表是否为空。
- `length()`:返回链表的长度。
- `push_front(int v)`:在链表头部插入一个值为 `v` 的节点。
- `push_back(int v)`:在链表尾部插入一个值为 `v` 的节点。
- `pop_front()`:删除链表头部的节点。
- `pop_back()`:删除链表尾部的节点。
注意,在插入第一个节点时,需要将 `head` 和 `tail` 都指向该节点,并且将该节点的 `next` 和 `prev` 指针都指向自身。在删除最后一个节点时,需要特别处理,即将 `head` 和 `tail` 都置为 `nullptr`。
可以使用以下代码进行测试:
```cpp
#include <iostream>
int main() {
DoublyLinkedList list;
std::cout << "Empty: " << list.empty() << std::endl;
std::cout << "Length: " << list.length() << std::endl;
list.push_back(1);
list.push_front(2);
list.push_back(3);
std::cout << "Empty: " << list.empty() << std::endl;
std::cout << "Length: " << list.length() << std::endl;
list.pop_front();
list.pop_back();
std::cout << "Empty: " << list.empty() << std::endl;
std::cout << "Length: " << list.length() << std::endl;
return 0;
}
```
怎么创建一个双向循环链表,用C++
要创建一个双向循环链表,你可以使用C++中的类来实现。下面是一个简单的示例代码:
```cpp
#include <iostream>
using namespace std;
// 双向循环链表节点类
class Node {
public:
int data;
Node* prev;
Node* next;
};
// 双向循环链表类
class DoublyLinkedList {
private:
Node* head;
public:
// 构造函数
DoublyLinkedList() {
head = nullptr;
}
// 在链表尾部插入节点
void insert(int value) {
// 创建新节点
Node* newNode = new Node();
newNode->data = value;
if (head == nullptr) {
// 如果链表为空,将新节点设为头结点
newNode->prev = newNode;
newNode->next = newNode;
head = newNode;
} else {
// 将新节点插入到链表尾部
Node* tail = head->prev;
tail->next = newNode;
newNode->prev = tail;
newNode->next = head;
head->prev = newNode;
}
}
// 打印链表
void display() {
if (head == nullptr) {
cout << "链表为空" << endl;
return;
}
Node* current = head;
do {
cout << current->data << " ";
current = current->next;
} while (current != head);
cout << endl;
}
};
int main() {
DoublyLinkedList dll;
dll.insert(1);
dll.insert(2);
dll.insert(3);
dll.display();
return 0;
}
```
在上述代码中,我们定义了一个`Node`类来表示双向循环链表的节点,包含节点的数据、指向前一个节点的指针`prev`和指向后一个节点的指针`next`。
然后,我们定义了`DoublyLinkedList`类来表示双向循环链表,其中包含一个指向头结点的指针`head`。在该类中,我们实现了一个`insert`方法来插入新节点到链表尾部,并且处理了链表为空和非空的情况。还实现了一个`display`方法来打印链表中的所有节点。
在`main`函数中,我们创建了一个`DoublyLinkedList`对象`dll`,并在其中插入一些节点,然后调用`display`方法打印链表中的节点值。
这样就完成了一个简单的双向循环链表的创建和打印。你可以根据需要在该基础上添加其他操作,如删除节点、查找节点等。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)