如何在c中重置链表?

时间:2018-01-30 09:06:22

标签: c

这个函数计算两个列表之间的差异。有办法吗? 刷新第二个列表,例如使用命令作为倒带(带文件)?

LINK diffIns(LINK lis,LINK lis2){

    LINK p,head,tail;
    head=NULL;
    tail=NULL;
    int trovato=0;
    if(lis==NULL && lis2==NULL){return NULL;}
    while(lis!=NULL){
        trovato=0;
        while(lis2!=NULL && trovato==0){
            if(strcmp(lis->d.targa,lis2->d.targa)==0){
                trovato=1;
            }
            else{
                trovato=0;
            }
            lis2=lis2->next;
        }
        if(trovato==0){
            p=newnode();
            p->d=lis->d;
            p->next=NULL;
            if(head==NULL){head=p; tail=p;}
            else{tail->next=p;tail=p;}
        }
    lis=lis->next;
    }
    return head;
}

1 个答案:

答案 0 :(得分:0)

似乎你想在每次进入lis的下一个元素时从lis2的开头开始?如果是,那么

LINK diffIns(LINK lis,LINK lis2){

    LINK p,head,tail;
    LINK lis2Head = lis2;    // <---
    head=NULL;
    tail=NULL;
    int trovato=0;
    if(lis==NULL && lis2==NULL){return NULL;}
    while(lis!=NULL){
        trovato=0;
        while(lis2!=NULL && trovato==0){
            if(strcmp(lis->d.targa,lis2->d.targa)==0){
                trovato=1;
            }
            else{
                trovato=0;
            }
            lis2=lis2->next;
        }
        if(trovato==0){
            p=newnode();
            p->d=lis->d;
            p->next=NULL;
            if(head==NULL){head=p; tail=p;}
            else{tail->next=p;tail=p;}
        }
    lis=lis->next;
    lis2 = lis2Head;    // <--
    }
    return head;
}

这对你现有代码的影响小于上面保持lis2所在的建议,并使用新指针实际遍历第二个列表,但我同意上述帖子。我通常只在非常简单的函数中修改链表头指针参数。在更复杂的算法中,保持头部不变并使用新指针遍历列表。