2017-10-04 111 views
-3

此代碼試圖實現雙向鏈接循環列表雙向鏈表循環鏈表

代碼編譯,不會引發錯誤,但是當進入一個號碼掛哪裏是錯?假裝在西班牙的招牌都是英文

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

過程insertard

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

Process eliminarantes

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(); 
} 
+1

聽起來就像你要求SO來爲你調試它...... –

+0

你是否嘗試過使用gdb/lldb來查看問題出在哪裏? – odin

+1

這在技術上難以調試,它只是在測試用例,紙/鉛筆圖,加入調試器,檢查每個步驟中的變量值等方面進行艱苦的工作,從而找出期望的和實際行爲發生分歧的地方。 –

回答

0

在第一次執行方法'insertard'時,實際上是在分配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; 
} 
+0

現在,當我給你顯示我輸入的數字(例如4)LIST:4->然後程序掛起。最後一個節點應該是尖銳的或什麼 –

+0

只是調試應用程序,看看它打破了什麼 –

+0

我會盡量做得更精確。程序執行(脈衝1插入並輸入一個新元素並輸入脈衝)。 –