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