void Reset() { curpos = fontpos = nullptr; } NodeCls<T>* Find(T data) { curpos = head; while (curpos != nullptr && curpos->Data != data) { fontpos = curpos; curpos = curpos->next; } return curpos; } void Show() { curpos = head; while (curpos != nullptr) { cout << curpos->Data << " "; curpos = curpos->next; } cout << endl; } private: NodeCls<T>* head; NodeCls<T>* rear; NodeCls<T>* curpos; NodeCls<T>* fontpos; int NCount; }; int main() { SinglyLinkedList<int> list; list.AscendingInsert(5); list.AscendingInsert(3); list.AscendingInsert(7); list.AscendingInsert(1); list.Show(); NodeCls<int>* p = list.Find(3); if (p != nullptr) { cout << "Found: " << p->GetData() << endl; } return 0; }
时间: 2024-01-31 11:04:55 浏览: 29
这是一个使用 `SinglyLinkedList` 类的示例程序。程序创建了一个 `SinglyLinkedList` 类型的对象 `list`,然后调用 `AscendingInsert` 方法四次,将四个整数插入到链表中。接着调用 `Show` 方法,打印链表中的所有节点数据。
程序接着调用 `Find` 方法,查找链表中数据为 3 的节点。如果找到了,则打印该节点的数据。最后程序返回 0。
整个程序的输出结果为:
```
1 3 5 7
Found: 3
```
可以看到,程序按照升序将四个整数插入到链表中,并成功找到了数据为 3 的节点并打印了该节点的数据。
相关问题
template <typename T> class SinglyLinkedList { public: SinglyLinkedList() : head(nullptr), rear(nullptr), curpos(nullptr), fontpos(nullptr), NCount(0) {} NodeCls<T>* NewNode(T data) { NodeCls<T>* p = new NodeCls<T>(data); return p; } void AscendingInsert(T data) { NodeCls<T>* p = NewNode(data); if (head == nullptr) { head = rear = p; } else if (p->Data <= head->Data) { p->next = head; head = p; } else if (p->Data >= rear->Data) { rear->next = p; rear = p; } else { curpos = head; while (curpos != nullptr && curpos->Data < p->Data) { fontpos = curpos; curpos = curpos->next; } fontpos->next = p; p->next = curpos; } NCount++; }
这是一个模板类 `SinglyLinkedList`,它表示一个单向链表。该类包含一个头指针 `head`、一个尾指针 `rear`、一个当前节点指针 `curpos`、一个当前节点前一个节点指针 `fontpos` 和一个整型成员 `NCount`,分别表示链表的头部、尾部、当前节点、当前节点前一个节点和链表中节点的数量。
类中定义了一个 `NewNode` 方法,用于创建一个新的节点,并返回指向该节点的指针。
类中定义了一个 `AscendingInsert` 方法,用于按照升序将一个新的节点插入到链表中。具体实现如下:
1. 调用 `NewNode` 方法创建一个新的节点 `p`。
2. 如果链表为空,将头指针和尾指针都指向新节点 `p`。
3. 如果新节点 `p` 的数据小于等于头节点的数据,将新节点 `p` 插入到头节点之前,然后更新头指针。
4. 如果新节点 `p` 的数据大于等于尾节点的数据,将新节点 `p` 插入到尾节点之后,然后更新尾指针。
5. 如果新节点 `p` 的数据在头节点和尾节点之间,从头节点开始遍历链表,找到第一个大于等于新节点 `p` 的节点 `curpos`,记录当前节点的前一个节点 `fontpos`,然后将新节点 `p` 插入到 `fontpos` 和 `curpos` 之间。
6. 更新节点数量计数器 `NCount`。
该类可以用于实现单向链表数据结构,并支持按照升序插入新节点。
功能要求:声明一个单向链表类模板,使之支持节点的升序插入、查找、删除等操作。 实现要求:用函数模板、类模板实现,以支持多种数据类型。 分析: 节点类模板NodeCls: 数据成员包括:数据Data、指向下一节点的指针 next 函数成员包括:构造函数 获取下一节点地址的函数 NextNode 获取当前节点数据的函数 GetData 单向链表类模板SinglyLinkedlist: 数据成员:表头指针head,表尾指针rear, 当前位置指针curpos, 上一结点位置指针fontpos, 节点个数NCount 函数成员包括:产生新节点函数NewNode 升序插入节点函数AscendingInsert 重置位置指针函数Reset 按值查找函数Find 输出链表节点函数Show
好的,我明白了您的问题。以下是对您的问题的回答:
对于您的功能要求和实现要求,您可以按照您所述的方式来实现一个单向链表类模板。您需要定义一个节点类模板NodeCls,它包括数据成员和函数成员。接着,您需要定义一个单向链表类模板SinglyLinkedlist,它包括数据成员和函数成员。您需要使用函数模板和类模板来实现,以支持多种数据类型。
下面是一个示例代码:
```cpp
#include <iostream>
using namespace std;
template <typename T>
class NodeCls
{
public:
T Data;
NodeCls<T>* next;
NodeCls(T data) : Data(data), next(nullptr) {}
NodeCls<T>* NextNode() const
{
return next;
}
T GetData() const
{
return Data;
}
};
template <typename T>
class SinglyLinkedList
{
public:
SinglyLinkedList() : head(nullptr), rear(nullptr), curpos(nullptr), fontpos(nullptr), NCount(0) {}
NodeCls<T>* NewNode(T data)
{
NodeCls<T>* p = new NodeCls<T>(data);
return p;
}
void AscendingInsert(T data)
{
NodeCls<T>* p = NewNode(data);
if (head == nullptr) {
head = rear = p;
}
else if (p->Data <= head->Data) {
p->next = head;
head = p;
}
else if (p->Data >= rear->Data) {
rear->next = p;
rear = p;
}
else {
curpos = head;
while (curpos != nullptr && curpos->Data < p->Data) {
fontpos = curpos;
curpos = curpos->next;
}
fontpos->next = p;
p->next = curpos;
}
NCount++;
}
void Reset()
{
curpos = fontpos = nullptr;
}
NodeCls<T>* Find(T data)
{
curpos = head;
while (curpos != nullptr && curpos->Data != data) {
fontpos = curpos;
curpos = curpos->next;
}
return curpos;
}
void Show()
{
curpos = head;
while (curpos != nullptr) {
cout << curpos->Data << " ";
curpos = curpos->next;
}
cout << endl;
}
private:
NodeCls<T>* head;
NodeCls<T>* rear;
NodeCls<T>* curpos;
NodeCls<T>* fontpos;
int NCount;
};
int main()
{
SinglyLinkedList<int> list;
list.AscendingInsert(5);
list.AscendingInsert(3);
list.AscendingInsert(7);
list.AscendingInsert(1);
list.Show();
NodeCls<int>* p = list.Find(3);
if (p != nullptr) {
cout << "Found: " << p->GetData() << endl;
}
return 0;
}
```
在这个示例代码中,我们定义了一个节点类模板NodeCls和一个单向链表类模板SinglyLinkedList,并实现了升序插入、查找、删除等操作。您可以根据您的需要进行修改和扩展。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)