双向链表的定义,初始化,插入和删除的具体实现c代码
时间: 2023-08-31 07:22:11 浏览: 98
### 回答1:
双向链表是一种链式存储结构,它的每个节点都有两个指针,一个指向前驱节点,一个指向后继节点。下面是双向链表的定义和一些基本操作的具体实现。
```c
typedef struct Node {
int data;
struct Node *prev;
struct Node *next;
} Node;
// 双向链表初始化
Node* initList() {
Node *head = (Node*)malloc(sizeof(Node)); // 头节点
head->prev = NULL;
head->next = NULL;
return head;
}
// 双向链表插入节点
void insertNode(Node *head, int index, int value) {
Node *p = head;
int i = 0;
while (i < index && p->next != NULL) { // 找到要插入位置的前驱节点
p = p->next;
i++;
}
if (i != index) {
printf("插入位置不合法!\n");
return;
}
Node *newNode = (Node*)malloc(sizeof(Node)); // 创建新节点
newNode->data = value;
newNode->prev = p;
newNode->next = p->next;
if (p->next != NULL) {
p->next->prev = newNode;
}
p->next = newNode;
}
// 双向链表删除节点
void deleteNode(Node *head, int index) {
Node *p = head;
int i = 0;
while (i < index && p->next != NULL) { // 找到要删除的节点
p = p->next;
i++;
}
if (i != index || p->next == NULL) {
printf("删除位置不合法!\n");
return;
}
Node *deleteNode = p->next;
p->next = deleteNode->next;
if (deleteNode->next != NULL) {
deleteNode->next->prev = p;
}
free(deleteNode);
}
```
可以看到,双向链表的插入和删除操作比单向链表复杂一些,需要考虑前驱节点和后继节点的指针变化。但是,双向链表的优点也很明显,可以方便的实现双向遍历。
### 回答2:
双向链表是一种常用的链表结构,每个节点除了存储数据还有两个指针,分别指向前一个节点和后一个节点。
以下是双向链表的定义和初始化的C代码实现:
```
#include <stdio.h>
#include <stdlib.h>
struct Node {
int value;
struct Node* prev;
struct Node* next;
};
struct Node* initList() {
struct Node* head = (struct Node*)malloc(sizeof(struct Node)); //创建头节点
head->value = 0;
head->prev = NULL;
head->next = NULL;
return head;
}
```
双向链表的插入操作在指定位置之前插入一个新的节点。以下是双向链表插入的C代码实现:
```
void insertNode(struct Node* head, int position, int value) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); //创建新节点
newNode->value = value;
struct Node* p = head;
int i = 0;
while (p != NULL && i < position) {
p = p->next;
i++;
}
if (p == NULL) {
printf("插入位置无效\n");
return;
}
newNode->prev = p->prev;
newNode->next = p;
p->prev->next = newNode;
p->prev = newNode;
}
```
双向链表的删除操作删除指定位置的节点。以下是双向链表删除的C代码实现:
```
void deleteNode(struct Node* head, int position) {
struct Node* p = head->next;
int i = 0;
while (p != NULL && i < position) {
p = p->next;
i++;
}
if (p == NULL) {
printf("删除位置无效\n");
return;
}
p->prev->next = p->next;
if (p->next != NULL) {
p->next->prev = p->prev;
}
free(p);
}
```
以上是双向链表定义、初始化、插入和删除的C代码实现。使用这些代码可以创建并操作双向链表,进行数据的插入和删除。
### 回答3:
双向链表是一种常见的数据结构,其定义为每个节点除了有指向下一个节点的指针外,还有指向前一个节点的指针。以下是双向链表的定义、初始化、插入和删除的具体实现C代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义双向链表节点
typedef struct node {
int data; // 节点数据
struct node* prev; // 指向前一个节点的指针
struct node* next; // 指向下一个节点的指针
} Node;
// 初始化双向链表
Node* initDoublyLinkedList() {
Node* head = (Node*)malloc(sizeof(Node)); // 创建头节点
head->prev = NULL;
head->next = NULL;
return head;
}
// 在双向链表的指定位置插入节点
void insertNode(Node* head, int position, int data) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新节点
newNode->data = data;
Node* p = head;
int index = 0;
// 移动到指定位置的节点
while (p->next && index < position) {
p = p->next;
index++;
}
// 重新链接节点
newNode->prev = p;
newNode->next = p->next;
if (p->next) {
p->next->prev = newNode;
}
p->next = newNode;
}
// 在双向链表的指定位置删除节点
void deleteNode(Node* head, int position) {
Node* p = head;
int index = 0;
// 移动到指定位置的节点
while (p->next && index < position) {
p = p->next;
index++;
}
// 重新链接节点
if (p->next && p->next->next) {
p->next->next->prev = p;
}
Node* deletedNode = p->next;
p->next = p->next->next;
free(deletedNode);
}
int main() {
Node* head = initDoublyLinkedList(); // 初始化双向链表
insertNode(head, 0, 1); // 在头节点之后插入节点
insertNode(head, 1, 2); // 在第一个节点之后插入节点
insertNode(head, 2, 3); // 在第二个节点之后插入节点
deleteNode(head, 1); // 删除第一个节点后的节点
// 输出双向链表中的节点数据
Node* p = head->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
return 0;
}
```
以上代码中,双向链表的头节点在初始化时被创建,并且在插入和删除节点的过程中,通过操作节点的指针来链接节点的前后关系。在具体使用时,可以根据需要修改代码中的数据类型,并根据实际情况处理边界条件。
阅读全文