线性表的顺序存储——顺序表

本文介绍了一个简单的顺序线性表实现,包括初始化、插入、删除等基本操作,并通过具体的样例展示了如何使用这些功能。

Description

实现一个顺序线性表的初始化、插入、删除、访问、清空等操作,调用这些操作,实现如下功能:

I a b,在顺序表的第a位置插入元素b;

D a,删除顺序表中位序为a的元数,并输出该元素值;

G a,输出顺序表中位序为a的元数值;

L a,输出顺序表中元素值为a的第一个位置;

C,清空顺序表中的所有元数;

顺序表的定义如下:

  typedef int ElemType; 
  typedef struct    {

           ElemType *elem;

           int length;

           int listsize;

   } Sqlist;

Input

第一行有两个整数n,m分别表示初始线性表的长度和操作的个数,下面有m行,每一行都是上面5个操作中的一个。

Output

输出操作要求的输出。

Sample Input

5 6
1 2 3 4 5
D 3
D 1
G 1
G 2
G 3
L 4
Sample Output

3
1
2
4
5
2
就是手写一个vector,我也不知道为什么我要去写这玩意,反正写了就存下来吧

#include<stdio.h>
#include<stdlib.h>
#define sta 100
#define add 10
#define OVERFLOW -2
#define INFEASIBLE -1
typedef struct {
    int *vec;
    int len;
    int siz;
}List;
void init(List &l)
{
    l.vec=(int *)malloc(sta*sizeof(int));
    if(!l.vec)
        exit(OVERFLOW);
    l.len=0;
    l.siz=sta;
}
void update(List &l,int val)
{
    int *newbase;
    if(l.len>=l.siz)
    {
        newbase=(int *)realloc(l.vec,(l.siz+add)*sizeof(int));
        if(!newbase)
            return ;
        l.vec=newbase;
        l.siz+=add;
    }
    l.vec[l.len]=val;
    ++l.len;
}
void insert(List &l,int pos,int val)
{
    if(pos<1||pos>l.len+1)
        return ;
    int *newbase;
    if(l.len>=l.siz)
    {
        newbase=(int *)realloc(l.vec,(l.siz+add)*sizeof(int));
        if(!newbase)
            return ;
        l.vec=newbase;
        l.siz+=add;
    }
    int *fin;
    fin=&(l.vec[pos-1]);
    for(int *i=&(l.vec[l.len-1]);i>=fin;i--)
        *(i+1)=*i;
    *fin=val;
    ++l.len;
}
int judge(int a,int b)
{
    if(a==b)
        return 1;
    return 0;
}
int del(List &l,int pos)
{
    if(pos<1||pos>l.len)
        return -1;
    int *s,*fin,ans;
    s=&(l.vec[pos-1]);
    ans=*s;
    fin=&(l.vec[l.len-1]);
    for(;s<fin;s++)
        *s=*(s+1);
    l.len--;
    return ans;
}
int query1(List &l,int val,int (*cmp)(int ,int ))
{
    int i=1;
    int *p;
    p=l.vec;
    while(i<l.len&&!(*cmp)(*p++,val))
        i++;
    if(i<=l.len)
        return i;
    return 0;
}
int query2(List &l,int pos)
{
    return l.vec[pos-1];
}
int main()
{
    int n,m;
    List l;
    init(l);
    scanf("%d%d",&n,&m);
        int x;
        for(int i=1;i<=n;i++)
            scanf("%d",&x),update(l,x);
        char s[5];
        int pos,val;
        int (*cmp)(int,int);
        cmp=&judge;
        while(m--)
        {
            scanf("%s",s);
            if(s[0]=='I')
            {
                scanf("%d%d",&pos,&val);
                insert(l,pos,val);
            }
            else if(s[0]=='D')
            {
                scanf("%d",&pos);
                printf("%d\n",del(l,pos));
            }
            else if(s[0]=='G')
            {
                scanf("%d",&pos);
                printf("%d\n",query2(l,pos));
            }
            else if(s[0]=='L')
            {
                scanf("%d",&pos);
                printf("%d\n",query1(l,pos,cmp));
            }
            else
                init(l);
        }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值