【问题标题】:Move nodes to the end of Linked List function Problem将节点移动到链表函数的末尾问题
【发布时间】:2019-09-08 09:18:09
【问题描述】:

我是一名 C 编程的学生,我现在只是学习基础知识。我需要编写一个函数,在输入中给出一个链表,将包含 5 和 3 的倍数的节点放在列表的末尾。我正在尝试一种递归方法,但程序崩溃了。 练习指南说我不能删除节点然后在列表末尾重新创建它们。我必须修改指针。

编辑:调试器说这是一个分段错误问题。

这里有调试错误的图像,输入中给出了这个列表 (15 -> 7 -> 2 -> 1 -> 30 -> 25 -> 10): segfaultdebug

//typenode is a type I defined for linked list nodes

typenode *mul5e3coda(typenode *head){

    typenode *temp2=head;

    if((head->val%3==0)&&(head->val%5==0)&&head!=NULL){

         while(temp2->next!=NULL){
            temp2=temp2->next;
          }

          temp2->next=head;
          head=head->next;
          temp2->next->next=NULL;
          head->next=mul5e3coda(head->next);
    }
    else{
         while(((head->val%3!=0)||(head->val%5!=0))&&head!=NULL){
            head=head->next;}
         if((head->val%3==0)&&(head->val%5==0)&&head!=NULL){
            head=mul5e3coda(head);
         }
    }
    return head;
}

【问题讨论】:

  • 您能否提供一个minimal reproducible example 来方便地提供一个填充列表以供使用并演示您观察到的错误?
  • 不要试图同时做太多事情。我建议您创建一个函数来从列表中删除选定的节点。第二个函数将节点添加到列表的末尾。然后你可以使用这些函数。
  • 另外,现在是学习如何使用调试器捕获崩溃、如何定位代码中发生崩溃的位置以及如何在崩溃。
  • @Someprogrammerdude 我无法添加或删除节点,我必须修改指针。我使用 CodeBlocks 作为 IDE...如何使用调试器? 15 -> 7 -> 2 -> 1 -> 30 -> 25 -> 10 就是一个例子。输出应该是 7 -> 2 -> 1 -> 25 -> 10 -> 15 -> 30
  • @pochopsp 移动节点意味着将其从列表中删除,然后将其(同一节点)添加到列表中的不同位置。没有其他办法了。据我所知,指导方针说您不能删除和重新创建节点,这与删除和添加完全不同。举例来说,将一本书移动到书架上的不同位置通常需要删除和添加。要删除和重新创建,您必须撕碎这本书,然后打印一份新副本。这是你的锻炼不希望你做的事情。

标签: c linked-list


【解决方案1】:

谢谢各位!我解决了自己编写不同代码的问题。

tiponodo *mul5e3coda(tiponodo *head){

tiponodo *temp2=head,*current=NULL,*next=NULL,*prev=NULL;
int j=0,i=0;

while(temp2!=NULL){
  if((temp2->val%3==0)&&(temp2->val%5==0)&&temp2!=NULL){
    j++;
    temp2=temp2->next;
  }else{
    temp2=temp2->next;}
}

while(i<j){
temp2=head;
current=head->next;

if((head->val%3==0)&&(head->val%5==0)&&head!=NULL){
     while(temp2->next!=NULL){
        temp2=temp2->next;
      }

      temp2->next=head;
      head=head->next;
      temp2->next->next=NULL;
}else{
     while(((current->val%3!=0)||(current->val%5!=0))&&current!=NULL){
        next=current->next->next;
        prev=current;
        current=current->next;
     }
     if((current->val%3==0)&&(current->val%5==0)&&current!=NULL){
        while(temp2->next!=NULL){
        temp2=temp2->next;
      }

        temp2->next=current;
        prev->next=next;
        temp2->next->next=NULL;

     }
  }
 i++;
 }
return head;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2014-02-02
    相关资源
    最近更新 更多