数据结构c语言编写程序实现双向链表的建立、插入、删除的基本操作
时间: 2024-09-29 12:06:09 浏览: 35
在C语言中,双向链表是一种常见的数据结构,它包含两个指针域,分别指向前一个节点和后一个节点。下面是基本操作的实现:
1. **建立双向链表**:
- 定义一个结构体,比如`struct Node`,包含两个成员:`data`用于存储数据,`prev`和`next`分别表示前一个节点和后一个节点的引用。
```c
struct Node {
int data;
struct Node* prev;
struct Node* next;
};
```
- 创建链表头结点并初始化为空,如果需要的话。
```c
struct Node* head = NULL;
```
2. **插入元素**:
- 插入到头部:创建新节点,设置其`prev`指向头结点,`next`也指向头结点,然后更新头结点的`next`指针。
```c
void insertAtBeginning(int value) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = value;
newNode->prev = NULL;
newNode->next = head;
if (head != NULL)
head->prev = newNode;
head = newNode;
}
```
- 插入到中间或尾部:找到插入位置的前一个节点,然后设置新节点的指针。
```c
void insertAfter(struct Node* prevNode, int value) {
if (prevNode == NULL) return; // 防止越界
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = value;
newNode->prev = prevNode;
newNode->next = prevNode->next;
if (newNode->next)
newNode->next->prev = newNode;
prevNode->next = newNode;
}
```
3. **删除元素**:
- 删除头结点:特殊处理,只需更新头结点为原头结点的下一个节点,释放旧头结点的内存。
```c
void deleteHead() {
if (head == NULL) return;
struct Node* temp = head;
head = head->next;
free(temp);
}
```
- 删除指定节点:遍历链表找到目标节点,然后调整前后节点的指针。
```c
void deleteNode(struct Node* target) {
if (target == NULL) return;
if (target == head) {
deleteHead();
} else {
struct Node* current = head;
while (current->next != target) {
current = current->next;
}
current->next = target->next;
if (target->next)
target->next->prev = current;
free(target);
}
}
```
阅读全文