/*2.18假设递增有序的带头结点的单循环链表A、B分别表示两个集合,
设计算法以求解A= A∪B,并分析算法的时间复杂度。
*/
#include <iostream>
#include<stdlib.h>
using namespace std;
#define max 100
typedef int element;
typedef struct sNode {
element data;
struct sNode* next;
}node, * linklist;
void initiallist(node*& L) {
L = new node;
L->next = L;
}
/*void listLocate(node* L, element x, node*& p) {
p = L->next->next;
while(p != L->next) {
if (p->data == x)
break;
else
p = p->next;
}
if (p == L->next)
p = NULL;
}*/
void listUnion(node* &A, node* B) {//设置A,B的尾指针
node* pa, * pb, * u;
pa = A->next;// 头指针
pb = B->next;
while (pa != NULL && pb != NULL&&pa->next!=NULL&&pb->next!=NULL) {
if (pa->next->data > pb->next->data)//pb插在pa前
{
u = new node;
u->data = pb->next->data;
u->next = pa->next;
pa->next = u;
if (A->next->next == u)
A->next = u;
pa = pa->next;
pb = pb->next;
}
else if (pa->next->data == pb->next->data)
{
pa = pa->next;
pb = pb->next;
}
else {//pa->next->data<pb->next->data, pb插在pa后
u = new node;
u->data = pb->next->data;
u->next = pa->next->next;
pa->next->next = u;
if (A->next==u)
A = u->next;
}
}
}
void createList(node * &L) {
element x;
node* p,*R;
L = new node;
L->next = NULL;
R = L;
cout << "请输入第一个元素数据(整数,9999退出):" << endl;
cin >> x;
while (x != 9999) {
p = new node;
p->data = x;
p->next = NULL; //尾插接入结点
R->next = p;
R = p;
cout << "输入下一个元素数据(整数,9999退出):";
cin >> x;
}
}
void printList(node* &R) {
node* p;
p = R ->next->next;
while (p != R->next&&p!=NULL) {
cout << p->data << " ";
p = p->next;
}
}
int main() {
node* A, * B;
initiallist(A);
initiallist(B);
cout << "输入A中元素:"<<endl;
createList(A);
cout << "输入B中元素:"<<endl;
createList(B);
listUnion(A, B);
printList(A);
return 0;
}
我能输入A,B集合的元素,但是最后打印出来的结果是这样的
想问一下哪里出问题了,我觉得应该是listUnion函数有问题,但是我实在找不出来为什么