我正在使用这种类型(新的):
typedef struct lligada {
int valor;
struct lligada *prox;
} *LInt;
我试图做一个有序的功能" LInt"并将它们合并为一个有序的" LInt"。
void merge (LInt *r, LInt l1, LInt l2){
LInt aux=*r;
for (; l1!=NULL && l2!=NULL;aux=aux->prox){
if (l1->valor <= l2->valor){ aux->valor=l1->valor, l1=l1->prox;}
else {aux->valor=l2->valor, l2=l2->prox;}
}
while (l1!=NULL){
aux->valor=l1->valor;
l1=l1->prox;
aux=aux->prox;
}
while (l2!=NULL){
aux->valor=l2->valor;
l2=l2->prox;
aux=aux->prox;
}
aux=NULL;
}
我有分段错误而且我不知道原因。
答案 0 :(得分:2)
这是破坏性合并排序的(一个阶段)。它将列表l1
和l2
(已经排序)的元素移动到合并列表中。
typedef struct lligada {
int valor;
struct lligada *prox;
} *LInt;
void merge(LInt *r, LInt l1, LInt l2) {
while (l1 && l2) {
if (l1->valor <= l2->valor) {
*r = l1;
l1 = l1->prox;
} else {
*r = l2;
l2 = l2->prox;
}
r = &(*r)->prox;
}
if (l1) {
*r = l1;
} else {
*r = l2;
}
}
在r = &(*)->prox;
语句后分配if/else
的替代方法是在r
和if
部分内分配else
,例如:
if (l1->valor <= l2->valor) {
*r = l1;
r = &l1->prox; // <-- this and ...
l1 = l1->prox;
} else {
*r = l2;
r = &l2->prox; // <-- ... this are alternative ...
l2 = l2->prox;
}
// r = &(*r)->prox; // <-- ... to this