数据结构>>线性表【注意】-->链表求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)