题目:
1、编写函数,创建一个顺序表(数据自拟);
2、编写函数,在顺序表的指定位置插入一个元素;
3、编写函数,在顺序表的指定位置删除一个元素;
4、编写函数,将两个有序顺序表合并成一个新的有序顺序表;
解答:
#include<stdio.h>
#define MAXSIZE 100 //顺序表的最大空间
#define OK 1
#define ERROR 0 //定义返回量
typedef int Status;
typedef int ElemType;
typedef struct{
ElemType elem[MAXSIZE];
int length;
}SqList; //顺序表的结构类型为SqList
Status InitList_Sq(SqList *L){
L->length=0;
return OK;
}//创建一个空表
Status GetElem(SqList L,int i,ElemType *e)
{
if (i<1 || i>L.length ) return ERROR;
*e=L.elem[i-1];
return OK;
}//顺序表的取值操作
Status ListInsert(SqList *L,int i,ElemType e)//顺序表的插入,在L的第i个位置插入e
{
if(i<1||i>L->length+1) return ERROR;
if(L->length==MAXSIZE) return ERROR;
else
{
for(int j=L->length-1;j>=i+1;j--)
L->elem[j+1]=L->elem[j];
L->elem[i-1]=e;
return OK;
}
}
Status shanchu(SqList *L,ElemType a,ElemType b)
//删除a到b范围内的元素
{
if(b>L->length)return ERROR;
else
{
for(int i=b+1;i<=L->length;i++)
{
L->elem[a+i-b-1]=L->elem[i];//把b后面的元素依次放到a的后面
}
L->length=L->length-(b-a+1);//表长不要忘了改变
}
}
Status daozhi(SqList *L)
//使顺序列表倒置
{
int i,k;
for(i=1;i<=L->length/2;i++)//将表的首尾元素依次交换,直至到最中间的元素
{
k=L->elem[L->length-i+1];
L->elem[L->length-i+1]=L->elem[i];
L->elem[i]=k;
}
}
Status Listdelete(SqList *L,int i)
//删除第i个元素
{
for(int j=i;j<=L->length-1;j++)
L->elem[j-1]=L->elem[j];
L->length--;
return OK;
}
Status MergeList_Sq(SqList La,SqList Lb,SqList *Lc )
//把La和Lb合并到Lc
{
Lc->length=La.length+Lb.length;
if(Lc->length==MAXSIZE) return ERROR;
int i=1,j=1,k=1;
while(i<=La.length&&j<=Lb.length)//比较La和Lb的元素,比较出大小后将小的元素放入Lc,并将它表的坐标往前移一位(i,j)如果有一个表中的元素用完,那么另一个表剩下的元素全部放入Lc
{
if(La.elem[i]<=Lb.elem[j])
{
Lc->elem[k]=La.elem[i];
k++;
i++;
}
else
{
Lc->elem[k]=Lb.elem[j];
k++;
j++;
}
}
int m;
if(i==La.length+1)
{
for(m=j;m<=Lb.length;m++)
{Lc->elem[k]=Lb.elem[m];
k++;}
}
if(j==Lb.length+1)
{
for(m=i;m<=Lb.length;m++)
{
Lc->elem[k]=La.elem[m];
k++;}
}
}
void Intersection(SqList A,SqList B,SqList &C)
{
printf("求线性表的交集\n");
int i,j,k=0;
for(i=0;i<A.length;i++)
{
j=0;
while(j<B.length && B.elem[j]!=A.elem[i])
j++;
if(j<B.length)
{
C.elem[k++]=A.elem[i];
}
}
C.length=k;
}
Status listinsert(SqList *L,ElemType e)
//有序列表的插入,使之保持有序性
{
int i;
if(L->length==MAXSIZE) return ERROR;
else
{
for(i=L->length;i>=1;i--)
{
if(L->elem[i]<e&&e<L->elem[i+1])
{
for(int j=L->length+1;j>=i+1;j--)
{
L->elem[j]=L->elem[j-1];
}
L->elem[i+1]=e;
L->length++;
return OK;
}
}
}
}
void GetElem(SqList l,int i,int &e)
{
e=l.elem[i];
}
void ListPrint_Sq(SqList L)
{int i;
for( i=1;i<=L.length;i++) printf("%d ",L.elem[i]);
printf("\n");
}
Status CreateList_Sq(SqList *pL,int n)
{
int i,x;
for(i=1;i<=n;i++)
{ scanf("%d",&x);
pL->elem[i]=x; }
pL->length=n;
}
int main()
{
SqList la,lb,lc;
int na,nb;
printf("请输入表一表二元素的个数:");
scanf("%d %d",&na,&nb);
InitList_Sq(&la);InitList_Sq(&lb);InitList_Sq(&lc);
CreateList_Sq(&la,na);
ListPrint_Sq(la);
CreateList_Sq(&lb,nb);
ListPrint_Sq(lb);
MergeList_Sq(la,lb,&lc);
ListPrint_Sq(lc);
/*printf("请输入要插入的元素:");
scanf("%d",&m);
listinsert(&lc,m);
ListPrint_Sq(lc);
printf("请输入要删除的范围:");
scanf("%d %d",&m,&n);
shanchu(&lc,m,n);
ListPrint_Sq(lc);*/
daozhi(&lc);
ListPrint_Sq(lc);
}