#include <iostream>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
typedef int ElemType;
typedef int status;
//线性表结构
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
//初始化线性表
status InitList_Sq(SqList &L, int number = 0 )
{
L.elem = new ElemType[LIST_INIT_SIZE];
if ( !L.elem )
{
exit(OVERFLOW);
}
L.length = number;
L.listsize = LIST_INIT_SIZE;
cout << "Input the value of the list:"<< endl;
ElemType value;
for ( int i = 0; i < number; i++ )
{
cin >> value;
L.elem[i] = value;
}
return OK;
}
//在第i个元素之前插入一个元素e
status ListInsert_Sq(SqList &L, int i, ElemType e )
{
if ( i < 1|| i > L.length + 1 )
{
return ERROR;
}
if ( L.length >= L.listsize )
{
ElemType* newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(ElemType));
if ( !newbase)
{
exit(OVERFLOW);
}
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
//int rules =
ElemType* q =L.elem + i - 1;
ElemType* end = L.elem + L.length - 1;
for (ElemType* p = end; p >= q; p-- )
{
*(p+1) = *p;
}
*q = e;
L.length++;
return OK;
}
status ListDelete_Sq( SqList &L, int i, ElemType &e )
{
if ( i < 1 || i > L.length )
{
return ERROR;
}
e = L.elem[i];
ElemType *q = &L.elem[L.length-1];
for ( ElemType* p = &L.elem[i]; p <= q; p++ )
{
*(p-1) = *p;
}
L.length--;
return OK;
}
int LocateElem_Sq( SqList L, ElemType e )
{
int location = 0;
ElemType* p = &L.elem[0];
ElemType* q = &L.elem[L.length-1];
while ( *p != e && p < q )
{
p++;
location++;
}
return location+1;
}
void MergeList_Sq( SqList La, SqList Lb, SqList &Lc )
{
Lc.length = La.length + Lb.length;
Lc.listsize = Lc.length;
ElemType* pa = La.elem;
ElemType* pb = Lb.elem;
Lc.elem = new ElemType[Lc.listsize];
if (!Lc.elem)
{
exit(OVERFLOW);
}
ElemType* pc = Lc.elem;
ElemType* pa_End = La.elem + La.length - 1;
ElemType* pb_End = Lb.elem + Lb.length - 1;
while( pa <= pa_End && pb < pb_End )
{
if ( *pa < *pb )
{
*pc = *pa;
pa++;
}
else
{
*pc = *pb;
pb++;
}
pc++;
}
while( pa <= pa_End )
{
*pc++ = *pa++;
}
while( pb <= pb_End )
{
*pc++ = *pb++;
}
}
void output_List( SqList &L )
{
ElemType *q = &L.elem[L.length-1];
for ( ElemType *p = &L.elem[0]; p <= q; p++ )
{
cout << *p << " ";
}
cout << endl;
}
int main()
{
SqList L;
cout <<"Input the number of the value of List:"<< endl;
int t;
cin >> t;
InitList_Sq( L, t );
output_List(L);
cout << "Input the insert location and the value:"<<endl;
int Insert_location, Insert_value;
cin >> Insert_location >> Insert_value;
ListInsert_Sq( L, Insert_location, Insert_value );
output_List(L);
cout << "Input the delete location:"<< endl;
int Delete_location;
ElemType Returned_value;
cin >> Delete_location;
ListDelete_Sq( L, Delete_location, Returned_value );
output_List(L);
cout << Returned_value << endl;
cout << "Input the element to be located:"<<endl;
int elem;
cin >> elem;
int g = LocateElem_Sq( L, elem );
cout << g << endl;
SqList La;
SqList Lb;
SqList Lc;
int ta,tb;
cin >> ta;
InitList_Sq( La, ta );
output_List(La);
cin >> tb;
InitList_Sq( Lb, tb );
output_List(Lb);
MergeList_Sq(La,Lb, Lc);
output_List(Lc);
return 0;
}