#include <iostream>
#include <malloc.h>
using namespace std;
typedef int Elemtype;
typedef struct LNode
{
Elemtype data;
struct LNode *next;
} LinkNode;
void CreateListF(LinkNode *&L,Elemtype a[],int n)
{
LinkNode *s;int i;
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
for (i=0;i<n;i++)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}
void CreateListR(LinkNode *&L,Elemtype a[],int n)
{
LinkNode *s,*r;
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
r=L;
for (int i=0;i<n;i++)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void InitList(LinkNode *&L)
{
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
}
void DestroyList(LinkNode *&L)
{
LinkNode *pre=L,*p=pre->next;
while (p!=NULL)
{ free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
bool ListEmpty(LinkNode *L)
{
return(L->next==NULL);
}
int ListLength(LinkNode *L)
{
LinkNode *p=L;int i=0;
while (p->next!=NULL)
{ i++;
p=p->next;
}
return(i);
}
void DispList(LinkNode *L)
{
LinkNode *p=L->next;
while (p!=NULL)
{ printf("%c ",p->data);
p=p->next;
}
printf("
");
}
bool GetElem(LinkNode *L,int i)
{
int j=0;
LinkNode *p=L;
if (i<=0) return false;
while (j<i && p!=NULL)
{ j++;
p=p->next;
}
if (p==NULL)
return false;
else
{
printf("%c
",p->data);
}
}
int LocateElem(LinkNode *L,Elemtype e)
{
LinkNode *p=L->next;
int n=1;
while (p!=NULL && p->data!=e)
{ p=p->next;
n++;
}
if (p==NULL)
return(0);
else
printf("%d
",n);
}
bool ListInsert(LinkNode *&L,int i,Elemtype e)
{
int j=0;
LinkNode *p=L,*s;
if (i<=0) return false;
while (j<i-1 && p!=NULL)
{ j++;
p=p->next;
}
if (p==NULL)
return false;
else
{ s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
bool ListDelete(LinkNode *&L,int i,Elemtype &e)
{
int j=0;
LinkNode *p=L,*q;
if (i<=0)
return false;
while (j<i-1 && p!=NULL)
{ j++;
p=p->next;
}
if (p==NULL)
return false;
else
{ q=p->next;
if (q==NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
bool isEqual(LinkNode *L, int ListElem, int judgeElem)
{
for(int i=0;i<ListLength(L);i++)
{
GetElem(L ,ListElem);
if(judgeElem== ListElem)
{
return true;
}
}
return false;
}
void BubbleSort( LNode * L) {
struct LNode * p, * q, * x;
x = NULL;
while((L->next->next) != x) {
p = L;
q = L->next;
while(q->next != x) {
if((q->data) > (q->next->data)) {
p->next = q->next;
q->next = q->next->next;
p->next->next = q;
q = p->next;
}
q = q->next;
p = p->next;
}
x = q;
}
}
LinkNode ListMerge(LinkNode *L1,LinkNode *L2) {
LNode *p, *q;
p=L1->next,q=L2->next;
LinkNode L3;
int i=1;
InitList(L3);
while(p&&q)
{
if(p->data<q->data)
{
ListInsert_L(L3,i++,p->data);
p=p->next;
} else if(p->data==q->data)
{
ListInsert_L(L3,i++,p->data);
p=p->next;
q=q->next;
} else
{
ListInsert_L(L3,i++,q->data);
q=q->next;
}
}
while(p) {
ListInsert_L(L3,i++,p->data);
p=p->next;
}
while(q) {
ListInsert_L(L3,i++,q->data);
q=q->next;
}
return L3;
}
LinkNode ListIntersect(LinkNode &L1,LinkNode &L2)
{
LinkNode p=L1->next,q=L2->next;
LinkNode L;
int i=1,flag=0;
InitList(L);
while(p) {
while(q) {
if(p->data==q->data) {
flag=1;
break;
}
q=q->next;
}
if(flag) {
ListInsert_L(L,i++,q->data);
}
p=p->next;
q=L2->next;
flag=0;
}
return L;
}
LinkNode ListDifferent(LinkNode &L1,LinkNode &L2) {
LinkNode p=L1->next,q=L2->next;
LinkNode L;
int i=1,flag=1;
InitList(L);
while(p) {
while(q){
if(p->data==q->data) {
flag=0;
break;
}
q=q->next;
}
if(flag) {
ListInsert_L(L,i++,p->data);
}
p=p->next;
q=L2->next;
flag=1;
}
return L;
}
int main()
{
LinkNode *LA,*LB,*LC,*LD,*LE;
InitList(LA);
InitList(LB);
int a[10] = {1,2,3,4,5,6,7,8,9,10 };
int b[10] = {3,4,7,11,56,23,21,102,9,5};
cout << "集合A:";
CreateListR(LA, a, 10);
DispList(LA);
cout << "集合B:";
CreateListR(LB, b, 10);
DispList(LB);
cout<<"sort LA and LB
";
BubbleSort(LA);
BubbleSort(LB);
LC=ListMerge(LA,LB);
printf("集合的并C:");
DispList(LC);
LD=ListIntersect(LA,LB);
printf("集合的交C:");
DispList(LD);
LE=ListDifferent(LA,LB);
printf("集合的差C:");
DispList(LE);
DestroyList(LA);
DestroyList(LB);
return 0;
}