1000

Description

实现一个线性表,对一个n不超过1000的线性表进行删除操作。

Input

第一行有一个整数n,表示线性表的大小,第二行有n个整数,分别是list1,list2...listn。第三行有一个整数q,表示q次删除操作,接下来q行,每行有一个整数k,表示删除线性表中第k个元素。(输入有多组测试数据,以EOF结束)

Output

对于每次删除操作输出一行,如果k不合法(k大于n或者k为0),输出 -1, 否则输出删除的元素。

Sample Input

5 3 2 1 5 4 3 5 5 2

Sample Output

4 -1 2
#include<cstdio>//1000
#include<iostream>
#include<stdlib.h>
#define LIST_INIT_SIZE 1000
#define LISTINCREMENT 10
#define OVERFLOW -2
#define ERROR -1
#define OK 1
typedef int ElemType;//代表一个数据类型
typedef struct{//定义一个数据类型
    ElemType *elem;//定义一个指针变量,相当于int *p;
    int length;
    int listsize;
}Sqlist;
ElemType InitList_Sq(Sqlist &L)//初始化
{
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType));
    if(!L.elem) exit(OVERFLOW);
    L.length=0;//空表长度为0
    L.listsize=LIST_INIT_SIZE;//初始存储容量
    return OK;
}
ElemType ListInsert_Sq(Sqlist &L,int i,ElemType e)//插入元素
{
    if(i<1||i>L.length+1)return ERROR;
    ElemType *newbase;
    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;
    }
    ElemType *p,*q;
    q=&(L.elem[i-1]);//q为插入位置
    for(p=&L.elem[L.length-1];p>=q;p--)*(p+1)=*p;//插入位置及之后元素后移;
    *q=e;//插入e;
    ++L.length;
    return OK;
}
ElemType ListDelete_Sq(Sqlist &L,int i,ElemType &e)
{
    ElemType *p,*q;
    if(i<1||i>L.length)return e=-1;
    p=&L.elem[i-1];//p 为被删除元素位置
    e=*p;//被删除元素赋给e
    q=&L.elem[L.length-1];//表尾元素位置
    for(++p;p<=q;++p)*(p-1)=*p;
    --L.length;
    return OK;
}
int main()
{
    int n,k;
    scanf("%d",&n);
    Sqlist L;
    InitList_Sq(L);
    for(int i=1;i<=n;i++)
    {
        int s;
        scanf("%d",&s);
        ListInsert_Sq(L,i,s);
    }
    scanf("%d",&k);
    while(k--)
    {
        int c;
        scanf("%d",&c);
        ElemType e;
        ListDelete_Sq(L,c,e);//删除的元素赋给e
        printf("%d\n",e);
    }
    return 0;
}

 

posted @ 2020-05-07 19:10  楼阁的猫  阅读(301)  评论(0编辑  收藏  举报