有人可以在没有generic linkedlist
的情况下帮助创建STL
。如何在main中声明head。它是struct node<> * head?或struct node * head?我使用两者都出错了,它就像模板声明不能出现在块范围
#include <iostream>
using namespace std;
template<class T>
struct node
{
T data;
struct node<T>* next;
};
template<class T>
void Push(struct node<T>** H,T dat)
{
struct node<T> * newnode=(struct node<T> * )malloc(sizeof(struct node<T>)) ;
newnode->data=dat;
newnode->next=*H;
*H=newnode;
}
int main() {
struct node<>* head=NULL;
struct node<>* current;
int a=10;
float f=10.1;
Push<int>(&head,a);
Push<float>(&head,f);
current=head;
while(current)
{
cout<<current->data;
current=current->next;
}
//code
return 0;
}
答案 0 :(得分:1)
首先,这是C和C ++风格编程的奇怪组合。但是,让我们忽略这一点,并专注于你真正的问题。您的主要问题是,在引用node
时,您未指定类型参数(使用时应为node<T>
)。所以将第一位改为:
template<class T>
struct node
{
T data;
struct node<T>* next;
};
template<class T>
void Push(struct node<T>** H,T dat) // <-- now we use node<T> everywhere
{
struct node<T> * newnode=(struct node<T> * )malloc(sizeof(struct node<T>)) ;
newnode->data=dat;
newnode->next=*H;
*H=newnode;
}
应该让你到达你需要去的地方。在那里,您在node<T>
中的任何地方都正确地将其称为Push
。同样适用于main()
。现在malloc
将起作用,因为node<T>
确实具有一定的大小。
也就是说,您会发现使用node<T> *example = new node<T>
和delete example
更加清晰。
还有许多其他改进可以将其更多地转移到C ++领域,但我只关注你的直接问题;之后继续休息。