繁体   English   中英

双向链表

[英]Doubly linked circular list

这段代码试图实现一个双向链表

代码编译通过,不报错,但是输入数字的时候就挂了,错在哪里? 假装西班牙文的标志是英文的

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

struct lista
{
    int info;
    struct lista *sig,*ant;
}*CAB=NULL,*AUX=NULL,*Q=NULL,*P=NULL,*F=NULL,*QD=NULL,*FD=NULL;

主菜单

int main() {
    void insertard(void);
    void extraerd(void);
    void visualizard(void);
    void visualizari(void);
    void eliminardespues();
    void eliminarantes();
    char opc;
    do{
        system("cls");
        printf("___________________________________________________\n");
        printf("_¡¡¡MENU DE LISTA CIRCULAR DOBLEMENTE ENLAZADA!!!__\n");
        printf("___________________________________________________\n");
        printf("____________SELECCIONE UNA OPCION__________________\n");
        printf("___________________________________________________\n");
        printf("___________________________________________________\n");
        printf("__________1) INSERTAR______________________________\n");
        printf("__________2) VISUALIZAR ASCENDIENTE________________\n");
        printf("__________3) VISUALIZAR DESCENDIENTE_______________\n");
        printf("__________4) INGRESAR Y ELIMINAR SIGUIENTE_________\n");
        printf("__________5) INGRESAR Y ELIMINAR ANTERIOR__________\n");
        printf("__________6) SALIR_________________________________\n");
        printf("___________________________________________________\n");
        opc=getch();
        switch(opc)
        {
        case '1':
            insertard();
            break;
        case '2':
            visualizard();
            break;
        case '3':
            visualizari();
            break;
        case '4':
            eliminarantes();
            break;
        }
    } while(opc!='6');
    getch();
    return 0;
}

工艺插件

void insertard(void)
{
    P=CAB;
    AUX=(struct lista *)malloc(sizeof(struct lista));
    system("cls");
    printf("INGRESE UN NUMERO ENTERO:");
    scanf("%d",&AUX->info);
    AUX->sig=CAB;
    AUX->ant=CAB;
    F=AUX;
    if(CAB==NULL)
        CAB=AUX;
    }else{ //ESTO SI
        while (P->sig!=CAB){
            P=P->sig;
    }
        P->sig=AUX;
        AUX->ant=P;
        AUX->sig=CAB;
}

eliminardespues 进程(删除列表后的项目)

void eliminardespues(){
    int x;
    system("cls");
    printf("INGRESE UN NUMERO PARA ELIMINAR EL SIGUIENTE:");
    scanf("%d",&x);

    FD=CAB;
    QD=CAB;
    while(FD->info!=x&&FD->sig!=CAB){
    FD=FD->sig;
    }QD=FD->sig;

    if(FD->sig==CAB&&FD->info!=x){
        printf("\nEL NUMERO INGRESADO NO SE ENCUENTA EN LA LISTA");
    }else{
        if(FD->info==x){
            FD->sig=QD->sig;
            (QD->sig)->ant=FD;
            printf("\nELIMINADO %d",QD->info);
            free(Q);
        }
    }
    getch();
}

过程消除

void eliminarantes()
{
    int x;
    system("cls");
    printf("INGRESE UN NUMERO PARA ELIMINAR EL ANTERIOR");
    scanf("%d",&x);

    FD=CAB;
    QD=CAB;
    while (FD->info!=x&&FD->sig!=CAB){
        FD=FD->sig;
    }QD=FD->ant;
    if(FD->sig==CAB&&FD->info!=x){
        printf("\nEL NUMERO INGRESADO NO SE ENCUENTA EN LA LISTA");
    }else{
        if(FD->info==x){
            FD->ant=QD->ant;
            (QD->ant)->sig=FD;
            printf("\nELIMINADO %d",QD->info);
            free(Q);
        }
    }
    getch();
}

void visualizard(void)
{
    system("cls");
    if(CAB==NULL){
        printf("LISTA VACIA");
        getchar();
        return;
    }
    AUX=CAB;
    printf("LISTA:\n\n");
    while(AUX->sig!=CAB){
        printf("-> %d\n",AUX->info);
        AUX=AUX->sig;
    }
    if(AUX->sig==CAB){
        printf("-> %d\n",AUX->info);
    }
    getch();
}

void visualizari(void){
    system("cls");
    if(F==NULL){
        printf("LISTA VACIA");
        getchar();
        return;
    }
    AUX=F;
    printf("LISTA:\n\n");
    do{
        printf("-> %d\n",AUX->info);
        AUX=AUX->ant;
    }while(AUX->sig!=CAB);
    getch();
}

在您第一次执行“插入”方法时,您实际上是在分配 P=CAB; 即 P=NULL 并且在代码的吹行中你指的是一个空指针来分配值。

P->sig=AUX;

我已经修改了您的方法,可能会修复它。

void insertard(void)
{
    P=CAB;/* very first execution of this method P=NULL */
    AUX=(struct lista *)malloc(sizeof(struct lista));
    system("cls");
    printf("INGRESE UN NUMERO ENTERO:");
    scanf("%d",&AUX->info);
    AUX->sig=CAB;
    AUX->ant=CAB;
    F=AUX;
    if(CAB==NULL){
        CAB=AUX;
        P = AUX;/*first execution of this method P is no longer NULL but P is pointing to AUX */
    }else{ //ESTO SI
        while (P->sig!=CAB){
            P=P->sig;
    }
        P->sig=AUX;
        AUX->ant=P;
        AUX->sig=CAB;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM