#include<iostream>
#include<stdlib.h>
using namespace std;
const int ListSize=100;
const int Block=10;
typedef struct _Node{
int* s;
int length;
int listSize;
}Node;
typedef Node* ptrtoNode;
typedef ptrtoNode List;
void makeList(Node* L){
L->s=(int*)malloc(sizeof(int)*ListSize);
if(!L->s){
return ;
}
L->length=0;
L->listSize=ListSize;
for(int i=0;i<L->listSize;i++){
L->s[i]=0;
}
}
void destroy(Node* L){
if(!L->s)
return ;
free(L->s);
L->s=NULL;
L->length=0;
L->listSize=0;
}
void ClearList(Node* L){
if(!L->s)
return;
L->length=0;
}
bool isEmpety(Node L){
return L.length==0;
}
int ListLength(Node L){
return L.length;
}
int getElement(Node L,int i){
if(i>=L.length){
cout<<"不存在"<<endl;
return 0;
}
else
return L.s[i];
}
int getElemP(Node L,int n){
if(L.length==0){
cout<<"空表"<<endl;
return -1;
}
for(int i=0;i<L.length;i++){
if(L.s[i]==n)
return i;
}
cout<<"找不到"<<endl;
return -1;
}
int findPrevious(Node L,int n){
int i=getElemP(L,n);
if(i==-1)
return -1;
if(i==0){
cout<<"无"<<endl;
return -1;
}
return i-1;
}
int findNext(Node L,int n){
int i=getElemP(L,n);
if(i==-1)
return -1;
if(i==L.length-1){
cout<<"无"<<endl;
return -1;
}
return i+1;
}
void insert(List L,int i,int n){
if(!L->s){
cout<<"先建表"<<endl;
return ;
}
if(L->length==L->listSize){
L->s=(int*)realloc(L->s,sizeof(int)*(L->listSize+Block));
L->listSize+=Block;
}
if(i<0){
cout<<"范围不对"<<endl;
return;
}
if(i>=L->length){
L->length=i+1;
L->s[i]=n;
cout<<"compeleted"<<endl;
return ;
}
for(int j=L->length;j>i;j--){
L->s[j]=L->s[j-1];
}
L->s[i]=n;
L->length++;
cout<<"compeleted"<<endl;
}
void insert2 (List L,int n){
if(!L->s){
cout<<"先建表"<<endl;
return ;
}
if(L->length==L->listSize){
L->s=(int*)realloc(L->s,sizeof(int)*(L->listSize+Block));
L->listSize+=Block;
}
L->s[L->length]=n;
L->length++;
}
void deleteL(List L,int i){
if(!L->s){
cout<<"先建表"<<endl;
return ;
}
if(i<0){
cout<<"不合法"<<endl;
return ;
}
if(i>=L->length){
cout<<"范围不对"<<endl;
return ;
}
for(int j=i;j<L->length-1;j++){
L->s[j]=L->s[j+1];
}
L->s[L->length-1]=0;
L->length--;
}
void show(Node L){
int cnt=0;
if(!L.s){
cout<<"先建表"<<endl;
return ;
}
for(int i=0;i<L.length;i++){
cnt++;
if(cnt%5==0)
cout<<L.s[i]<<' '<<endl;
else cout<<L.s[i]<<' ';
}
}
void unionL(){
List L1=(List)malloc(sizeof(Node));
List L2=(List)malloc(sizeof(Node));
makeList(L1);
makeList(L2);
char c;
do{
c=cin.get();
}while(c!='{');
while(1){
c=cin.peek();
if(c==' '){
cin.get();
continue;
}
if(c=='}'){
cin.get();
break;
}
int n=0;
do{
n=10*n+c-'0';
cin.get();
c=cin.peek();
} while(isdigit(c));
insert2(L1,n);
}
do{
c=cin.get();
}while(c!='{');
while(1){
c=cin.peek();
if(c==' '){
cin.get();
continue;
}
if(c=='}'){
cin.get();
break;
}
int n=0;
do{
n=10*n+c-'0';
cin.get();
c=cin.peek();
} while(isdigit(c));
insert2(L2,n);
}
List L3=(List)malloc(sizeof(Node));
makeList(L3);
int i=0;
int j=0;
while(i<L1->length&&j<L2->length){
if(L1->s[i]<L2->s[j]){
insert2(L3,L1->s[i]);
i++;
}else{
insert2(L3,L2->s[j]);
j++;
}
}
if(i==L1->length){
for(int t=j;t<L2->length;t++){
insert2(L3,L2->s[t]);
}
}
if(j==L2->length){
for(int t=i;t<L1->length;t++){
insert2(L3,L1->s[t]);
}
}
show(*L3);
}
int main(){
Node L;
int i;
do{
cout<<"1--初始化一个顺序表\n"<<
"2--销毁一个线性表\n"<<
"3--清空线性表\n"<<
"4--判断线性表是否为空\n"<<
"5--求表的长度\n"<<
"6--求线性表指定位置的元素\n"<<
"7--获取元素位置\n"<<
"8--求前驱\n"<<
"9--求后继\n"<<
"10--在指定位置插入\n"<<
"11--删除指定位置元素\n"<<
"12--显示\n"<<
"13--合并两个非递减有序线性表\n"<<
"退出输入负数\n"<<endl;
cin>>i;
system("cls");
switch(i){
case 1:
makeList(&L);
break;
case 2:
destroy(&L);
break;
case 3:
ClearList(&L);
break;
case 4 :
if(isEmpety(L))
cout<<"empety"<<endl;
else
cout<<"Not"<<endl;
break;
case 5:
cout<<"表长为:"<<ListLength(L)<<endl ;
break;
case 6:
int n1;
cout<<"输入位置"<<endl;
cin>>n1;
cout<<"位置"<<n1<<"的元素为:"<<getElement(L,n1) ;
break;
case 7:
int n2;
cout<<"输入元素"<<endl;
cin>>n2;
cout<<"结果为: "<<getElemP(L,n2)<<endl;
break;
case 8:
int n3;
cout<<"输入元素"<<endl;
cin>>n3;
if(findPrevious(L,n3)!=-1)
cout<<"位置为: "<<findPrevious(L,n3)<<endl;
break;
case 9:
int n4;
cout<<"输入元素"<<endl;
cin>>n4;
if(findNext(L,n4)!=-1)
cout<<"位置为: "<<findNext(L,n4)<<endl;
break;
case 10:
int n5;
int n6;
cout<<"输入位置和元素"<<endl;
cin>>n5;
cin>>n6;
insert(&L,n5,n6);
break;
case 11:
int n7;
cout<<"输入要删除的位置"<<endl;
cin>>n7;
deleteL(&L,n7);
break;
case 12 :
show(L);
break;
case 13:
unionL();
break;
default:
cout<<"over"<<endl;
break;
}
cout<<endl;
cout<<endl;
cout<<"completed"<<endl;
system("pause");
system("cls");
}while(i>=0);
return 0;
}