我无法在这个双向链表中插入一个节点,可能是段错误

时间:2016-09-06 23:45:09

标签: c list pointers crash segmentation-fault

我需要开发一个双向链接列表,其中我不能指定我的* prev和* next指针,它们必须是* A和* B,因为它们可能假设每个其他函数在我篡改列表时起作用。它可能被称为英语对称列表。

我在此列表中插入节点时遇到问题。程序崩溃(可能是一个段错误),我不知道为什么,因为我确实使用了一个特殊情况,当列表为空时(if(atual == NULL))。该程序还没有结束,还有更多的实现,所以不要介意交换机内部没有看到实现的东西。还有一件事:每个节点都有* A或* B沿着列表。这就是为什么我要检查哪一个回头看,以便使用另一个继续前进。

示例输入:

  

i 0 1.2

     

i 1 2.3

     

i 2 3.4

以下是代码:

#include<stdio.h>
#include<stdlib.h>

typedef struct no {
    double num;
    struct no *A;
    struct no *B;
} no;

typedef struct lista {
    no *cabo;
    no *rabo;
} lista;

lista* criar(void) {
    lista *L = malloc(sizeof(lista));
    L->cabo = NULL;
    L->rabo = NULL;
    return L;
}

void inserir(lista *L, int posicao, double num) { //testar se funciona e verificar com pad se eh o melhor modo.
    no *novo = malloc(sizeof(no));
    no *atual, *aux;
    atual = L->cabo;
    aux = NULL;
    char ref;
    int i;
    if (atual == NULL) { //a lista nao tem elementos
        novo->A = L->cabo; //inserindo primeiro elemento, que tem contato tanto com a cabeca quanto com o rabo
        novo->B = L->rabo;
        L->cabo = novo;
        L->rabo = novo;
        return;
    }
    for (i = 0; i != posicao; i++) {
        if (atual->A == aux) { //entao A aponta para tras. Para prosseguir uso B.
            aux = atual;
            atual = atual->B;
            ref = 'B';  //o no para onde aux aponta tem seu proximo em B
        }
        else {
            aux = atual;
            atual = atual->A;
            ref = 'A';  //o no para onde aux aponta tem seu proximo em A
        }
    }
    if(ref == 'B') {
        novo->B = aux->B;
        aux->B = novo;
        if (atual->A == aux) {
            atual->A = novo;
        }
        else {
            atual->B = novo;
        }
        novo->A = aux;
    }   
    else if(ref == 'A') {
        novo->B = aux->A;
        aux->A = novo;
        if (atual->A == aux) {
            atual->A = novo;
        }
        else {
            atual->B = novo;
        }
        novo->A = aux;
    }
}

void reverter(lista *L, int inicio, int fim) {

}
int main(void) {

    lista *L = criar();
    char comando;
    int posicao, inicio, fim;
    double num;
    while(1) {
        scanf("%c", &comando);
        if(comando == 't') break;
        switch(comando) {
            case 'i' :  scanf("%d", &posicao);
                        scanf("%lf", &num);
                        inserir(L, posicao, num);
                        break;
            //case 'p' :    imprimir(L);
                        break;
            case 'v' :  scanf("%d", &inicio);
                        scanf("%d", &fim);
                        reverter(L, inicio, fim);
                        break;
        }
    }

    return 0;
}

0 个答案:

没有答案