/*线性表的链式表示和实现*/
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status Equal(ElemType a,ElemType b){
if(a==b)
return TRUE;
else
return FALSE;
}
Status InitList_L(LinkList &l){
l=(LNode*)malloc(sizeof(LNode));
if(!l)
exit(OVERFLOW);
l->next=NULL;
return OK;
}
Status DestroyList_L(LinkList &l){
LNode *p=l;
while (l){
p=l;
l=l->next;
free(p);
}
return OK;
}
Status ClearList_L(LinkList &l)
{
LNode *p=l;
while (l->next){
p=l->next;
l->next=p->next;
free(p);
}
return OK;
}
int ListLength(LinkList l){
LNode *p=l;
int len=0;
while(p->next){
len++;p=p->next;
}
return len;
}
Status ListEmpty(LinkList l){
if (l->next==NULL)
return TRUE;
else return FALSE;
}
Status GetElem(LinkList l,int i,ElemType &e){
int alen,j=0;
LNode *p=l;
alen=ListLength(l);
if(i<1||i>alen)
exit(ERROR);
while(p->next&&j<i) {
j++;
p=p->next;
}
e=p->data;
return OK;
}
int LocateElem(LinkList l,ElemType e,Status(*compare)(ElemType,ElemType)){
LNode *p=l;
int i=1,alen;
alen=ListLength(l);
while(i<=alen&&!(*compare)(p->next->data,e)){
++i;p=p->next;
}
if(i<=alen)
return i;
else
return 0;
}
Status ListInsert(LinkList &l,int i,ElemType e){
int alen,j=0;
LNode *p=l,*q;
alen=ListLength(l);
if(i<1||i>alen+1)
exit(ERROR);
while (p->next&&j<i-1){
j++;
p=p->next;
}
q=(LNode*)malloc(sizeof(LNode));
if(!q)
exit(OVERFLOW);
q->data=e;
q->next=p->next;
p->next=q;
return OK;
}
Status ListDelete(LinkList &l,int i,ElemType &e){
int alen,j=0;
LNode *p=l,*q;
alen=ListLength(l);
if(i<1||i>alen)
return ERROR;
while (p->next&&j<i-1){
j++;
p=p->next;
}
q=p->next;
p->next=p->next->next;
free(q);
return OK;
}
void Print(ElemType c){
printf("%d ",c);
}
Status ListTraverse(LinkList l,void(*vi)(ElemType)){
LNode *p=l;
int i;
while (p->next){
p=p->next;
vi(p->data);
}
printf("
");
return OK;
}
void Union(LinkList &La,LinkList Lb){
ElemType e;
int La_len=ListLength(La);
int Lb_len=ListLength(Lb);
for(int i=1;i<=Lb_len;i++){
GetElem(Lb,i,e);
if(!LocateElem(La,e,Equal))
ListInsert(La,++La_len,e);
}
}
int a[5]={3,5,8,11},b[8]={2,6,8,9,11,15,20};
int main(){
LinkList La,Lb;
int n,i;
InitList_L(La);
InitList_L(Lb);
for(i=1;i<=4;i++){
ListInsert(La,i,a[i-1]);
}
for(i=1;i<=7;i++){
ListInsert(Lb,i,b[i-1]);
}
Union(La,Lb);
ListTraverse(La,Print);
return 0;
}