数据结构—线性表AUB

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);
} ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值