#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ElemType int
//数据元素的数据类型
#define LIST_INIT_SIZE 100
//线性表储存空间的初始分配量
#define LISTINCREMENT 10
//线性表储存空间的分配增量
typedef int Status;
/*--建立list线性表结构体--*/
typedef struct Sq
{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的储存容量
} SqList;
Status InitList_Sq(SqList &L);
void out(SqList &L);
void unionL(SqList &La,SqList Lb);
void GetElem(SqList L,int i,ElemType &e);
int LocateElem(SqList &L,ElemType e);
int ListLingth(SqList &L);
Status ListDelete_Sq(SqList &L, int i, ElemType &e);
Status ListInsert_Sq(SqList &L, int i, ElemType e);
void MergeList(SqList La,SqList Lb,SqList &Lc);
int main()
{
int i,j,e,lo,temp;
int k;
SqList *L=(SqList*)malloc(sizeof(SqList));
SqList *Lb = (SqList*)malloc(sizeof(SqList));
SqList *Lc = (SqList*)malloc(sizeof(SqList));
//将这个表传递过去
InitList_Sq(*L);
InitList_Sq(*Lb);
InitList_Sq(*Lc);
//*p. == p->
printf("请输La顺序表的长度:\n");
scanf("%d",&L->length);
printf("请输入La顺序表的各个元素:\n");
for(i=0; i<L->length; ++i)
{
scanf("%d",&L->elem[i]);
}
printf("输入的顺序表是:\n");
out(*L);
//输入Lb
printf("请输Lb顺序表的长度:\n");
scanf("%d",&Lb->length);
printf("请输入Lb顺序表的各个元素:\n");
for(i=0; i<Lb->length; ++i)
{
scanf("%d",&Lb->elem[i]);
}
printf("输入的顺序表是:\n");
out(*Lb);
printf("判断是否存在:\n");
scanf("%d",&k);
printf("%dasda sd\n",LocateElem(*L,k));
printf("请输入插入的第几个位置后面,以及节点:\n");
scanf("%d%d",&j,&e);
ListInsert_Sq(*L,j,e);
printf("插入后的顺序表为:\n");
out(*L);
printf("请输入要删除数据元素的的位置:");
scanf("%d",&lo);
ListDelete_Sq(*L,lo,temp);
printf("被删除的元素为%d\n",temp);
printf("删除之后为\n");
out(*L);
//unionL(*L,*Lb);
// printf("合并之后的L为\n");
// out(*L);
MergeList(*L,*Lb,*Lc);
printf("LA,LB合并之后为\n");
out(*Lc);
printf("长度为 %d",Lc->length);
free(L);
free(Lb);
return 0;
}
/*--构造一个空的线性表L--*/
Status InitList_Sq(SqList &L)
{
//申请长度
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
{
return 0;
}
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return 1;
}
/*--在顺序线性表L中第i个位置之前插入一个新的元素e--*/
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{
ElemType *p;
if(i < 1 || i > L.length+1)
{
return 0;
}
if(L.length >= L.listsize)
{
// 当前存储空间已满,增加容量
ElemType *newbase = (ElemType *)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof (ElemType));
if(!newbase)
{
return 0; // 存储分配失败
}
L.elem = newbase; // 新基址
L.listsize += LISTINCREMENT; // 增加存储容量
}
ElemType *q = &(L.elem[i-1]); // q为插入位置
for (p = &(L.elem[L.length-1]); p>=q; --p)
*(p+1) = *p;
// 插入位置及之后的元素右移
*q = e; // 插入e
++L.length; // 表长增1
return 1;
}
/*--在顺序线性表L中删除第i个元素,并用e返回其值--*/
Status ListDelete_Sq(SqList &L, int i, ElemType &e)
{
ElemType *p, *q;
if (i<1 || i>L.length)
{
return 0;
}
//删除位置
p = &(L.elem[i-1]);
e = *p;
//&(L.elem[L.length-1]
//q指向尾部
q = &L.elem[L.length-1];
// L.elem为数组的首部地址
// q = L.elem+L.length-1;
for(++p; p<=q; ++p)
{
*(p-1) = *p; // 被删除元素之后的元素左移
}
--L.length; // 表长减1
return 1;
}
int ListLingth(SqList &L)
{
return L.length;
}
//判断是否存在改元素
int LocateElem(SqList &L,ElemType e)
{
for(int i=0; i<L.length; i++)
{
if(e == L.elem[i])
return 1;
}
return 0;
}
void GetElem(SqList L,int i,ElemType &e)
{
e = L.elem[i-1];
}
//将所有在Lb中,但是不在La中的元素插入到La中
void unionL(SqList &La,SqList Lb)
{
int la_len,lb_len;
int i;
ElemType e;
la_len = ListLingth(La);
lb_len = ListLingth(Lb);
printf("la_len = %d\n",la_len);
printf("lb_len = %d\n",lb_len);
for( i=1; i <= lb_len; i++ )
{
GetElem(Lb, i, e);
if( !LocateElem(La, e) )
{
ListInsert_Sq(La, ++la_len, e);
}
}
}
/*
La,Lb为有序的,也为递增
将LA和LB合并,并按递增增加
*/
void MergeList(SqList La,SqList Lb,SqList &Lc)
{
//k代表的个元素
int la_len,lb_len;
//用于临时存放La,Lb的的元素
int ai,bj;
int i,j,k;
i=j=1;
k=0;
la_len = ListLingth(La);
lb_len = ListLingth(Lb);
printf("ok\n");
while((i <= la_len)&&(j <= lb_len))
{
GetElem(La,i,ai);
GetElem(Lb,j,bj);
printf("ai = %d \n",ai);
printf("bj = %d \n",bj);
printf("i = %d\n",i);
printf("j = %d\n",j);
printf("\n");
if(ai <= bj)
{
ListInsert_Sq(Lc,++k,ai);
i++;
}
else
{
ListInsert_Sq(Lc,++k,bj);
j++;
}
}
printf("---");
printf("i = %d\n",i);
printf("j = %d\n",j);
while(i <= la_len)
{
GetElem(La,i++,ai);
ListInsert_Sq(Lc,++k,ai);
}
while(j <= lb_len)
{
GetElem(Lb,j++,bj);
ListInsert_Sq(Lc,++k,bj);
}
}//end MereList
/*--遍历输出顺序线性表--*/
void out(SqList &L)
{
int k;
for(k=0; k<L.length; k++)
{
printf("%d ",L.elem[k]);
if(k == L.length-1)
{
printf("\n");
}
}
}