2017-10-06 9 views
-1

私はエラーを投げないこのプログラムを持っていますが、viewlプロシージャはリストの最初の項目のみを表示します。 viewlプロシージャの印刷はどのようにするのですが、逆の順序でプロシージャviewrと何をするのですか?リストを降順で表示します

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

struct list 
{ 
    int info; 
    struct list *nxt,*prv; 
}*HEAD=NULL,*AUX=NULL,*P=NULL,*F=NULL,*QD=NULL,*FD=NULL; 

メイン関数(OK)

int main() 
{ 
    void insertr(void); 
    void extractr(void); 
    void viewr(void); 
    void viewl(void); 
    void deleten(); 
    void deletep(); 
    char opc; 
    do 
    { 
     system("cls"); 
     printf("___________________________________________________\n"); 
     printf("_______¡¡¡DOUBLE-LINKED CIRCULAR LIST MENU!!!______\n"); 
     printf("___________________________________________________\n"); 
     printf("_________________SELECT AN OPTION__________________\n"); 
     printf("___________________________________________________\n"); 
     printf("___________________________________________________\n"); 
     printf("__________1) INSERT________________________________\n"); 
     printf("__________2) VIEW ASCENDING________________________\n"); 
     printf("__________3) VIEW DESCENDING_______________________\n"); 
     printf("__________4) ENTERING AND ELIMINATE NEXT___________\n"); 
     printf("__________5) ENTERING AND ELIMINATE PREVIOUS_______\n"); 
     printf("__________6) EXIT__________________________________\n"); 
     printf("___________________________________________________\n"); 
     opc=getch(); 
     switch(opc) 
     { 
     case '1': 
      insertr(); 
      break; 
     case '2': 
      viewr(); 
      break; 
     case '3': 
      viewl(); 
      break; 
     case '4': 
      deleten(); 
      break; 
     case '5': 
      deletep(); 
      break; 
     } 
    } 
    while(opc!='6'); 
    getch(); 
    return 0; 
} 

インサート右プロセス

void insertr(void) 
{ 
    P=HEAD;/* very first execution of this method P=NULL */ 
    AUX=(struct list *)malloc(sizeof(struct list)); 
    system("cls"); 
    printf("ENTER AN ENTIRE NUMBER: "); 
    scanf("%d",&AUX->info); 
    AUX->nxt=HEAD; 
    AUX->prv=HEAD; 
    F=AUX; 
    if(HEAD==NULL) 
    { 
     HEAD=AUX; 
     P = AUX;/*first execution of this method P is no longer NULL but P is pointing to AUX */ 
    } 
    else 
    { 
     while (P->nxt!=HEAD) 
     { 
      P=P->nxt; 
     } 
    } 
    P->nxt=AUX; 
    AUX->prv=P; 
    HEAD->prv=AUX; 
} 


void deleten() 
{ 
    int x; 
    system("cls"); 
    printf("ENTER A NUMBER TO ELIMINATE THE FOLLOWING: "); 
    scanf("%d",&x); 

    FD=HEAD; 
    QD=HEAD; 
    while(FD->info!=x&&FD->nxt!=HEAD) 
    { 
     FD=FD->nxt; 
    } 
    QD=FD->nxt; 

    if(FD->nxt==HEAD&&FD->info!=x) 
    { 
     printf("\nENTERED NUMBER IS NOT LISTED"); 
    } 
    else 
    { 
     if(FD->info==x) 
     { 
      FD->nxt=QD->nxt; 
      (QD->nxt)->prv=FD; 
      printf("\nDELETED %d",QD->info); 
      free(QD); 
     } 
    } 
    getch(); 
} 

deletea処理(OK)

