/*
线性表的合并
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>
typedef int ElemType;
typedef struct Lnode{
ElemType data;
struct Lnode * next;
}LNode, * LinkList;
/*
单链表的建立:尾插法
*/
LinkList CreateList_R(){
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
int x;
LinkList p, r = L;
scanf("%d", &x);
while(x != 9999){
p = (LinkList)malloc(sizeof(LNode));
p->data = x;
p->next = NULL;
r->next = p;
r = p;
scanf("%d", &x);
}
return L;
}
/*
求单链表L的长度
*/
int ListLength_L(LinkList L){
int len = 0;
LinkList p;
p = L->next;
while(p){
p = p->next;
len++;
}
return len;
}
/*
取值:取单链表中第i个元素的内容
*/
int GetElem_L(LinkList L, int i, ElemType * e){
LinkList p;
p = L->next;
int j = 1;
while(p && i > j){
p = p->next;
j++;
}
if(!p || j > i ) return 0;
*e = p->data;
return 1;
}
/*
查找:按值查找:根据指定数据获取数据所在位置(序号)
*/
int LocateElem_L2(LinkList L, ElemType e){
LinkList p;
p = L->next;
int j = 1;
while(p && p->data != e){
p = p->next;
j++;
}
if(p)return j;
else return 0;
}
/*
插入:在第i后结点插入新结点
*/
int ListInsert_L(LinkList L, int i, ElemType e){
LinkList p;
p = L;
int j = 0;
while(p && i-1 > j){
p = p->next;
j++;
}
if(!p || j > i - 1) return -1;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
/*
线性表的合并
*/
void Union(LinkList La, LinkList Lb){
int La_len = ListLength_L(La);
int Lb_len = ListLength_L(Lb);
int i;
int e;
for(i = 1; i <= Lb_len; i++){
GetElem_L(Lb, i, &e);
if(!LocateElem_L2(La, e)){
ListInsert_L(La, La_len++, e);
}
}
}
/*
链表的遍历
*/
void traverse_list(LinkList L){
LinkList p;
p = L->next;
while(p){
printf("%d ", p->data);
p = p->next;
}
printf("
");
return;
}
int main(){
//第一个单链表La
printf("--------------创建第一个单链表------------
");
LinkList La = CreateList_R();
//第二个单链表La
printf("--------------创建第二个单链表------------
");
LinkList Lb = CreateList_R();
Union(La, Lb);
traverse_list(La);
return 0;
}