帮我写一个c语言的双向链表
时间: 2023-09-15 07:05:47 浏览: 92
C语言双向链表
5星 · 资源好评率100%
### 回答1:
好的,我可以帮您写一个C语言的双向链表。以下是代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 双向链表节点结构体
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
// 创建双向链表
Node* createList(int arr[], int n) {
Node* head = (Node*)malloc(sizeof(Node));
head->prev = NULL;
head->next = NULL;
Node* p = head;
for (int i = ; i < n; i++) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = arr[i];
node->prev = p;
node->next = NULL;
p->next = node;
p = node;
}
return head;
}
// 插入节点
void insertNode(Node* head, int index, int data) {
Node* p = head;
for (int i = ; i < index && p != NULL; i++) {
p = p->next;
}
if (p == NULL) {
printf("插入位置无效\n");
return;
}
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->prev = p->prev;
node->next = p;
p->prev->next = node;
p->prev = node;
}
// 删除节点
void deleteNode(Node* head, int index) {
Node* p = head;
for (int i = ; i < index && p != NULL; i++) {
p = p->next;
}
if (p == NULL) {
printf("删除位置无效\n");
return;
}
p->prev->next = p->next;
p->next->prev = p->prev;
free(p);
}
// 打印链表
void printList(Node* head) {
Node* p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(int);
Node* head = createList(arr, n);
printList(head);
insertNode(head, 2, 6);
printList(head);
deleteNode(head, 4);
printList(head);
return ;
}
```
希望能帮到您!
### 回答2:
双向链表是一种常见的数据结构,它允许在两个方向上遍历和操作数据。下面是一个用C语言实现的双向链表的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 双向链表的节点结构
typedef struct Node {
int data; // 数据域
struct Node* prev; // 指向前一个节点的指针
struct Node* next; // 指向后一个节点的指针
} Node;
// 在链表尾部插入节点
void insertAtEnd(Node** head, int value) {
// 创建新节点
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
// 如果链表为空,则将新节点设为头节点
if (*head == NULL) {
newNode->prev = NULL;
*head = newNode;
return;
}
// 找到链表的最后一个节点
Node* last = *head;
while (last->next != NULL) {
last = last->next;
}
// 在最后一个节点后插入新节点
last->next = newNode;
newNode->prev = last;
}
// 打印链表中的所有节点
void printList(Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
Node* head = NULL;
// 在链表尾部插入节点
insertAtEnd(&head, 1);
insertAtEnd(&head, 2);
insertAtEnd(&head, 3);
// 打印链表中的节点
printf("双向链表中的节点为: ");
printList(head);
return 0;
}
```
上述代码实现了双向链表的插入和打印功能。我们可以调用`insertAtEnd`函数在链表的尾部插入节点,然后使用`printList`函数打印链表中的所有节点。这样我们就可以创建、插入和打印双向链表了。
### 回答3:
双向链表是一种常用的数据结构,它可以在序列中方便地进行插入、删除和查找操作。下面是一个简单的C语言双向链表的实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义双向链表节点
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
// 创建新的节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
// 在双向链表头部插入节点
void insertAtHead(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
} else {
newNode->next = *head;
(*head)->prev = newNode;
*head = newNode;
}
}
// 在双向链表尾部插入节点
void insertAtTail(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
} else {
Node* currentNode = *head;
while (currentNode->next != NULL) {
currentNode = currentNode->next;
}
currentNode->next = newNode;
newNode->prev = currentNode;
}
}
// 打印双向链表
void printList(Node* head) {
Node* currentNode = head;
while (currentNode != NULL) {
printf("%d ", currentNode->data);
currentNode = currentNode->next;
}
printf("\n");
}
int main() {
Node* head = NULL; // 双向链表头指针
insertAtHead(&head, 3); // 在头部插入节点
insertAtHead(&head, 2);
insertAtHead(&head, 1);
printList(head); // 打印链表:1 2 3
insertAtTail(&head, 4); // 在尾部插入节点
insertAtTail(&head, 5);
printList(head); // 打印链表:1 2 3 4 5
return 0;
}
```
以上示例代码展示了如何创建、插入和打印一个简单的双向链表。你可以根据需要进行自定义操作和扩展。记得在程序结束后使用`free`函数释放动态内存。
阅读全文