void deletep() 
{ 
    int x; 
    system("cls"); 
    printf("ENTER A NUMBER TO REMOVE THE PREVIOUS "); 
    scanf("%d",&x); 

    FD=HEAD; 
    QD=HEAD; 
    while (FD->info!=x&&FD->nxt!=HEAD) 
    { 
     FD=FD->nxt; 
    } 
    QD=FD->prv; 
    if(FD->nxt==HEAD&&FD->info!=x) 
    { 
     printf("\nENTERED NUMBER IS NOT LISTED"); 
    } 
    else 
    { 
     if(FD->info==x) 
     { 
      FD->prv=QD->prv; 
      (QD->prv)->nxt=FD; 
      printf("\nDELETED %d",QD->info); 
      free(QD); 
     } 
    } 
    getch(); 
} 

viewr処理(OK):

void viewr(void) 
{ 
    system("cls"); 
    if(HEAD==NULL) 
    { 
     printf("EMPTY LIST"); 
     getchar(); 
     return; 
    } 
    AUX=HEAD; 
    printf("LIST:\n\n"); 
    while(AUX->nxt!=HEAD) 
    { 
     printf("-> %d\n",AUX->info); 
     AUX=AUX->nxt; 
    } 
    if(AUX->nxt==HEAD) 
    { 
     printf("-> %d\n",AUX->info); 
    } 
    getch(); 
} 

この関数が失敗する:あなたのコード内

void viewl(void) 
{ 
    system("cls"); 
    if(HEAD==NULL) 
    { 
     printf("EMPTY LIST"); 
     getchar(); 
     return; 
    } 
    AUX=F; 
    printf("LIST:\n\n"); 
    do 
    { 
     printf("-> %d\n",AUX->info); 
     AUX=AUX->prv; 
    } 
    while(AUX->nxt!=HEAD); 
    getch(); 
} 
+0

ずに働いているなど、いくつかの論理エラー、他の変数を、持っていたのはなぜあなたの変数のグローバルのすべてがありますか?大文字ですか? –

+0

また、なぜ二重リンクリストに挿入するためにループしているのですか?それは目的を完全に破っている。あなたの挿入関数は線形ではなく、一定の時間で実行されるべきです。あなたは先日同じ問題を抱えていませんでしたか?再度投稿する前にそれらを修正しようとしないでください? –

+0

http://idownvotedbecau.se/nodebugging/ – bolov

答えて

0

コードはここでは問題

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

//THIS IS TO CREATE THE LIST 

struct list{ 
    int info; 
    struct list *nxt,*prv; 
}*HEAD=NULL,*AUX=NULL,*P=NULL,*FD=NULL,*QD=NULL,*Fd=NULL,*Qd=NULL; 

int main(){ 
    void insertr(void); 
    void viewr(void); 
    void viewl(void); 
    void deleten(); 
    void deletep(); 
    char opt; 
    do{ 
     system("cls"); 

     printf("___________________________________________________\n"); 
     printf("_______¡¡¡DOUBLE-LINKED CIRCULAR LIST MENU!!!______\n"); 
     printf("___________________________________________________\n"); 
     printf("_________________SELECT AN OPTION__________________\n"); 
     printf("___________________________________________________\n"); 
     printf("___________________________________________________\n"); 
     printf("__________1) INSERT________________________________\n"); 
     printf("__________2) VIEW ASCENDING________________________\n"); 
     printf("__________3) VIEW DESCENDING_______________________\n"); 
     printf("__________4) ENTERING AND ELIMINATE NEXT___________\n"); 
     printf("__________5) ENTERING AND ELIMINATE PREVIOUS_______\n"); 
     printf("__________6) EXIT__________________________________\n"); 
     printf("___________________________________________________\n"); 
     opt=getch(); 
     switch(opt) {  
     case '1': 
      insertr(); 
      break;  
     case '2': 
      viewr(); 
      break; 
     case '3': 
      viewl(); 
      break; 
     case '4': 
      deleten(); 
      break; 
      case'5': 
       deletep(); 
       break; 
     } 
    }while(opt!='6'); 
    return 0; 
} 

