数据结构>>线性表【注意】-->链表求A-B(原A与B都递增,求完的A-B不改变A原来的顺序)

/*关于链表的题目
 * A、B是两个递增有序的单链表,元素个数分别是m和n,求
 * 集合A-B,并将结果保存在A中,且仍然保持递增有序。
 * converge_ab
 */

#include <iostream.h>
using namespace std;

typedef struct lnode{
    int data;
    struct lnode * next;
}lnode;

int main(){
    lnode * create_chain(int num,int interval,int start);
    void converge_ab(lnode *A,lnode *B);
    lnode * A,*B,*q,*p;
    int m=4,n=7;

     A=create_chain(4,3,2);        //2 5 8 11
     B=create_chain(7,4,1);        //1 5 9 13 17 21 25
     p=A;
/*      while(p->next != NULL){
            cout << p->next->data <<" ";
            p=p->next;
        }
      cout << endl;
     q=B;
      while(q->next != NULL){
            cout << q->next->data <<" ";
            q=q->next;
        }
      cout << endl;
    converge_ab(A,B,m,n);
      p=A;
*/
     converge_ab(A,B);
     p=A;
      while(p->next != NULL){
            cout << p->next->data <<" ";
            p=p->next;
        }

}

lnode * create_chain(int num,int interval,int start){
    lnode * head=(lnode *)malloc(sizeof(lnode)),*p,*q=head;
    int i;
    for(i=0;i<num;i++){
        p=(lnode *)malloc(sizeof(lnode));
        p->data=start+(i*interval);
        p->next=NULL;
        q->next=p;
        q=q->next;
    }
    return head;
}

void converge_ab(lnode *A,lnode *B){
    lnode * q=B->next,* r=A,* temp;
    while(r->next!=NULL && q!=NULL){
        if(r->next->data < q->data){
            r=r->next;
        }else if(r->next->data == q->data){
            temp=r->next;
            r->next=temp->next;
            free(temp);
        }else{
            q=q->next;
        }
    }
}
这里之前犯的错误是将后面的写成三个if,而不是else if。它们的区别在于:
 
如果是三个if, 这三个if在条件成立的情况下都会执行,假设第一个if已经执行了,这时r是改变了的,这样一旦改变了的r也符合后面的标准,就会继续执行下面的if
 
如果是if else的话,会选if...else if....else...里面三种情况之一来执行,执行完之后就会退出来,进行下一轮的循环。
 
(使两者等价的做法是将3个if的那种情况中,里面每一个if里面的最后加上continue)
posted on 2014-08-14 20:47  各种笔记  阅读(330)  评论(0编辑  收藏  举报