#include<stdio.h>
#include<malloc.h>
#include"stdlib.h"
#define list_init_size 100
#define listincrement 10
#define ok 1
#define error 0
#define overflow -1
typedef int elemtype;
typedef int status;
/*-----------定义线性顺序表存储结构-------------*/
typedef struct{
elemtype *elem;
int length;
int listsize;
}sqlist;
/*-----------顺序表部分操作的实现---------------*/
/*----------------初始化操作--------------------*/
status initlist_sq(sqlist *l){
l->elem=(elemtype *)malloc(list_init_size*sizeof(elemtype));
if(!l->elem)exit(overflow);
l->listsize=list_init_size;
l->length=0;
return ok;
}
/*----------------=-插入操作--------------------*/
status listinsert_sq(sqlist *l,int i,elemtype e){
elemtype *p,*q,*newbase;
if(i<1||i>l->length+1)return error;
if(l->length>=l->listsize){
newbase=(elemtype *)realloc(l->elem,(l->listsize+listincrement)*sizeof(elemtype));
if(!newbase)exit(overflow);
l->elem=newbase;
l->listsize+=listincrement;
}
p=&l->elem[i-1];
for(q=&l->elem[l->length-1];q>=p;q--)
*(q+1)=*q;
*p=e;
++l->length;
return ok;
}
/*------------------删除操作--------------------*/
status listdelete_sq(sqlist *l,int i,elemtype *e){
elemtype *p,*q;
if(i<1||i>l->length)return error;
p=&l->elem[i-1];
*e=*p;
q=l->elem+l->length-1;
for(++p;p<=q;p++)
*(p-1)=*p;
--l->length;
return ok;
}
/*----------------mergelist操作------------------*/
void mergelist_sq(sqlist la,sqlist lb,sqlist *lc){
elemtype *pa,*pb,*pc,*pa_last,*pb_last;
if(initlist_sq(lc)){
pa=la.elem;
pb=lb.elem;
pa_last=la.elem+la.length-1;
pb_last=lb.elem+lb.length-1;
lc->length=la.length+lb.length;
lc->listsize=la.length+lb.length;
lc->elem=(elemtype *)malloc(lc->listsize*sizeof(elemtype));
if(!lc->elem)exit(overflow);
pc=lc->elem;
while(pa<=pa_last&&pb<=pb_last){
if(*pa<*pb)
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last)
*pc++=*pa++;
while(pb<=pb_last)
*pc++=*pb++;
}
else printf("error\n");
}
/*-----------------主函数-------------------*/
main()
{
/*------------构建顺序表la,并赋值-----------*/
sqlist la,lb,lc;
int i,e,n;
if(initlist_sq(&la)){
printf("sqlist la init is ok!\n");
printf("la.length=%d\n",la.length);
printf("la.listsize=%d",la.listsize);
}
else printf("error\n");
printf("请输入顺序表la元素个数\n");
scanf("%d",&n);
printf("请依次输入顺序表la中的元素:\n");
for(i=1;i<=n;i++){
scanf("%d",&e);
if(listinsert_sq(&la,i,e)!=ok)break;
}
printf("当前顺序表la中元素依次为:\n");
for(i=1;i<=la.length;i++)
printf("e[%d]=%d\n",i-1,la.elem[i-1]);
printf("la.length=%d\n",la.length);
printf("la.listsize=%d",la.listsize);
/*---------------listinsert---------------*/
printf("请输入您所需要插入的元素,及位置,并用逗号隔开:\n");
scanf("%d,%d",&e,&i);
if(listinsert_sq(&la,i,e)){
printf("插入元素后,顺序表改变为:\n");
for(i=1;i<=la.length;i++)
printf("e[%d]=%d\n",i-1,la.elem[i-1]);
printf("la.length=%d\n",la.length);
printf("la.listsize=%d",la.listsize);
}
else printf("插入失败;\n");
/*--------------listdelete----------------*/
printf("请输入您所需要删除的元素位置:\n");
scanf("%d",&i);
if(listdelete_sq(&la,i,&e)){
printf("被删除元素为:%d\n",e);
printf("删除元素后,顺序表改变为:\n");
for(i=1;i<=la.length;i++)
printf("e[%d]=%d\n",i-1,la.elem[i-1]);
printf("la.length=%d\n",la.length);
printf("la.listsize=%d\n",la.listsize);
}
else printf("删除失败\n");
/*------------构建顺序表lb,并赋值-----------*/
if(initlist_sq(&lb)){
printf("sqlist lb init is ok!\n");
printf("lb.length=%d\n",lb.length);
printf("lb.listsize=%d",lb.listsize);
}
printf("请输入顺序表lb元素个数\n");
scanf("%d",&n);
printf("请依次输入顺序表lb中的元素:\n");
for(i=1;i<=n;i++){
scanf("%d",&e);
if(!listinsert_sq(&lb,i,e))break;
}
printf("当前顺序表lb中元素依次为:\n");
for(i=1;i<=lb.length;i++)
printf("e[%d]=%d\n",i-1,lb.elem[i-1]);
printf("lb.length=%d\n",lb.length);
printf("lb.listsize=%d\n",lb.listsize);
/*----------------------合并顺序表-----------------------------*/
mergelist_sq(la,lb,&lc);
for(i=1;i<=lc.length;i++)
printf("e[%d]=%d\n",i-1,lc.elem[i-1]);
printf("lc.length=%d\n",lc.length);
printf("lc.listsize=%d\n",lc.listsize);
/*-------------------程序结束-----------------------*/
printf("程序演示结束。\n");
system("pause");
return 0;
}