C语言数据结构双向循环链表
时间: 2023-11-26 10:42:56 浏览: 53
双向循环链表是一种常用的链表结构,它与单向链表相比具有更好的灵活性和操作效率。在C语言中,实现双向循环链表需要定义一个链表节点结构体,其中包含指向前驱节点和后继节点的指针,以及存储数据的成员。以下是一个示例的C语言代码来初始化一个双向循环链表:
```
typedef int LTDataType;
typedef struct ListNode {
struct ListNode* next;
struct ListNode* prev;
LTDataType data;
} LTNode;
void InitDList(LTNode** pHead) {
*pHead = (LTNode*)malloc(sizeof(LTNode));
(*pHead)->next = *pHead;
(*pHead)->prev = *pHead;
}
```
在上述代码中,`InitDList`函数用于初始化一个双向循环链表,它使用一个头节点指针作为参数,通过动态内存分配来创建一个头节点,并将头节点的`next`和`prev`指针均指向自身,从而形成一个空的循环链表。
相关问题
c语言实现双向循环链表
双向循环链表是一种常用的数据结构之一,可以在链表中进行快速的插入、删除和查找操作。以下是一种简单的C语言实现双向循环链表的代码:
```
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *prev;
struct node *next;
};
struct node *createNode(int data) {
struct node *newNode = (struct node*)malloc(sizeof(struct node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
void insertAtBegin(struct node **head, int data) {
struct node *newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
(*head)->next = *head;
(*head)->prev = *head;
} else {
struct node *last = (*head)->prev;
newNode->next = *head;
newNode->prev = last;
last->next = newNode;
(*head)->prev = newNode;
*head = newNode;
}
}
void insertAtEnd(struct node **head, int data) {
struct node *newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
(*head)->next = *head;
(*head)->prev = *head;
} else {
struct node *last = (*head)->prev;
newNode->prev = last;
newNode->next = *head;
last->next = newNode;
(*head)->prev = newNode;
}
}
void deleteNode(struct node **head, int data) {
if (*head == NULL) {
printf("List is empty.\n");
return;
}
struct node *cur = *head;
struct node *prev = NULL;
while (cur->data != data && cur->next != *head) {
prev = cur;
cur = cur->next;
}
if (cur->data != data) {
printf("%d not found in list.\n", data);
return;
}
if (cur == *head && cur->next == *head) {
*head = NULL;
free(cur);
return;
}
if (cur == *head) {
*head = cur->next;
}
struct node *next = cur->next;
prev->next = next;
next->prev = prev;
free(cur);
}
void displayList(struct node *head) {
if (head == NULL) {
printf("List is empty.\n");
return;
}
printf("List: ");
struct node *cur = head;
do {
printf("%d ", cur->data);
cur = cur->next;
} while (cur != head);
printf("\n");
}
int main() {
struct node *head = NULL;
insertAtBegin(&head, 10);
insertAtBegin(&head, 20);
insertAtEnd(&head, 30);
insertAtEnd(&head, 40);
displayList(head);
deleteNode(&head, 20);
deleteNode(&head, 50);
displayList(head);
return 0;
}
```
在这个例子中,我们使用了一个结构体来存储每个节点的数据和指向前一个和后一个节点的指针。我们还定义了一些操作函数,如创建新节点、在链表头部和尾部插入新节点、删除节点和显示链表等。在主函数中,我们创建了一个双向循环链表并进行了一些操作,最后输出链表的内容。
双向循环链表数据修改
双向循环链表是一种特殊的链表,其中每个节点都有一个指向前一个节点和后一个节点的指针。要修改双向循环链表中的数据,可以按照以下步骤进行操作:
1. 遍历链表,找到要修改数据的节点。
2. 更新节点的数据。
具体实现过程如下(以C语言为例):
```C
// 定义双向循环链表节点结构
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
// 修改双向循环链表中的数据
void modifyData(Node* head, int targetData, int newData) {
Node* current = head; // 从头节点开始遍历
do {
if (current->data == targetData) {
current->data = newData; // 更新数据
break;
}
current = current->next;
} while (current != head); // 遍历直到回到头节点
}
```
在上述代码中,`modifyData` 函数接收双向循环链表的头节点 `head`、目标数据 `targetData` 和新数据 `newData` 作为参数。函数通过遍历链表找到目标节点,并将其数据更新为新数据。
请注意,这只是一个简单的示例,实际应用中可能需要考虑更多的情况,比如处理链表为空或目标数据不存在的情况。此外,还要确保在修改链表时正确更新节点的前驱和后继指针,以保持链表的循环性。