void insertr(void){ 
    P=HEAD; /* very first execution of this method P=NULL */ 
    AUX=(struct list *)malloc(sizeof(struct list)); 
    system("cls"); 
    printf("ENTER AN ENTIRE NUMBER: "); 
    scanf("%d",&AUX->info); 
    AUX->nxt=HEAD; 
    AUX->prv=HEAD; // The pointer to the previous node is null (HEAD is null) 
    if(HEAD==NULL){ //I ask if HEAD is equal to Null 
     HEAD=AUX; 
     P=AUX; /* The first execution of this method P is no longer NULL but P is pointing to AUX */ 
    }else{ //THIS YES 
     while(P->nxt!=HEAD){ 
      P=P->nxt; 
     } 
    } 
    P->nxt=AUX; // The next pointer of P takes the value of AUX 
    AUX->prv=P; 
    HEAD->prv=AUX; 
} 

void deleten(){ 
    int x; 
    system("cls"); 
    printf("ENTER A NUMBER TO ELIMINATE THE FOLLOWING: "); 
    scanf("%d",&x); 
    FD=HEAD; 
    QD=HEAD; 
    while(FD->info!=x&&FD->nxt!=HEAD){ // if what I am going to eliminate is different from the number that was entered and if there is another 
     FD=FD->nxt; //step to the next node 
    } 
    QD=FD->nxt; 
    if(FD->nxt==HEAD&&FD->info==x){ 
     printf("\nIT IS THE HEADBOARD! CAN NOT BE ELIMINATED"); 
    }else 
     if(FD->nxt==HEAD&&FD->info!=x){ 
     printf("\nTHE NUMBER ENTERED IS NOT IN THE LIST"); 
    }else{ 
      FD->nxt=QD->nxt; 
      (QD->nxt)->prv=FD; 
      printf("\nDELETED %d",QD->info); 
      free(QD); //free space in memory occupied by QD 
     } 
     getch(); 
} 

void deletep() 
{ 
    int xd; 
    system("cls"); 
    printf("IENTER A NUMBER TO REMOVE THE PREVIOUS: "); 
    scanf("%d",&xd); 

    Fd=HEAD; 
    Qd=HEAD; 
    while(Fd->info!=xd){ 
     Fd=Fd->prv; 
    } Qd=Fd->prv; 

    if(Fd==HEAD){ 
     printf("\nIT'S THE HEAD! CAN NOT BE ELIMINATED"); 
    }else{ 
     if(Qd==HEAD){ 
      HEAD=HEAD->nxt; 
      Fd->prv=Qd->prv; 
      (Fd->prv)->nxt=Fd; 
      printf("\nDELETED %d",Qd->info); 
     }else{ 
      Fd->prv=Qd->prv; 
      (Qd->prv)->nxt=Fd; 
      printf("\nDELETED %d",Qd->info); 
     } 
     free(Qd); 
    } 
    getch(); 
} 

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

void viewl(void){ 
    system("cls"); 
    if(HEAD==NULL){ 
     printf("EMPTY LIST"); 
     getchar(); 
     return; 
    } AUX=HEAD->prv; 
    printf("LIST:\n\n"); 
    do{ 
     printf("->%d\n",AUX->info); 
     AUX=AUX->prv; 
    }while(AUX->nxt!=HEAD); 
    getch(); 
} 
0

do 
{ 
    printf("-> %d\n",AUX->info); 
    AUX=AUX->prv; 
} 
while(AUX->nxt!=HEAD); 

それはこのような何かが起こっていることができます。

enter image description here

次がヘッドであれば、あなたがリンクされ、二重の円形であるためにあなたのリストを構築した場合、前のノードに行くとチェックされると、次のヘッドになります。

は次のようにしてみてください:

do 
{ 
    AUX=AUX->prv; 
    printf("-> %d\n",AUX->info); 
} 
while(AUX!=HEAD); 

、あなたがグローバルとしてすべての変数を使用しないでください。

関連する問題