请用C++完成下列代码:下面有结构node的定义,指针head中存放着node节点组成的单链表的首节点地址,函数odd(head)获取head指向链表中的序号(注意不是node结构的data字段,且序号从0开始编号)为奇数的节点,并将这些节点按原有序组成新链表返回。要求新链表中的节点采用动态内存分配的方式构建,从而不破坏原链表。如:head指向的链表为:1->2->3->4->5->6,则odd(head)得到的链表为:2->4->6。请完成函数odd的编写。 struct node { //链表节点定义 int data; node* next; }; node* odd(node* h)
时间: 2024-04-08 08:31:03 浏览: 76
下面是使用动态内存分配构建新链表的odd函数的C++实现:
```cpp
#include <iostream>
struct node { //链表节点定义
int data;
node* next;
};
node* odd(node* h) {
node* newHead = nullptr; // 新链表的头节点
node* newTail = nullptr; // 新链表的尾节点
while (h != nullptr) {
if (h->data % 2 == 0) { // 如果节点序号为偶数
if (newHead == nullptr) { // 如果新链表为空,则设置新链表的头节点和尾节点为当前节点
newHead = new node;
newHead->data = h->data;
newHead->next = nullptr;
newTail = newHead;
} else { // 否则,在新链表尾部添加当前节点
newTail->next = new node;
newTail = newTail->next;
newTail->data = h->data;
newTail->next = nullptr;
}
}
h = h->next; // 继续遍历原链表的下一个节点
}
return newHead;
}
// 用于打印链表的辅助函数
void printList(node* head) {
while (head != nullptr) {
std::cout << head->data << "->";
head = head->next;
}
std::cout << "nullptr" << std::endl;
}
int main() {
// 创建示例链表:1->2->3->4->5->6
node* head = new node;
head->data = 1;
head->next = new node;
head->next->data = 2;
head->next->next = new node;
head->next->next->data = 3;
head->next->next->next = new node;
head->next->next->next->data = 4;
head->next->next->next->next = new node;
head->next->next->next->next->data = 5;
head->next->next->next->next->next = new node;
head->next->next->next->next->next->data = 6;
head->next->next->next->next->next->next = nullptr;
std::cout << "Original list: ";
printList(head);
node* newHead = odd(head);
std::cout << "Modified list: ";
printList(newHead);
// 释放动态分配的内存
while (newHead != nullptr) {
node* temp = newHead;
newHead = newHead->next;
delete temp;
}
return 0;
}
```
在示例代码中,我提供了一个用于创建示例链表和打印链表的辅助函数。你可以根据需要修改并测试该函数。odd函数遍历原链表,将序号为偶数的节点添加到新链表中,并返回新链表的头节点。请注意,为了避免内存泄漏,我们在使用完新链表后需要释放动态分配的内存。
阅读全文