2

よろしくお願いします!だから、私はこの機能を働かせる試みをしました。関数に誤りがありますが、それをキャッチできません。ソートのロジックを見逃したようです。「行き先」を教えていただけますか?

  /* node*/
typedef struct client {
    int number; /* */
    int balance;/* */
    char lastName[20]; /* */
    char firstName [20];/* */
    char phone[11]; /* */
    char email[20];
    struct client *prev;/* */
    struct client *next; 
    struct client *tmp;     /* */

} Client;
Client *firstc,*currentc,*newc, *a, *b,*tmp;  /*pointers*/
/* *"firstc' firstc element in list
   *'currentc' current node 
   *'newc' new node
   *'a' temporary pointer to Sort function
   *'b' temporary pointer to Sort function
   *'tmp' temporary pointer to Sort function
*/
int counter = 0;
int cnum = 0; /*cnum gives unique account numbers avoiding misentering*/

/*---Sort function------*/  

void Sort()
{
/* */
int a = 0;/*variables to store balance*/
int b = 0;/*variables to store balance*/
if(firstc==NULL)
     printf("Database is empty"); /*message*/

else 
    currentc = firstc;
    currentc->prev = NULL;
    tmp = NULL;

while((currentc=currentc->next)!= NULL)
    {   /* 1) compare two nodes;
           2) IF balance >*/
        int a = currentc->balance;
        int b = currentc->next->balance;/* debugger stopped here... */                      

        if (a>b)
        //if(currentc->balance >currentc->next->balance)
        {   /*swap nodes*/

        /*code using three pointers*/
        tmp = currentc->next;
        currentc->next->next = currentc->next;
        currentc->next->next = tmp;

        }
        /*3)move along the list*/
        else
            currentc = currentc->next;

        /*4) repeat to the end of list*/
    }   
    currentc = firstc;
    listAll();
    return;
}
4

2 に答える 2

1

問題は、currentc が最後のノードで、currectc->next が null であるため、currentc->next->balance によってクラッシュすることです。

のようないくつかの検証を追加します
if (currentc->next == null)

b をデフォルト/定義済みの値に設定するか、ノードを交換するかどうかに関係なくロジックを配置します。

于 2013-05-23T23:41:23.377 に答える
1
int b = currentc->next->balance;/* debugger stopped here... */ 

currentcがリストの最後の項目を指している場合はcurrentc->nextnull になります。ヌル currentc->next->balanceポインタを介したアクセスも同様です。

また、次のような状況で割り当てを行うなどの練習は、while((currentc=currentc->next)!= NULL)最終的にはあなたを傷つけるために戻ってきます. この場合、リストの最初の項目をスキップしているようです。

あなたはおそらく次のことを意味していました:

if(firstc == NULL)
    printf("Database is empty"); /*message*/
else 
{  /*  missing braces spotted by others */
    currentc = firstc;
    currentc->prev = NULL;
    tmp = NULL;


    for( ; currentc != NULL; currentc = currentc->next)
    {  
        if(currentc->next == NUL)
            /* nothing to compare */
            break;
        ...
    }
}

さらに、スワップコードは間違ったノードをスワップしています:

    tmp = currentc->next;
    currentc->next->next = currentc->next;
    currentc->next->next = tmp;

次のノード (b) を (a の代わりにその次のノードと) ほぼ (完全ではありません) 交換します。ポインターを使用する必要がありprevます (ただし、これは宿題のように見えるため、その方法を正確に説明しない方がよいでしょう)。また、初期化prevしていますが、ループ内で最新の状態に保つ必要があります。実際、上記の 3 行は次と同等です。

    tmp = currentc->next;
    currentc->next->next = tmp;

だから私はあなたが何か他のことを意味したと思います。

于 2013-05-23T23:38:35.867 に答える