用 C 语言从另一个链表填充空链表



我有一个包含数据的完整链表,我想要的是用相同的数据填充另一个链表,但有一个条件,所以假设这是链表:

char cl; 
int time; 
int lng;

C 0 1

D 0 2

B 2 1

A 2 2

我想从这个列表复制到一个新的空列表,但前提是(time>0),所以新的列表将是这样的:

B 2 1

A 2 2

我已经尝试过这段代码,但它不起作用:

void insert(const node * n )// this where i put the pointer of the full node
{
    node *head=n;
    node *sec; // new node
    sec=(node*)malloc(sizeof(node)); 
    do{
        if(head->time>0){
            strcpy(sec->cl,head->cl);
            sec->time= head->time;
            sec->lng= head->lng;
            head=head->next;
            sec=sec->next;
        }
        else 
            head=head->next;
    }while(head!=NULL);
    print(sec) // this will print the new node
}

请帮帮我。谢谢

我结合了评论中的所有建议以及一些额外的修复。 下面是生成的代码:

const node* insert(const node * head)
{
    node *sec = NULL;  // start of the new, second list
    node *last = NULL; // points to the last inserted node
    while(head!=NULL){
        if(head->time > 0){
            node* newsec=(node*)malloc(sizeof(node)); 
            newsec->cl = head->cl;
            newsec->time = head->time;
            newsec->lng = head->lng;
            newsec->next = NULL;
            //Add the new node to the list:
            if(last == NULL){ //This is the first element in the new list
               sec = newsec;
            }else{
               last-> next = newsec;
            }
            last = newsec;
        }
        head=head->next;
    }
    print(sec); // this will print the new node
    return sec;
}

你的错误:

    内存分配
  • 错误(您只分配了一次内存)
  • 不需要 strcpy (char's 不需要字符串副本)
  • 而必须位于循环的开头(如果给定列表为空,您的代码将失败)
  • 缺少分号
  • 新列表的连接错误
  • 错误的常量
  • 正确性(node *head=n;中缺少常量)
  • 内部head变量不是必需的(参数命名n也不理想。如果您将其命名为"开始"/"头"/"开始",则不需要注释)

另一个建议:为您的结构使用大写名称,因为它可以更轻松地区分类型和变量(应该是Node,而不是node)

请注意,您可能希望从返回值类型中删除const

// Note: a better function name might be: printNodesWithTime
void insert(const node * pOld )
{
    // note: since nothing is done with the new linked list,
    //       there is no need to actually create it
    while( NULL != pOld )
    {
        if(pPld->time > 0)
        {
            print(pOld) // this will print the node
        }
        // step to next old node
        pOld = pOld->next;
    } // end while
} // end function: insert

相关内容

  • 没有找到相关文章

最新更新