2

ユーザーがリンクリストに単一の文字を入力すると、プログラムはリストを出力する必要がありますが、文字を入力すると問題が発生し、文字が出力されず、無限ループが発生しますが、数値が入力されると完全に機能します。何か案は?

        #include <stdio.h>  
        #include "stdafx.h"
        #include <stdlib.h>
        #include <malloc.h>

        /*Structure containing a Data part & a Link part to the next node in the List  */

        struct Node  
        {  
            int Data;  
            struct Node *Next;  
        }*Head;  



        int count()  
        {  
        /* Counting number of elements in the List*/
          struct Node *cur_ptr;  
          int count=0;  

          cur_ptr=Head;  

          while(cur_ptr != NULL)  
          {  
             cur_ptr=cur_ptr->Next;  
             count++;  
          }  
          return(count);  
        }  


        void addEnd(char input)  
         {  
            struct Node *temp1, *temp2;  

            temp1=(struct Node *)malloc(sizeof(struct Node));  
            temp1->Data=input;  

            // Copying the Head location into another node.  
            temp2=Head;  

            if(Head == NULL)  
            {  
               // If List is empty we create First Node.  
               Head=temp1;  
               Head->Next=NULL;  
            }  
            else  
            {  
               // Traverse down to end of the list.  
               while(temp2->Next != NULL)  
               temp2=temp2->Next;  

               // Append at the end of the list.  
               temp1->Next=NULL;  
               temp2->Next=temp1;  
            }  
         }    

        // Displaying list contents  

        void display()  
        {  
          struct Node *cur_ptr;  

          cur_ptr=Head;  

          if(cur_ptr==NULL)  
          {  
             printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
             printf("\nList is Empty "); 
             printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\n\n");
          }  
          else  
          {  
              printf("\nElements in the List:\n\n ");  
              //traverse the entire linked list  
              while(cur_ptr!=NULL)  
              {  
                  printf(" \n-> %d ",cur_ptr->Data);  
                  cur_ptr=cur_ptr->Next;  
              }  
              printf("\n");
            }
        }

        int main(int argc, char *argv[])  
        {  
         int i=0;  

         //Set HEAD as NULL  
         Head=NULL;  

         while(1)  
         {  

            printf("\n\n\n\n\n MENU\n");  
            printf("---------------------------------\n");  
            printf(" \n1. Insert one part of DNA sequence");   
            printf(" \n2. Print the Elements in the List");   
            printf(" \n\n3. Exit\n");  
            printf(" \nChoose Option: ");  
            scanf("%d",&i);  

            switch(i)  
            {  
              case 1:  
              {  
                  char dnaChar;  
                  printf(" \nEnter char to be inserted into the List i.e A, T, G, C: ");  
                  scanf("%d",&dnaChar);  
                  addEnd(dnaChar);  
                  display();  
                  break;  
              }     

              case 2:  
              {  
                  display();  
                  break;  
              }  


              case 3:  
              {  
                  struct Node *temp;  

                  while(Head!=NULL)  
                  {  
                      temp = Head->Next;  
                      free(Head);  
                      Head=temp;  
                  }  
                  exit(0); 
                }  

              default:  
              {  
                  printf("\nWrong Option \n\n\n\n");  
              }  
            } 
         } 
        }  
4

2 に答える 2

2

に変更scanf("%d",&dnaChar)するscanf("%c",&dnaChar)のでdnaCharcharタイプです。

そして、それはキャラクターのために働き始めます

于 2012-11-27T12:38:13.877 に答える
2

データ型に非常に一貫性がありません:

    struct Node  
    {  
        int Data;  // a "Node's Data is an int
        ...

次にmain()

              char dnaChar;   // You say you want a char
              printf(" \nEnter char to be inserted into the List i.e A, T, G, C: ");  
              scanf("%d",&dnaChar);  // then scanf using the int type %d

リストを印刷すると、次のようになります。

              printf(" \n-> %d ",cur_ptr->Data);  // You're printing int type

したがって、1 つの問題、矛盾があります。データ型に文字または int を選択する必要があります。変化する:

scanf("%d",&dnaChar);  

scanf("%c",&dnaChar);  

無限ループを修正すると、データが ASCII 値として表示されるようになります。

A => 65
T => 84
G => 71
C => 67

または、すべてをchar/に変更すると、データが/ / /%cとして表示され、IMO が読みやすくなります。ATGC

最後のポイント:

コードに切り替えるとscanf("%c",&dnaChar);、別の方法で壊れます。scanfメニューオプションを入力するときに改行文字を消費しません。そうしないと、ATGC エントリのすぐそばをスキップしてしまいます。

printf("\n\n\n\n\n MENU\n");  
printf("---------------------------------\n");  
printf(" \n1. Insert one part of DNA sequence");   
printf(" \n2. Print the Elements in the List");   
printf(" \n\n3. Exit\n");  
printf(" \nChoose Option: ");  
scanf("%d",&i);  
getchar();  // <-- Add this to get rid of newline
于 2012-11-27T12:50:07.467 に答える