顺序表的基本操作 详细教学

题目:

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);
}
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值