0

私の目標は、動的配列を使用してファイルからテキストを読み取り、引数「numline」を使用して必要な行を最後に出力することです。この仕事には、循環型の単一リンクリストを使用する必要があります。関数を実行すると、最初の行Xnumlineのみが取得されます。混乱していますが、ノードパーティションを追加したり、パーティションをトラバースして印刷したりして、何か問題がありましたか?

EDiT:ファイルを編集しました...

    void last(char* numline,char* fileptr)
{

  struct node *start,*newnode,*lastnode;
  struct node *ptr=start;
  char *linebuffer;
  int maxlinelen=512;
  int i=0;
  int j;

  FILE *fp;
  linebuffer=(char*)malloc(maxlinelen * sizeof(char*));
  if(linebuffer==NULL)
    {
      fprintf(stderr,"Command: last:Memory allocating failed for linebuffer\n");
      exit(1);
    }


      if((fp=fopen(fileptr,"r"))!=NULL)
    {
      start=NULL;

      while((fgets(linebuffer,maxlinelen,fp))!=NULL)
         {
           while(strlen(linebuffer)==maxlinelen-1)
         {
           maxlinelen*=2;
           linebuffer=realloc(linebuffer,maxlinelen * sizeof(char));
           if(linebuffer==NULL)
             {
               fprintf(stderr,"Command: last: Memory reallocating failed for linebuffer\n");
               exit(1);
             }
           fgets(linebuffer+(maxlinelen/2-1),(maxlinelen/2)+1,fp);
         } 

           if(start==NULL)
         {
           newnode=(struct node *)malloc(sizeof(struct node));

               strcpy(newnode->data,linebuffer);
               printf("linebuffer newnoda kopyalandi\n");

               start=newnode;
           newnode->next=newnode;
           // start=newnode;
           i++;
           printf("ikinciburda");
         }
           else{
         newnode=(struct node *)malloc(sizeof(struct node));
         strcpy(newnode->data,linebuffer);
         lastnode=start;
         while(lastnode->next!=start)
           {
             lastnode=lastnode->next;
           }
         lastnode->next=newnode;
         newnode->next=start;
         i++;
           }
         }
      printf("toplam line sayisi :%d\n",i);
         ptr=start;                           //<----- i added this line
      for(j=i-(atoi(numline));j<i;j++)
        {
          ptr=ptr->next;
        }
      while(ptr!=start)
        {
          printf("%s\n",ptr->data);
          ptr=ptr->next;
        }
      fclose(fp);
    }
}
4

1 に答える 1

2

これらの行

  while(start->next!=start)
  {
      printf("%s\n",start->data);
      /// especially this one
      start=start->next;
  }

疑わしいように見えます。

最初の反復でにを割り当て、start->nextすぐstartにループから抜け出します(明らかに、start == start->next)。

あなたがしなければならないのは、を作成しstruct node* ptr、それに開始を割り当ててから、ptr = ptr->next「totallines」-「numline」回を作成することです。

 struct node* ptr = start;

 for(j = atoi(numline) ; j < i ; j++) { ptr = ptr->next; }

 while(ptr != start)
 {
     printf("%s\n", ptr->data);
     ptr = ptr->next;
 }

もちろん、チェックする必要がありますnumline <= totaline-簡潔にするために、このチェックは省略しました。

重要な編集:

挿入後

   for(j = i - atoi(numline) ; j < i ; j++)
   {
       // debug statement
       printf("skip %s\n", ptr->data);
       ptr = ptr->next;
   }

リンクリストが正しく構成されていないことに気づきました。上記の反復では、最初の行のみが表示されます。

EDIT2(いくつかのメモ):

エラー処理コードは素晴らしく、不確定な行長の動的バッファーも優れています。コードが非常に長くなり、問題を探すのがそれほど簡単ではないためです。たくさん書かれていて、そのほとんどがコードで定義されていないリンクリストとは無関係であるという理由だけで、多くの人がこの答えに出くわしたと思います。私の推測は

 struct node
 {
     struct node* next;
     char data[SomeBigNumber];
 };

EDIT3:リストの作成

「add-last-node」部分のコードはさらにトリッキーです。lastnode/newnodeの混乱を明確にする必要があります。

そして、エラーはここにあります:

        /// once again, here lastnode->next IS start, as you want it to be
        lastnode->next=start;
        /// and this condition is always false (see the previous line)
        while(lastnode->next!=start)
        {
            lastnode=lastnode->next;
        }

行をコメントアウトしました//lastnode = start;が、最後の要素に到達するにはループの直前にある必要があります。

する// add additional nodes必要があります:

    else {  //add additional nodes
        newnode=(struct node *)malloc(sizeof(struct node));
        strcpy(newnode->data,linebuffer);

        lastnode=start;
        while(lastnode->next!=start) { lastnode=lastnode->next; }

        lastnode->next=newnode;
        newnode->next=start;
        i++;
    }

そしてもちろん、ノードを挿入するたびに最後の要素を探すのはやり過ぎです。lastnode常に最後の要素を指すようにしておく必要があります(または、リストが最初に空の場合はNULL)。

于 2012-11-12T22:37:29.173 に答える