c语言用另一个链表填充空链表

fill empty linked list from another linked list in c language

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

char cl; 
int time; 
int lng;

C 0 1

D 0 2

B 2 1

A 2 2

我想从此列表复制到一个新的空列表,但前提是(时间>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 不需要字符串复制)
  • while 必须在循环的开头(如果给定列表为空,您的代码将失败)
  • 缺少分号
  • 新列表连接错误
  • 常量正确性错误(node *head=n; 中缺少常量)
  • 内部 head 变量不是必需的(并且参数命名 n 也不理想。如果将其命名为 "start"/"head"/"begin", 评论就不需要了)

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

请注意,您可能希望从 return 值类型中删除 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