0

次のコードがあります:(質問に関連する部分のみを保持しました)

        // Structure
        struct first_list {
            char firstname[100];
            struct first_list * next;
        };
        struct last_list {
            char lastname[100];
            struct last_list * next;
        };

        void verify_name()
        {
            char firstname[100];
            char lastname[100];
            struct first_list * curr_first = loaded_first;
            struct last_list * curr_last = loaded_last;

        /////////// this part was added by me
            while( curr_last != NULL )
            {
                strncpy(lastname, curr_last->lastname, sizeof( lastname ) - 1 );
                valid = validate_name(sock,buffer,sizeof(buffer),firstname);
                if(valid < 1)
                    fprintf(stderr, "%s is VALID\n", lastname);
                else
                    fprintf(stderr, "%s is invalid\n", lastname);

                curr_last = curr_last->next; //this is used for removing current record

            }
            printf( "LastName validation complete\n" );
            break;
        /////////// end of part added by me

            while( curr_last != NULL && curr_first != NULL )
            {
                strncpy(firstname, curr_first->firstname, sizeof( firstname ) - 1 );
                strncpy(lastname, curr_last->lastname, sizeof( lastname ) - 1 );

                ////////////////////////////////
                //// irrelevant code (functions)
                ////////////////////////////////

                if( curr_first->next == NULL && curr_last->next != NULL)
                {
                    curr_last = curr_last->next;
                    curr_first = loaded_first;
                }
                else 
                    curr_first = curr_first->next;
            }
        }

そのため、名前と姓を同時に検証する関数の前に、姓を検証する新しい関数を追加しました (プロセス全体を最適化するため)。問題は、break コマンドを削除すると、検証後に last_list が空になるというエラーが発生することです。

現在、次のレコードに移動すると、ループが完了するまで現在のレコードが削除されるため、構造に有効な姓のみを保持するにはどうすればよいですか (NULL) ??

4

2 に答える 2

1

最初のループで行う必要があるのは次のとおりです。

struct last_list * prev = NULL;
struct last_list * next = NULL;
while (curr_last != NULL)
{
  next = curr_last->next;
  strncpy(lastname, curr_last->lastname, sizeof(lastname) - 1);
  lastname[sizeof(lastname) - 1] = 0;
  valid = validate_name(sock,buffer,sizeof(buffer),firstname);
  if(valid < 1)
  {
    fprintf(stderr, "%s is VALID\n", lastname);
    prev = curr_last;
  }
  else
  {
    fprintf(stderr, "%s is invalid\n", lastname);
    if (prev == NULL)
      loaded_last = curr_last->next;  //this is used for removing when current is first record
    else
      prev->next = curr_last->next; //this is used for removing current record from mid-list
    free(curr_last); //Freeing should be needed but depends on how you built your list.
  }
  curr_last = next;
}
curr_last = loaded_last;

これにより、要素がリストから削除さcurr_lastれ、有効な姓のみが保持されます。

于 2013-01-07T15:05:59.107 に答える
0

ループ内で (たとえば) cur_last->next を使用してリストを「消費」したので、リストの先頭を指すように cur_first と cur_last を再初期化するか、両方の機能を実行する単一のループを作成する必要があります。

于 2013-01-07T14:54:29.270 に答える