type.h
#ifndef TYPE_H
#define TYPE_H 1
typedef int ElemType;
#endif
main.c
//线性表La、Lb,求AUB?用顺序表实现
#include <stdio.h>#include <stdlib.h>
#include "type.h"
#define LIST_INIT_SIZE 100 //线性表存储空间初始分配长度
#define LISTINCREAMENT 10 //线性表存储空间的分配增量
typedef struct List{
ElemType* elem; //存储空间基地址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}List;
void print(List* L);
void InitList(List* L); //构造一个空的线性表L
int ListLength(List L); //取得线性表L的长度
void ListInsert(List* L, int i, ElemType e); //在线性表L的第i个元素之前插入新的元素e
ElemType GetElem(List L, int i, ElemType e); //返回线性表L中第i个元素并将其赋值给e
int equal(List L1, List L2); //数据元素判定函数
int LocateElem(List L, ElemType e, int (*p)(List L1, ElemType)); //判断线性表L中是否存在元素与e相等,相等返回对应的位序,不等返回0
void Union(List* L1, List L2);
int main(){
int i = 0;
ElemType e = 0;
List* La = (List*)malloc(sizeof(List));
List* Lb = (List*)malloc(sizeof(List));;
InitList(La);
InitList(Lb);
printf("请输入线性表La中要插入的元素:");
for(i = 0; i < 5; ++i)
{
scanf("%d", &e);
ListInsert(La, 1, e);
}
printf("请输入线性表Lb中要插入的元素:");
for(i = 0; i < 3; ++i)
{
scanf("%d", &e);
ListInsert(Lb, 1, e);
}
Union(La, *Lb);
print(La);
return 0;
}
void print(List* L){
int i = 0;
for(i = 0; i < L->length; ++i)
{
printf("%d\n", L->elem[i]);
}
printf("\n");
}
void InitList(List* L){
//构造一个空的线性表L
L->elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L->elem) //空间分配失败,则函数直接退出
exit(-1);
L->length = 0; //空表长度为0
L->listsize = LIST_INIT_SIZE; //初始时表的存储容量
}
int ListLength( List L){
return L.length; //取得线性表的长度
}
void ListInsert(List* L, int i, ElemType e){ //在线性表L中第i个元素之前插入新的元素e
ElemType* p = 0, *q = 0;
if(i < 1 || i > L->length + 1) //判断i的值是否合法?
{
printf("插入地方不合法");
exit(-1);
}
if(L->length >= L->listsize) //当前存储空间已满,需要分配新的空间
L->elem = (ElemType*)realloc(L->elem, (L->listsize + LISTINCREAMENT) * sizeof(ElemType));
if(!L->elem) //重新分配空间失败
exit(-1);
L->listsize += LISTINCREAMENT; //增加存储容量
q =&( L->elem[i-1]); //q为插入元素的位置
for(p = &(L->elem[L->length-1]); p >= q ;--p) //插入时后面的元素需要后移
{
*(p+1) = *p;
}
*q = e; //插入元素
++L->length; //表长增加1
}
ElemType GetElem(List L, int i, ElemType* e){ //取出线表L中第i个元素,并将其赋值给e
*e = L.elem[i-1];
return *e;
}
int equal(List L, ElemType e){
int i = 1;
for(i = 1; i <= L.length; ++i)
{
if(L.elem[i-1] == e)
return i;
}
return 0;
}
int LocateElem(List L, ElemType e, int (*p)(List L, ElemType e)){
return p(L, e);
}
void Union(List* L1, List L2){
ElemType e = 0;
int i = 0;
L1->length = ListLength(*L1);
L2.length = ListLength(L2);
for(i = 1; i <= L2.length; ++i)
{
GetElem(L2, i, &e);
if(!LocateElem(*L1, e, equal))
//printf("##");
ListInsert(L1, L1->length + 1, e);
} ;
}