双向循环链表基本操作
时间: 2024-03-30 12:26:16 浏览: 15
双向循环链表是一种链表结构,每个节点都有指向前一个节点和后一个节点的指针,同时头节点的前驱指针指向尾节点,尾节点的后继指针指向头节点。基本操作包括以下几种:
1. 创建链表:可以创建一个空链表或者带有初始元素的链表。创建空链表时,将头节点和尾节点指向自身,同时前驱和后继指针为空。
2. 插入节点:可以在链表的任意位置插入新的节点。需要注意的是,在插入节点之前需要先找到要插入位置的前一个节点,然后修改前一个节点的后继指针和后一个节点的前驱指针,以及新节点的前驱和后继指针。
3. 删除节点:可以删除链表中的任意节点。同样需要先找到要删除的节点,然后修改前一个节点的后继指针和后一个节点的前驱指针,将要删除的节点从链表中断开。
4. 查找节点:可以根据给定的值或者位置查找链表中的节点。从头节点开始遍历链表,直到找到目标节点或者遍历完整个链表。
5. 遍历链表:可以按照顺序遍历整个链表,输出每个节点的值。
这些是双向循环链表的基本操作,可以根据实际需求进行扩展和优化。希望对你有所帮助!
相关问题
c语言双向循环链表基本操作,请用代码展示
以下是 C 语言双向循环链表的基本操作代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* prev;
struct Node* next;
};
struct Node* head = NULL;
// 在链表末尾插入节点
void insert(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
head->prev = head;
head->next = head;
} else {
struct Node* lastNode = head->prev;
lastNode->next = newNode;
newNode->prev = lastNode;
newNode->next = head;
head->prev = newNode;
}
}
// 在链表中删除节点
void delete(int data) {
if (head == NULL) {
printf("链表为空,无法删除节点!\n");
return;
}
struct Node* currentNode = head;
while (currentNode->data != data) {
currentNode = currentNode->next;
if (currentNode == head) {
printf("链表中没有该节点!\n");
return;
}
}
if (currentNode == head) {
head = head->next;
}
struct Node* prevNode = currentNode->prev;
struct Node* nextNode = currentNode->next;
prevNode->next = nextNode;
nextNode->prev = prevNode;
free(currentNode);
}
// 在链表中查找节点
void search(int data) {
if (head == NULL) {
printf("链表为空,无法查找节点!\n");
return;
}
struct Node* currentNode = head;
while (currentNode->data != data) {
currentNode = currentNode->next;
if (currentNode == head) {
printf("链表中没有该节点!\n");
return;
}
}
printf("链表中存在节点 %d\n", data);
}
// 打印链表中的所有节点
void print() {
if (head == NULL) {
printf("链表为空,无法打印节点!\n");
return;
}
struct Node* currentNode = head;
do {
printf("%d ", currentNode->data);
currentNode = currentNode->next;
} while (currentNode != head);
printf("\n");
}
int main() {
insert(1);
insert(2);
insert(3);
insert(4);
insert(5);
print(); // 输出:1 2 3 4 5
delete(3);
print(); // 输出:1 2 4 5
search(4); // 输出:链表中存在节点 4
return 0;
}
```
以上代码实现了双向循环链表的基本操作,包括在链表末尾插入节点、在链表中删除节点、在链表中查找节点以及打印链表中的所有节点。
双向循环链表的基本操作
双向循环链表是一种链表结构,它的每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。与单向链表不同的是,双向循环链表的头节点的前一个节点指向尾节点,尾节点的后一个节点指向头节点,形成一个循环。以下是双向循环链表的基本操作:
1. 头文件
```c
#include <stdio.h>
#include <stdlib.h>
```
2. 双向链表的基本结构
```c
typedef struct node {
int data;
struct node *prev; // 指向前一个节点
struct node *next; // 指向后一个节点
} Node, *DoubleLinkedList;
```
3. 初始化双链表
```c
DoubleLinkedList init() {
DoubleLinkedList head = (DoubleLinkedList)malloc(sizeof(Node));
head->prev = head;
head->next = head;
return head;
}
```
4. 双链表判空
```c
int isEmpty(DoubleLinkedList head) {
return head->next == head;
}
```
5. 双链表尾插
```c
void insertTail(DoubleLinkedList head, int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = head->prev;
newNode->next = head;
head->prev->next = newNode;
head->prev = newNode;
}
```
6. 双链表头插
```c
void insertHead(DoubleLinkedList head, int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = head;
newNode->next = head->next;
head->next->prev = newNode;
head->next = newNode;
}
```
7. 创建一个新节点
```c
Node *createNode(int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
```
8. 在某一节点前插入一个新节点
```c
void insertBefore(DoubleLinkedList head, Node *node, int data) {
Node *newNode = createNode(data);
newNode->prev = node->prev;
newNode->next = node;
node->prev->next = newNode;
node->prev = newNode;
}
```
9. 删除当前节点
```c
void deleteNode(DoubleLinkedList head, Node *node) {
node->prev->next = node->next;
node->next->prev = node->prev;
free(node);
}
```
10. 双链表头删
```c
void deleteHead(DoubleLinkedList head) {
if (isEmpty(head)) {
printf("List is empty.\n");
return;
}
deleteNode(head, head->next);
}
```
11. 双链表尾删
```c
void deleteTail(DoubleLinkedList head) {
if (isEmpty(head)) {
printf("List is empty.\n");
return;
}
deleteNode(head, head->prev);
}
```
12. 双链表打印
```c
void printList(DoubleLinkedList head) {
if (isEmpty(head)) {
printf("List is empty.\n");
return;
}
Node *p = head->next;
while (p != head) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
```
13. 查找
```c
Node *search(DoubleLinkedList head, int data) {
Node *p = head->next;
while (p != head) {
if (p->data == data) {
return p;
}
p = p->next;
}
return NULL;
}
```
14. 销毁双链表
```c
void destroy(DoubleLinkedList head) {
Node *p = head->next;
while (p != head) {
Node *temp = p;
p = p->next;
free(temp);
}
free(head);
}
```