//合并线性表(顺序存储)
#include <iostream>
using namespace std;
#include <windows.h>
#include <malloc.h>
#define LIST_INIT_SIZE 10
#define LIST_INCREATMENT 2
typedef int Elemtype;typedef struct SqList
{
Elemtype * elem;
int length;
int size;
}SqList,*SqListPtr;typedef enum Status
{
success,fail
}Status;
//***********************************************************************************************
//调试菜单
void menu ();
//线性表的初始化
Status List_Init(SqListPtr L);
//获得线性表的长度
int List_Size(SqListPtr L);
//录入
Status List_Input(SqListPtr L,Elemtype elem);
//插入
Status List_Insert(SqListPtr L,int pos,Elemtype elem);
//定位
Status Locate (SqListPtr L,Elemtype elem,int *pos);
//提取
Status Retrival(SqListPtr L,int pos,Elemtype * elem);
//遍历
void List_Printf(SqListPtr L);
//***********************************************************************************************
//合并两个线性表
Status List_Union(SqListPtr L1,SqListPtr L2);int main ()
{
SqListPtr L1 = (SqListPtr)malloc(sizeof(SqList));
SqListPtr L2 = (SqListPtr)malloc(sizeof(SqList));
if(List_Init(L1) != success || List_Init(L2) != success)
exit(1);
List_Input(L1,1);
List_Input(L2,2);
List_Union(L1,L2);
List_Printf(L2);
/*******************************************************************************************
//调试函数
char Copy;
SqListPtr L = (SqListPtr)malloc(sizeof(SqList));
Elemtype elem;
Elemtype * Elem = &elem;
int pos;
int * Pos = &pos;
while(1)
{
menu ();
cin>>Copy;
system("cls");
switch(Copy)
{
case 'A':
case 'a':
{
if(List_Init(L) == success)
puts("初始化成功");
else
puts("初始化失败");
break;
}
case 'B':
case 'b':
{
cout<<"线性表的长度为:"<<List_Size(L)<<endl;
break;
}
case 'C':
case 'c':
{
puts("请输入 -- 数据 -- 位置");
cin>>elem>>pos;
if(List_Insert(L,pos,elem) == success)
puts("插入成功");
else
puts("插入失败");
break;
}
case 'D':
case 'd':
{
puts("请输入数据");
cin>>elem;
if(List_Input(L,elem) == success)
puts("录入成功");
else
puts("录入失败");
break;
}
case 'E':
case 'e':
{
List_Printf(L);
break;
}
case 'F':
case 'f':
{
puts("请输入你要定位的数据");
cin>>elem;
if(Locate (L,elem,Pos) == success)
cout<<elem<<"是第"<<*Pos<<"个"<<endl;
else
cout<<"该数据不存在"<<endl;
break;
}
case 'G':
case 'g':
{
puts("请输入你要提取数据的序号");
cin>>pos;
if(Retrival(L,pos,Elem) == success)
cout<<"该数据为:"<<*Elem<<endl;
else
cout<<"不存在"<<endl;
break;
}
}
}
/*******************************************************************************/
return 0;
}
//***************************************************************************************************
//菜单
void Menu ()
{
} //合并两个线性表
Status List_Union(SqListPtr L1,SqListPtr L2)
{
Status s = success;
Elemtype elem;
int pos;
int L1_Length = List_Size(L1);
int i;
for(i=0 ;i<L1_Length;i++)
{
if(Retrival(L1,i+1,&elem) != success)
break;
s = Locate(L2,elem,&pos);
if(s!=success)
{
s = List_Insert(L2,1,elem);
if(s != success)
break;
}
}
if(i == L1_Length)
s = success;
return s;
} //***************************************************************************************************
//********************************************************************************************************//调试菜单
void menu ()
{
puts("A 初始化线性表");
puts("B 获得线性表的长度");
puts("C 插入");
puts("D 录入");
puts("E 遍历");
puts("F 定位");
puts("G 提取");
}//线性表的初始化
Status List_Init(SqListPtr L)
{
Status s = fail;
L->size = LIST_INIT_SIZE;
L->length = 0;
L->elem = (Elemtype *)malloc(sizeof(Elemtype)*L->size);
if(L->elem == NULL)
return s;
s = success;
return s;
}//获得线性表的长度
int List_Size(SqListPtr L)
{
return L->length;
} //插入
Status List_Insert(SqListPtr L,int pos,Elemtype elem)
{
Status s = fail;
if(pos<=0 || pos>L->length)
return s;
L->length++;
if(L->length >=L->size)
{
Elemtype * p = L->elem;
L->size+=LIST_INCREATMENT;
L->elem = (Elemtype *)malloc(sizeof(Elemtype)*L->size);
if(L->elem == NULL)
return s;
for(int i = 0; i< L->length ; i++)
{
L->elem[i] = p[i];
}
}
for(int i = L->length-2; i>=pos-1;i--)
{
L->elem[i+1] = L->elem[i];
}
L->elem[pos-1] = elem;
s = success;
return s;
}//录入
Status List_Input(SqListPtr L,Elemtype elem)
{
Status s = fail;
if(L->length >= L->size)
{
Elemtype * p = L->elem;
L->size+=LIST_INCREATMENT;
L->elem = (Elemtype *)malloc(sizeof(Elemtype)*L->size);
if(L->elem = NULL)
return s;
for(int i = 0; i<L->length; i++)
{
L->elem[i] = p[i];
}
}
L->elem[L->length] = elem;
L->length++;
s = success;
return s;
}//定位
Status Locate (SqListPtr L,Elemtype elem,int *pos)
{
Status s = fail;
int i;
for(i=0; i<L->length; i++)
{
if(L->elem[i] == elem)
{
s = success;
break;
}
}
*pos = i+1;
return s;
}//提取
Status Retrival(SqListPtr L,int pos,Elemtype * elem)
{
Status s = fail;
if(pos<=0 || pos>L->length)
return s;
*elem = L->elem[pos-1];
s = success;
return s;
}//遍历
void List_Printf(SqListPtr L)
{
for(int i = 0; i<L->length ;i++)
{
cout<<L->elem[i]<<" ";
if((i+1)%3==0)
cout<<endl;
}
}
//********************************************************************************************************