#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
#define sizelist 100
#define listincrease 10
#define error -1
#define ok 0
typedef struct
{
int *data;
int length;
int listsize;
} sqlist;
int createlist(sqlist &L,char *ch)
{
L.data=(int*)malloc(sizelist*sizeof(int));
L.length=0;
L.listsize=sizelist;
int n,i;
cout<<"输入链表"<<ch<<"初始长度:";
cin>>n;
if(n<=0)
return error;
cout<<"输入链表"<<ch<<"初始元素:";
for(i=0; i<n; i++)
scanf("%d",&L.data[i]);
L.length+=n;
return 0;
}
int insertlist(sqlist &L,int i,int e)
{
int *p;
int j=L.length;
if(i<0||i>L.length)
{
cout<<"插入位置有误!!!\n";
return error;
}
if(L.length>=sizelist)
{
int *newbase=(int*)realloc(L.data,(L.listsize+listincrease)*sizeof(int));
if(!newbase)
{
cout<<"存储内存分配失败!!!\n";
return error;
}
L.listsize+=listincrease;
L.data=newbase;
}
for(p=L.data+L.length; p>=L.data; p--,j--)
{
if(i==j)
break;
*p=*(p-1);
}
L.data[i]=e;
L.length++;
return ok;
}
int deletelist(sqlist &L,int i)
{
int *p;
if(i<1||i>L.length)
{
cout<<"删除位置有误!!!\n";
return error;
}
for(p=L.data+i-1; p<=L.data+L.length; p++)
*p=*(p+1);
L.length--;
return ok;
}
int print(sqlist &L,char *ch)
{
int *p;
p=L.data;
if(!L.length)
{
cout<<"链表"<<ch<<"为空!!!"<<endl;
return error;
}
else
{
cout<<"输出链表"<<ch<<":"<<endl;
int i=0;
for(i=0; i<L.length; i++)
{
printf("%d ",*p);
p++;
}
cout<<"\n";
}
return 0;
}
void locate(sqlist &L,int e)
{
int *p=L.data;
int i=0;
int flag=0;
while(p<=L.data+L.length)
{
i++;
if(e==*p)
{
if(!flag)
cout<<"输出该元素位置:\n";
cout<<i<<" ";
flag=1;
}
p++;
}
if(!flag)
cout<<"未找到!";
cout<<"\n";
}
void mergelist(sqlist &L,sqlist &Lb,sqlist &Lc)
{
Lc.data=(int*)malloc(sizelist*sizeof(int));
Lc.length=0;
Lc.listsize=sizelist;
int *pa=L.data,*pb=Lb.data,*pc=Lc.data;
int *pa_last=pa+L.length-1,*pb_last=pb+Lb.length-1;
while(pa<=pa_last&&pb<=pb_last)
{
if(*pa<*pb)
*(pc++)=*(pa++);
else
*(pc++)=*(pb++);
Lc.length++;
}
while(pa<=pa_last)
{
*pc++=*pa++;
Lc.length++;
}
while(pb<=pb_last)
{
*pc++=*pb++;
Lc.length++;
}
print(Lc,"Lc");
}
int main()
{
sqlist l,l2,l3;
int choice=-1,e,i;
createlist(l,"La");
createlist(l2,"Lb");
printf("0-结束\n1-打印链表La和Lb\n2-对链表La插入\n3-对链表La删除\n4-对链表La定位\n5-合并链表La和Lb\n6-重建链表La\n7-重建链表Lb\n\n");
printf("选项:\n");
while(~scanf("%d",&choice))
{
system("CLS");
printf("0-结束\n1-打印链表La和Lb\n2-对链表La插入\n3-对链表La删除\n4-对链表La定位\n5-合并链表La和Lb\n6-重建链表La\n7-重建链表Lb\n\n");
if(choice==0)
break;
else if(choice==1)
{
print(l,"La");
print(l2,"Lb");
}
else if(choice==2)
{
cout<<"输入插入元素:"<<endl;
cin>>e;
cout<<"输入插入元素位置:"<<endl;
cin>>i;
insertlist(l,i,e);
}
else if(choice==3)
{
cout<<"输入删除元素位置:"<<endl;
cin>>i;
deletelist(l,i);
}
else if(choice==4)
{
cout<<"输入查找元素:\n";
cin>>e;
locate(l,e);
}
else if(choice==5)
mergelist(l,l2,l3);
else if(choice==6)
createlist(l,"La");
else if(choice==7)
createlist(l2,"Lb");
else
cout<<"请输入正确选项!\n";
printf("选项:\n");
}
}