需要注意的是,程序中的Node类并没有考虑链表的头节点,删除节点时需要特殊处理。
时间: 2024-02-09 21:11:22 浏览: 60
是的,你说得对。在这个程序中,头节点并没有被明确地定义或者使用。我们可以在头节点之前定义一个虚拟节点,将其next指向第一个节点,这样就可以使用与其他节点相同的删除操作了。修改后的代码如下:
```
#include <iostream>
using namespace std;
template <class T>
class Node {
private:
Node* next;
public:
T data;
Node(T d = 0, Node* n = NULL) : data(d), next(n) {}
void insertAfter(Node* p);
void deleteAfter();
Node* nextNode() { return next; }
T getData() { return data; }
};
template<class T>
void Node<T>::insertAfter(Node* p) {
this->next = p->next;
p->next = this;
}
template<class T>
void Node<T>::deleteAfter() {
if (this->next != NULL) {
Node* temp = this->next;
this->next = temp->next;
delete temp;
}
}
int main() {
int a[10];
Node<int> n[10];
// cout << "输入10 个整数:" << endl;
for (int i = 0; i < 10; i++) {
cin >> a[i];
}
// 定义头节点
Node<int> header(0, &n[0]);
for (int i = 0; i < 9; i++) {
n[i].data = a[i];
n[i].insertAfter(&header);
}
n[9].data = a[9];
Node<int>* np = header.nextNode();
while (np != NULL) {
cout << np->data << ' ';
np = np->nextNode();
}
cout << endl;
int f;
// cout << "请输入要查找的数:";
cin >> f;
// 定义虚拟节点,其next指向头节点
Node<int> p(0, &header);
np = &p;
while (np->nextNode() != NULL) {
while (np->nextNode() != NULL && np->nextNode()->data == f)
np->deleteAfter();
if (np->nextNode() != NULL)
np = np->nextNode();
}
np = header.nextNode();
while (np != NULL) {
cout << np->data << ' ';
np = np->nextNode();
}
np = &header;
// 释放链表的内存空间
while (np->nextNode() != NULL)
np->deleteAfter();
cout << endl;
return 0;
}
```
在这个版本中,我们定义了一个头节点header,其next指向第一个节点。在遍历节点和删除节点时,我们都使用了header节点,从而避免了对头节点的特殊处理。
阅读全文