在没有stl的情况下用c ++创建通用链表

时间:2016-08-24 03:39:00

标签: c++ linked-list c++14

有人可以在没有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;
}

1 个答案:

答案 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 ++领域,但我只关注你的直接问题;之后继续休息。