题目描述
顺序表是我们数据结构中的基本储存形式,现在给定一个顺序表,有如下操作:
Insert X Y:在顺序表中X位置插入Y元素,遍历输出当前顺序表的所有元素。
Delete X:删除顺序表中的X元素,如果有多个X元素,只删除第一个X,遍历输出当前顺序的所有元素。
Locate X:输出顺序表中X元素的所在的位置,如果有多个X元素,只输出第一个X元素的位置。
GetElem X:输出顺序表中X位置上的元素。
输入描述
多组测试数据。
对于每组测试数据,首先输入的是两个整数n,m(0<m<n<100),分别表示顺序表初始有n个元素,m次操作。
接下来是n个整数,表示顺序表中的n个元素。
然后是m次操作命令,命令是Insert X Y,Delete X,Locate X,GetElem X中的一种,其中的X,Y均为整数。
输出描述
对于每组数据,输出有m行,对应m次操作:如果操作合法,则输出相应的结果。如果操作不合法,则输出"Wrong Input!"
输入样例
5 8 1 3 4 5 6 Insert 4 7 Insert 8 10 Delete 6 Delete 10 Locate 5 Locate 10 GetElem 3 GetElem 9
输出样例
1 3 4 7 5 6 Wrong Input! 1 3 4 7 5 Wrong Input! 5 Wrong Input! 4 Wrong Input!
Code:
#include <stdio.h>
typedef struct
{
int *date;
int length;
int listsize;
}seqlist;//建立数据结构
void InitList(seqlist *L, int n);//创建空线性表
void Insert(seqlist *L, int i, int date);//在线性表第i个位置插入元素date
void Delete(seqlist *L, int _date);//删除线性表已有元素_date
void Locate(seqlist *L, int _date);//输出线性表已有元素_date的位置
void GetElem(seqlist *L, int i);//输出线性表第i个位置上的元素
int main()
{
int n, m;
char s[100];
seqlist *L = (seqlist*)malloc(sizeof(seqlist));
while (scanf("%d %d", &n, &m) != EOF)
{
int v, date;
InitList(L, n);
L->length = n;
for (int i = 0; i < n; i++)
{
scanf("%d", &L->date[i]);
}
for (int t = 0; t < m; t++)//输入并判断相应操作
{
scanf("%s", &s);
if (s[0] == 'I')
{
scanf("%d %d", &v, &date);
Insert(L, v, date);
}
else if (s[0] == 'D')
{
scanf("%d", &date);
Delete(L, date);
}
else if (s[0] == 'L')
{
scanf("%d", &date);
Locate(L, date);
}
else if (s[0] == 'G')
{
scanf("%d", &v);
GetElem(L, v);
}
}
}
}
void InitList(seqlist *L, int n)
{
L->date = (int*)malloc(n * sizeof(int));//储存分配
if (!L->date)
{
return 0;
}
L->length = 0;
L->listsize = n;
return 1;
}
void Insert(seqlist *L, int i, int date)
{
int *q, *p;
if (i < 1||i > L->length + 1)//判断i是否存在
{
printf("Wrong Input!\n");
return 0;
}
q = &(L->date[i - 1]);
for (p = (&L->date[L->length-1]); p >= q; --p)
{
*(p + 1) = *p;
}
*q = date;
++L->length;
for(int x = 0; x < L->length; x++)
{
if(x == L->length - 1)
{
printf("%d\n", L->date[x]);
}
else
{
printf("%d ", L->date[x]);
}
}
return 1;
}
void Delete(seqlist *L, int _date)
{
int q, p;
int v;
for (v = 0; v < L->length; v++)
{
if (L->date[v] == _date)
{
q = v;
break;
}
}
if (v >= L->length)
{
printf("Wrong Input!\n");
return 0;
}
p = q;
for (; p + 1 < L->length; p++)
{
L->date[p] = L->date[p + 1];
}
--L->length;
for (int x = 0; x < L->length; x++)
{
if (x == L->length - 1)
{
printf("%d\n", L->date[x]);
}
else
{
printf("%d ", L->date[x]);
}
}
return 1;
}
void Locate(seqlist *L, int _date)
{
int i;
int q;
for (i = 0; i < L->length; i++)
{
if (L->date[i] == _date)
{
q = i;
break;
}
}
if (i >= L->length)
{
printf("Wrong Input!\n");
return 0;
}
printf("%d\n", q + 1);
}
void GetElem(seqlist *L, int i)
{
int *q;
if (i < 1||i > L->length + 1)
{
printf("Wrong Input!\n");
return 0;
}
q = &(L->date[i - 1]);
printf("%d\n", *q);
return 1;
}