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