数据结构(C++)–学习单链表时发现的一些小坑

#include<bits stdc++.h>
using namespace std;
const int MaxSize = 10;
template <class t>
class Seqlist {
    public:
        Seqlist() { length = 0;}
        Seqlist(T [],int);
    private:
        int length;
        T data[MaxSize];
};
class B {
    public:
        B(T);
        B() {} //&#x8FD9;&#x4E2A;&#x9ED8;&#x8BA4;&#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;&#x5341;&#x5206;&#x91CD;&#x8981;
    private:
        T data;
};
B::B(T n) {
    data = n;
}

template <class t>
Seqlist<t>::Seqlist(T arr[], int n) {
    if (n > MaxSize) throw "invalid num";
    for (int i = 0;i < n;i++) {
        data[i] = arr[i];
    }
    length = n;
}

int main() {
    B b[3] = {B(10), B(20), B(30)};
    Seqlist<b> list(b,3);
}
</b></t></class></class></bits>

在上面部分代码中,如果把有注释的那一行代码删去,则这部分代码不能正常运行,报错信息是

no matching function for call to 'B::B()'[25, 35]

根据这个报错信息找到相应行数,居然在 int n这里报错,我寻思着这关n什么事,后面查阅了资料,原因出在第34行的 B b[3]这里,定义了一个B类型的数组,没有参数传入,而B类中无适配该成员的构造函数,于是编译器报错

解决方法是,加上相应的构造函数 B() {}

#include<bits stdc++.h>
using namespace std;
template <class t>
struct Node {
    T data;
    Node<t>* next;
};

template <class t>
class LinkList {
    public:
        LinkList(); // create an empty list
        LinkList(T[], int);
        //~LinkList();

        void Reverse(Node<t>* head);
        Node<t>* Copy(Node<t>* head);
        Node<t>* first;
}

template <class t>
LinkList<t>::LinkList() {
    first = new Node<t>;
    first->next = NULL;
}

template <class t>
LinkList<t>::LinkList(T arr[], int n) {
    first = new Node<t>;
    Node<t>* p = first;
    for (int i = 0;i < n;i++) {
        Node<t>* s = new Node<t>;
        s->data = arr[i];
        p->next = s;//&#x8BA9;first&#x6307;&#x5411;&#x7B2C;&#x4E00;&#x4E2A;&#x8282;&#x70B9;
        p = s;//&#x867D;&#x8BF4;&#x628A;s&#x7684;&#x5730;&#x5740;&#x8D4B;&#x7ED9;p&#xFF0C;&#x4F46;&#x662F;first&#x7684;&#x5730;&#x5740;&#x548C;p&#x4E0D;&#x4E00;&#x6837;&#xFF0C;&#x5BF9;p&#x64CD;&#x4F5C;&#x4E0D;&#x4F1A;&#x6539;&#x53D8;first
        //&#x56E0;&#x6B64;first&#x6C38;&#x8FDC;&#x6307;&#x5411;&#x94FE;&#x8868;&#x7B2C;&#x4E00;&#x4E2A;&#x4F4D;&#x7F6E;
    }
    p->next = NULL;
}

