number 26:从A,B中找出公共元素产生单链表C,要求不破坏A,B结点。
void Union_1(LNode *A, LNode *B, LNode *&C){
LNode *p=A->next, *q=B->next;
LNode *r=C;
while(p&&q){
if(p->data < q->data)
p = p->next;
else if(p->data > q->data)
q = q->next;
else{
LNode *k = new LNode;
k->data = p->data;
r->next = k;
r = k;
p = p->next;
q = q->next;
}
}
r->next = NULL;
}
number27 从A,B中找出公共元素并存放于A链表中。
取A链表的头结点,若有重复元素,则使用尾插法插入A链表中。
注意:重复元素取完之后,要释放剩余的结点。
void Union_2(LNode *&A, LNode *&B){
LNode *p=A->next, *q=B->next;
LNode *r=A, *u;
while(p&&q){
if(p->data > q->data){
u = q;
q = q->next;
free(u);
}
else if(p->data < q->data){
u = p;
p = p->next;
free(u);
}
else{
r->next = p;
r = p;
p = p->next;
u = q;
q = q->next;
free(u);
}
}
while(p!=NULL){
u=p; p=p->next; free(u);
}
while(q!=NULL){
u=q; q=q->next; free(u);
}
r->next = NULL;
free(p);
free(q);
}
完整代码
#include<bits/stdc++.h>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
void CreateList_R(LNode *&L, int n){
L = new LNode;
L->next = NULL;
LNode *r = L;
for(int i=0; i<n; i++){
LNode *q = new LNode;
q->next = NULL;
cin>>q->data;
r->next = q;
r = q;
}
}
void Union_1(LNode *A, LNode *B, LNode *&C){
LNode *p=A->next, *q=B->next;
LNode *r=C;
while(p&&q){
if(p->data < q->data)
p = p->next;
else if(p->data > q->data)
q = q->next;
else{
LNode *k = new LNode;
k->data = p->data;
r->next = k;
r = k;
p = p->next;
q = q->next;
}
}
r->next = NULL;
}
void Union_2(LNode *&A, LNode *&B){
LNode *p=A->next, *q=B->next;
LNode *r=A, *u;
while(p&&q){
if(p->data > q->data){
u = q;
q = q->next;
free(u);
}
else if(p->data < q->data){
u = p;
p = p->next;
free(u);
}
else{
r->next = p;
r = p;
p = p->next;
u = q;
q = q->next;
free(u);
}
}
while(p!=NULL){
u=p; p=p->next; free(u);
}
while(q!=NULL){
u=q; q=q->next; free(u);
}
r->next = NULL;
free(p);
free(q);
}
void traverse(LNode *&L){
LNode *p = L->next;
while(p){
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
int main(void){
LNode *A, *B;
CreateList_R(A,3);
CreateList_R(B,3);
LNode *C = new LNode;
C->next = NULL;
traverse(A);
traverse(B);
Union_1(A,B,C);
traverse(C);
Union_2(A,B);
traverse(A);
return 0;
}