我需要开发一个双向链接列表,其中我不能指定我的* 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;
}