为什么我有分段错误?

时间:2017-05-17 16:54:18

标签: c

我正在使用这种类型(新的):

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;
}

我有分段错误而且我不知道原因。

1 个答案:

答案 0 :(得分:2)

这是破坏性合并排序的(一个阶段)。它将列表l1l2(已经排序)的元素移动到合并列表中。

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的替代方法是在rif部分内分配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