-2

次のコードは、リンクされたリストを作成した後に並べ替えます。使用されるソート アルゴリズムはバブル ソートです。どういうわけか、コードは strcmp() 関数でセグメンテーション フォールトを発生させます。

PS: ノード数をカウントする代わりに、ポインターを使用してソートのループを実行する別のバージョンも作成しました。そこでもセグメンテーション違反が発生しました。今回はループの「条件チェック」で

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

using namespace std;

struct link_list  
{    
       char value[20];  
       struct link_list *next;  
};  

int main()  
{  
    struct link_list *head=NULL;  
    int i,j,count=0;  
    char input[20];  
    char ch;  
    struct link_list *temp=NULL,*temp2=NULL,*temp3=NULL,*temp4=NULL;  
    do  /* Creating a link list*/  
    {  
        cout<<"Enter the string you want to insert";  
        cin>>input;
        count++;  
        cout<<"Do you want to continue entering?";  
        cin>>ch;

       if  (head==NULL)
       {
           head=new link_list;
           strcpy(head->value,input);
           head->next=NULL;
           continue;
       }
       for (temp=head;temp->next!=NULL;temp=temp->next);
       temp2=new link_list;
       temp->next=temp2;
       strcpy(temp2->value,input);
       temp2->next=NULL;
    }while(ch=='y' || ch=='Y');

   /*Printing the link list*/

   for (temp=head;temp->next!=NULL;temp=temp->next)
   {
       cout<<temp->value<<"\n";
   }
   cout<<temp->value<<"\n";
   temp=head;
   temp2=head;

/*Using Bubble Sort to sort the list in ascending order*/

   for (i=1;i<count-1;i++)
   {
       if  (i==1)
           temp=head;
       else
           temp=temp->next;
       for (j=0;j<count-i;j++)
       {
           if  (j==0)
               temp4=head;
           else
               temp4=temp4->next;
           temp2=temp4;
           /*Comparing two subsequent nodes and swapping pointers if necessary*/
           if  (strcmp(temp2->value,temp2->next->value)>0)/*<----ERROR in some cases*/
           {
               /*Case where head node needs to adjusted, 2 nodes present in the list*/
               if  (temp2==head && temp2->next->next==NULL)
               {
                   cout<<"Special1\n";
                   head=temp->next;
                   temp2->next->next=temp;
                   temp2->next=NULL;
               }
               /*Case where head node needs to be adjusted*/
               else if (temp2==head)
               {
                    cout<<"Special2\n";
                    head=temp2->next;
                    temp2->next=head->next;
                    head->next=temp2;
               }
               /*Rest of the cases*/
               else
               {
                   cout<<"Normal1\n";
                   temp3->next=temp2->next;
                   temp2->next=temp3->next->next;
                   temp3->next->next=temp2;
                   cout<<"Normal2\n";
               }
           }
           temp3=temp4;
       }
    }

    for (temp=head;temp->next!=NULL;temp=temp->next)
    {
       cout<<temp->value<<"\n";
    }
    cout<<temp->value;
    getch();
}   
4

1 に答える 1

2

可能性は 2 つだけです。

  • temp2無効 (または NULL) です
  • temp2->next無効 (または NULL) です

私の推測では、2 番目の弾丸です。

于 2012-07-29T07:49:47.040 に答える