数据结构(c++描述):关于列表归并,请大家帮我看看这个merge函数的形参
已经有了这两个东西--1.struct:ListNode<T>里面存有pred、succ指针,以及Tdata;还有addAsPred(Te);和addAsSucc(Te)...
已经有了这两个东西--
1.struct:ListNode<T>
里面存有 pred、succ指针,以及T data;
还有addAsPred(T e); 和 addAsSucc(T e);这些function
2.列表模板类:List<T> 里面有
ListNode<T>* head; ListNode<T>* tail; int size;
以及很多函数...(我只写下文提到的)
T remove( ListNode<T>* p);
ListNode<T>* insertBefore(ListNode<T>* p, T const& e);
List<T>中有一个成员函数merge,(前提是有序列表)作用是 将当前列表中自p起的n个元素,与列表L中自q起得m个元素归并到一起:
template<class T>
void List<T>::merge(ListNode<T>*& p,int n,List<T>& L,ListNode<T>*q,int m){
ListNode<T>* pp = p->pred;
while(m>0){
if( n>0 && ( p->data <= q->data ) ){
if( q == ( p = p->succ ) )break;
n--;
}else{
insertBefore(p, L.remove( (q = q->succ ) -> pred ) );
m--;
}
p = pp->succ;
}
}
我实在不明白这个形参:ListNode<T>*& p
为什么要写“ListNode<T>*&”呢? 叫做"指针的引用"?
单纯写指针(ListNode<T>* )不行么?如果不行,ListNode<T>*q 为什么就可以了呢?为什么导入p和q用不同的方式呢?
这个merge是叫做“有序列表的二路归并“,是递归函数mergesort()的一个环节,我并不是很理解..
但是我现在主要的问题是那个形参,希望各位从语法的角度,或者从“模板类的指针的引用”这方面 帮我一下就好了......
我很基础请您通俗哈..... 展开
1.struct:ListNode<T>
里面存有 pred、succ指针,以及T data;
还有addAsPred(T e); 和 addAsSucc(T e);这些function
2.列表模板类:List<T> 里面有
ListNode<T>* head; ListNode<T>* tail; int size;
以及很多函数...(我只写下文提到的)
T remove( ListNode<T>* p);
ListNode<T>* insertBefore(ListNode<T>* p, T const& e);
List<T>中有一个成员函数merge,(前提是有序列表)作用是 将当前列表中自p起的n个元素,与列表L中自q起得m个元素归并到一起:
template<class T>
void List<T>::merge(ListNode<T>*& p,int n,List<T>& L,ListNode<T>*q,int m){
ListNode<T>* pp = p->pred;
while(m>0){
if( n>0 && ( p->data <= q->data ) ){
if( q == ( p = p->succ ) )break;
n--;
}else{
insertBefore(p, L.remove( (q = q->succ ) -> pred ) );
m--;
}
p = pp->succ;
}
}
我实在不明白这个形参:ListNode<T>*& p
为什么要写“ListNode<T>*&”呢? 叫做"指针的引用"?
单纯写指针(ListNode<T>* )不行么?如果不行,ListNode<T>*q 为什么就可以了呢?为什么导入p和q用不同的方式呢?
这个merge是叫做“有序列表的二路归并“,是递归函数mergesort()的一个环节,我并不是很理解..
但是我现在主要的问题是那个形参,希望各位从语法的角度,或者从“模板类的指针的引用”这方面 帮我一下就好了......
我很基础请您通俗哈..... 展开
2个回答
展开全部
这里的归并是将列表L中自q起的m个元素有序的插入到现有列表,也就是p所在列表L1;在这个过程中,原p的值是需要改变的,所以要用引用;而q只需要传值即可(也就是值的copy就可以),如果只是写ListNode<T>* ,则只是copy了一份原列表L1,而原列表L1并不会改变。和下面这个例子一样:
void change(int &a, int &b)
{
int t;
t = a;
a = b;
b = t;
}
如果不用引用,将实际a和b并不会进行交换。
ListNode<T>* 想相当于 int;&p相当于&a
void change(int &a, int &b)
{
int t;
t = a;
a = b;
b = t;
}
如果不用引用,将实际a和b并不会进行交换。
ListNode<T>* 想相当于 int;&p相当于&a
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询