#include <stdio.h>
#include <string.h>

#define MAXSIZE 11			// 静态链表的长度
typedef char ElemType[8];	// 元素的类型,规定姓氏不超过7个字符

typedef struct{
	ElemType data;			// 节点中的数据
	int cur;				// 下一个节点的下标(相当于指针)
}NodeType;					// 节点类型

NodeType space[MAXSIZE];	// 用来存储节点的数组,相当于一般链表中的内存,
							// 只是那个内存是系统分配的,我们看不到

typedef struct{
	int elem;				// 静态链表存储空间基址(起始元素的下标)
	int length;				// 静态链表中的元素数目
	int listSize;			// 静态链表当前的长度,可容纳元素数目
}SLinkList;					// 静态链表类型的定义,和一般的链表类似

int LocateElem_SL(SLinkList& S, ElemType e) { // 算法2.13
	// 在静态单链线性表L中查找第1个值为e的元素。
	// 若找到,则返回它在L中的位序,否则返回0。
	int i;
	i = S.elem; // i指示表中第一个结点
	while (i && strcmp(space[i].data, e))
		i = space[i].cur; // 在表中顺链查找
	return i;
} // LocateElem_SL

void InitSpace_SL() { // 算法2.14
	// 将一维数组space中各分量链成一个备用链表,space[0].cur为头指针,
	// "0"表示空指针
	memset(space, 0 ,sizeof(space));
	for (int i = 0; i < MAXSIZE - 1; ++i)
		space[i].cur = i + 1;
	space[MAXSIZE - 1].cur = 0;
} // InitSpace_SL

int Malloc_SL() { // 算法2.15
	// 若备用空间链表非空,则返回分配的结点下标,否则返回0
	int i = space[0].cur;
	if (space[0].cur)
		space[0].cur = space[space[0].cur].cur;
	return i;
} // Malloc_SL

void Free_SL(int k) { // 算法2.16
	// 将下标为k的空闲结点回收到备用链表
	space[k].cur = space[0].cur;
	space[0].cur = k;
} // Free_SL

void Insert_SL(SLinkList& S, int i, ElemType e){
	// 往静态链表S中的第 i 个位置前插入e
	int cur = S.elem;		// 指向静态链表中的第一个节点
	int j=0;
	int newNodeIndex;		// 存储新分配的节点下标
	while(j < i-1){			// 寻找第 i-1 个节点
		cur = space[cur].cur;
		++j;
	}
	newNodeIndex = Malloc_SL();	// 分配新的节点
	strcpy(space[newNodeIndex].data,e);	// 在新的节点中存入数据
	space[newNodeIndex].cur = 0;		// 指针为空,这一点很重要
	space[newNodeIndex].cur = space[cur].cur;	// 插入静态链表中
	space[cur].cur = newNodeIndex;
	S.length++;			// 插入后静态链表长度加1
}

void Delete_SL(SLinkList& S, int i){
	// 删除静态链表中的第 i 个节点
	int cur = S.elem;		// 指向静态链表中的第一个节点
	int j=0;
	int delCur;				// 存储待删除节点的下标
	while(j < i-1){			// 寻找第 i-1 个节点
		cur = space[cur].cur;
		++j;
	}
	delCur = space[cur].cur;		// 找到待删除节点的下标
	space[cur].cur = space[delCur].cur;	// 删除节点
	Free_SL(delCur);			// 释放节点
	S.length--;			// 删除后静态链表长度减1
}

void CreateList_SL(SLinkList& S){	// 创建静态链表
	S.elem = Malloc_SL();			// 分配头结点的指针
	space[S.elem].cur = 0;
	S.length = 0;
	S.listSize = 9;
}

void Show_space(){
	// 将静态链表中所有的节点显示出来
	int i;
	for(i=0;i<MAXSIZE;i++){
		printf("%-8s%2d\n", space[i].data, space[i].cur);
	}
}

int main(){

	SLinkList S;		// 定义静态链表
	char str[10];		// 用来获得指令
	int a;				// 存储位置
	ElemType e;			// 存储元素
	InitSpace_SL();		// 初始化备用链表
	CreateList_SL(S);	// 创建静态链表
	while(scanf("%s", str) != EOF){
		if(strcmp(str, "insert") == 0){			// 插入元素
			scanf("%d%s", &a, e);
			Insert_SL(S, a, e);
		}else if(strcmp(str, "delete") == 0){	// 删除元素
			scanf("%d", &a);
			Delete_SL(S, a);
		}else if(strcmp(str, "search") == 0){	// 搜索元素
			scanf("%s", e);
			printf("%2d\n********************\n", LocateElem_SL(S, e));
		}else if(strcmp(str, "show") == 0){		// 显示静态链表状态
			Show_space();
			puts("********************");						// 注意空一行
		}
	}

	return 0;
}

/**************************************************************
	Problem: 2139
	User: admin
	Language: C++
	Result: Accepted
	Time:17 ms
	Memory:1148 kb
****************************************************************/