template <class t>
void LinkList<t>::Reverse(Node<t>* head) {
    Node<t>* pre, *cur;
    cur = head->next;
    head->next = NULL;
    while (cur) {
        pre = cur;//&#x8BA9;&#x5F53;&#x524D;&#x8282;&#x70B9;&#x7684;&#x4E0A;&#x4E00;&#x8282;&#x70B9;&#x79FB;&#x52A8;&#x5230;&#x5F53;&#x524D;&#x8282;&#x70B9;&#x4F4D;&#x7F6E;
        cur = cur->next;//&#x5F53;&#x524D;&#x8282;&#x70B9;&#x79FB;&#x52A8;&#x5230;&#x4E0B;&#x4E00;&#x4E2A;&#x4F4D;&#x7F6E;
        pre->next = head->next;//&#x8FD9;&#x4E00;&#x64CD;&#x4F5C;&#x5C31;&#x662F;&#x8BA9;pre&#x4E0D;&#x65AD;&#x6307;&#x5411;&#x524D;&#x4E00;&#x4E2A;&#x8282;&#x70B9;
        head->next = pre;//&#x66F4;&#x65B0;&#x8282;&#x70B9;&#xFF0C;&#x8BA9;head&#x7684;next&#x6307;&#x5411;pre
    }
    //&#x5728;&#x753B;&#x56FE;&#x7406;&#x89E3;&#x65F6;&#xFF0C;&#x8981;&#x8BA9;cur&#x548C;pre&#x540C;&#x65F6;&#x5411;&#x540E;&#x79FB;&#x52A8;
    //&#x8FD9;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x5EFA;&#x8BAE;&#x81EA;&#x5DF1;&#x5728;&#x7EB8;&#x4E0A;&#x753B;&#x51FA;&#x82E5;&#x5E72;&#x4E2A;&#x8282;&#x70B9;&#x548C;&#x7528;&#x4E09;&#x4E2A;&#x5C0F;&#x90E8;&#x4EF6;(&#x4EE3;&#x8868;&#x4E09;&#x4E2A;&#x6307;&#x9488;)&#x6A21;&#x62DF;&#x4E00;&#x8FB9;&#x624D;&#x80FD;&#x591F;&#x771F;&#x6B63;&#x5730;&#x7406;&#x89E3;
}
//&#x590D;&#x76D8;&#x65F6;&#x81EA;&#x5DF1;&#x6709;&#x4E2A;&#x5C0F;&#x7EC6;&#x8282;&#x6CA1;&#x6CE8;&#x610F;&#x5230;&#xFF0C;&#x8FD9;&#x91CC;&#x90FD;&#x662F;&#x6307;&#x9488;&#x53D8;&#x91CF;&#x7684;&#x8D4B;&#x503C;&#x64CD;&#x4F5C;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x8D4B;&#x503C;&#x53EA;&#x662F;&#x8D4B;&#x4E88;&#x5730;&#x5740;&#xFF0C;&#x7ED9;&#x4E88;&#x8005;&#x7684;&#x503C;&#x6539;&#x53D8;&#xFF0C;&#x63A5;&#x6536;&#x8005;&#x7684;&#x503C;&#x4E0D;&#x4F1A;&#x6539;&#x53D8;

template <class t>
Node<t>* LinkList<t>::Copy(Node<t>* head) {
    Node<t>* headB = new Node<t>;
    Node<t>* pb = headB;
    Node<t>* pa = head->next;
    while (pa != NULL) {
        Node<t>* temp = new Node<t>;
        temp->data = pa->data;
        temp->next = NULL;//&#x8FD9;&#x91CC;&#x7528;&#x5230;&#x4E86;&#x4E00;&#x4E2A;&#x4E34;&#x65F6;&#x6307;&#x9488;&#x53D8;&#x91CF;
        pb->next = temp;//&#x8BA9;pb&#x8FDE;&#x4E0A;temp
        pb = pb->next;
        pa = pa->next;
        //&#x8FD9;&#x91CC;&#x5411;&#x540E;&#x79FB;&#x52A8;
    }
    return headB;
    //&#x6CE8;&#x610F;&#x8FD9;&#x91CC;&#x8FD4;&#x56DE;&#x7684;&#x662F;headB&#xFF0C;&#x5728;&#x8C03;&#x7528;&#x65F6;&#x8BB0;&#x5F97;&#x518D;&#x52A0;&#x4E00;&#x4E2A;"->next"
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    LinkList<int> list(arr,5);
    cout << "the origin state: " << endl;
    list.PrintList();

    cout << endl << "copy list a to list b\n";
    Node<int>* ptr = new Node<int>;
    ptr = list.copy(list.first)->next;
    while (ptr != NULL) {
        cout << ptr->data << ' ';
        ptr = ptr->next;
    }

    cout << endl << "reverse the list a\n";
    list.Reverse(list.first);
    list.PrintList();
}
</int></int></int></t></t></t></t></t></t></t></t></t></class></t></t></t></class></t></t></t></t></t></class></t></t></class></t></t></t></t></class></t></class></bits>

Original: https://www.cnblogs.com/jaydenchang/p/15450265.html
Author: JaydenChang
Title: 数据结构(C++)–学习单链表时发现的一些小坑

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585164/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球