gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:22:56 25 4
gpt4 key购买 nike

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

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);
}
}

最佳答案

这些行

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

看起来很可疑。

在第一次迭代中,您分配 start->nextstart然后你立即跳出循环(因为,显然, start == start->next )。

您应该做的就是创建一个 struct node* ptr ,为其分配 start ,然后创建 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;
}

我注意到,链接列表的构造不正确 - 上面的迭代只给出了第一行。

编辑2(一些注释):

你的错误处理代码很好,不确定行长度的动态缓冲区也很好,但代码变得相当冗长,查找问题并不那么容易。我想很多人之所以想到这个答案只是因为写了这么多,而且其中大部分与链表无关,顺便说一句,链表没有在代码中定义。我的猜测是

 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,当列表最初为空时)。

关于c - 如何在循环链表中添加节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13352318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com