功能要求:声明一个单向链表类模板,使之支持节点的升序插入、查找、删除等操作。 实现要求:用函数模板、类模板实现,以支持多种数据类型。 分析: 节点类模板NodeCls: 数据成员包括:数据Data、指向下一节点的指针 next 函数成员包括:构造函数 获取下一节点地址的函数 NextNode 获取当前节点数据的函数 GetData 单向链表类模板SinglyLinkedlist: 数据成员:表头指针head,表尾指针rear, 当前位置指针curpos, 上一结点位置指针fontpos, 节点个数NCount 函数成员包括:产生新节点函数NewNode 升序插入节点函数AscendingInsert 重置位置指针函数Reset 按值查找函数Find 输出链表节点函数Show
时间: 2024-02-22 17:59:42 浏览: 64
单向链表的类模板实现增加、删除、查找和打印
3星 · 编辑精心推荐
好的,我明白了您的问题。以下是对您的问题的回答:
对于您的功能要求和实现要求,您可以按照您所述的方式来实现一个单向链表类模板。您需要定义一个节点类模板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,并实现了升序插入、查找、删除等操作。您可以根据您的需要进行修改和扩展。
阅读全文