有一个带头结点的双链表L,其所有元素均为整数,设计一个算法删除所有奇数元素的节点 用C语言
时间: 2024-03-10 17:46:09 浏览: 93
C语言写的带有头结点的链表
以下是删除双链表中所有奇数节点的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
/* 删除所有奇数节点 */
void deleteOddNodes(Node* head) {
Node* p = head->next;
while (p != NULL) {
if (p->data % 2 == 1) {
p->prev->next = p->next;
if (p->next != NULL) {
p->next->prev = p->prev;
}
Node* tmp = p;
p = p->next;
free(tmp);
} else {
p = p->next;
}
}
}
int main() {
/* 创建双链表 */
Node* head = (Node*)malloc(sizeof(Node));
head->prev = NULL;
head->next = NULL;
Node* tail = head;
for (int i = 1; i <= 10; i++) {
Node* p = (Node*)malloc(sizeof(Node));
p->data = i;
p->prev = tail;
p->next = NULL;
tail->next = p;
tail = p;
}
/* 删除所有奇数节点 */
deleteOddNodes(head);
/* 输出双链表 */
Node* p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
/* 释放双链表空间 */
p = head->next;
while (p != NULL) {
Node* tmp = p;
p = p->next;
free(tmp);
}
free(head);
return 0;
}
```
以上代码中,我们定义了一个双链表的节点结构体 `Node`,其中包含了数据域 `data`、前驱指针 `prev` 和后继指针 `next`。然后我们实现了一个函数 `deleteOddNodes`,它的作用是删除双链表中所有奇数节点。具体实现过程是,从头节点的下一个节点开始遍历整个双链表,如果发现当前节点的数据域是奇数,则删除该节点,并将其前驱节点的后继指针指向其后继节点,将其后继节点的前驱指针指向其前驱节点,最后释放该节点的空间。如果当前节点的数据域是偶数,则继续遍历下一个节点。最后我们在 `main` 函数中创建了一个包含了 1~10 的整数的双链表,并调用了 `deleteOddNodes` 函数来删除其中的奇数节点,最后输出剩余的节点数据。
阅读全文