У меня есть Procudere удаляет для моего трепа, и на линии p=merge(l, merge(m, rs));
у меня ошибка error: non-const lvalue reference to type 'nodeptr' (aka 'node *') cannot bind to a temporary of type 'nodeptr'
Так вот реализация удалений и слияния
nodeptr treap::merge(nodeptr &l, nodeptr &r){
nodeptr result;
if (!l){
result=r;
}
else if(!r){
result=l;
}
else if(l->cnt > r->cnt){
l->right=merge(l->right, r);
result=l;
}
else{
r->left=merge(l, r->left);
result=r;
}
return result;
}
void treap::deletes(nodeptr &p, int x){
nodeptr l, r, m, rs;
split(p, x-1, l, r);
split(r, x, m, rs);
if (m){
if (!m->left){
m=m->right;
}
else{
m=m->left;
}
}
p=merge(l, merge(m, rs));
}
И как я реализую Treap как структуру данных.
typedef struct node *nodeptr;
struct node{
int x;
long y;
node* left ;
node* right ;
int cnt;
node(int key=0, long prior=0): x(key), y(prior), left(NULL), right(NULL), cnt(0) {}
};
class treap{
public:
int cnt( nodeptr &p);
bool find(nodeptr &p, int x);
void update_cnt(nodeptr &p);
void split(nodeptr &p, int x, nodeptr &l, nodeptr &r);
void insert(nodeptr &p, nodeptr &q);
nodeptr merge(nodeptr &l, nodeptr &r);
void deletes(nodeptr &p, int x);
};
Можете ли вы сказать мне, почему эта ошибка? Я думаю, что все в порядке. Извините, если вопрос нуби. Заранее спасибо.
Вы попали в раздражение ссылок на указатели. Когда ты сказал p=merge(...)
компилятор пытается назначить временный nodeptr
вернулся merge
к ссылке. Но тогда температура выходит за рамки и p
больше не содержит действительной ссылки. К сожалению, иногда вам нужно использовать указатели.
Других решений пока нет …