C 如何在循环链表中添加节点?

C 如何在循环链表中添加节点?,c,linked-list,C,Linked List,我的目标是使用动态数组从文件中读取文本,并最后打印出您想要的带有参数“numline”的行。我必须使用循环单链表来完成这项工作。当我运行函数时,我只得到第一行X numline。我很困惑,我是否在添加节点分区或遍历和打印分区时出错了 编辑:我编辑了文件 void last(char* numline,char* fileptr) { struct node *start,*newnode,*lastnode; struct node *ptr=start; char *li

我的目标是使用动态数组从文件中读取文本,并最后打印出您想要的带有参数“numline”的行。我必须使用循环单链表来完成这项工作。当我运行函数时,我只得到第一行X numline。我很困惑,我是否在添加节点分区或遍历和打印分区时出错了

编辑:我编辑了文件

    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);
    }
}
void last(char*numline,char*fileptr)
{
结构节点*start、*newnode、*lastnode;
结构节点*ptr=start;
字符*行缓冲区;
int maxlinelen=512;
int i=0;
int j;
文件*fp;
linebuffer=(char*)malloc(maxlinelen*sizeof(char*));
if(linebuffer==NULL)
{
fprintf(stderr,“命令:最后:为linebuffer分配内存失败\n”);
出口(1);
}
如果((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,“命令:最后:linebuffer的内存重新分配失败\n”);
出口(1);
}
fgets(linebuffer+(maxlinelen/2-1),(maxlinelen/2)+1,fp);
} 
if(start==NULL)
{
newnode=(结构节点*)malloc(sizeof(结构节点));
strcpy(newnode->data,linebuffer);
printf(“linebuffer newnoda kopyalandi\n”);
开始=新节点;
newnode->next=newnode;
//开始=新节点;
i++;
printf(“ikinciburda”);
}
否则{
newnode=(结构节点*)malloc(sizeof(结构节点));
strcpy(newnode->data,linebuffer);
lastnode=开始;
while(lastnode->next!=开始)
{
lastnode=lastnode->next;
}
lastnode->next=newnode;
新建节点->下一步=开始;
i++;
}
}
printf(“toplam行sayisi:%d\n”,i);
ptr=start;//数据);
ptr=ptr->next;
}
fclose(fp);
}
}
这些行

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

在第一次迭代中,您将
start->next
分配给
start
,并立即退出循环(因为显然,
start==start->next

您所要做的就是创建一个
struct node*ptr
,将start分配给它,然后创建一个
ptr=ptr->next
“totalines”-“numline”时间:

编辑3:列表构造

“添加最后一个节点”部分的代码更为复杂,应该澄清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,但它应该在循环到达最后一个元素之前

//添加其他节点
必须是:

    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)。

+1。您的代码比OP更容易阅读,循环的初始值是查找循环列表中的“第一个”条目吗?只是好奇,就像我想从
ptr=start->next开始如果“开始”不为空,则会清楚地绕过所有条目。@viktor latypov我编辑了我的代码。但是我得到赛格。过错我真的把循环链表搞糊涂了。我已经编辑了2。@WhozCraig我做了你的建议,我得到了标志打印输出,但当达到(j…)循环分段故障@ccc:我已经修复了您的链接列表代码(请参见EDIT3),您错误地查找了列表的结尾。我已经编译并测试了您的程序,我的版本可以运行。@ViktorLatypov我编辑了我的代码,您可以看到它。但我还是犯了错误。还是有什么不对劲,但是。我找不到它。你怎么想?
 struct node
 {
     struct node* next;
     char data[SomeBigNumber];
 };
        /// 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;
        }
    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++;
    }