http://hncu.acmclub.com/index.php?app=problem_title&id=111&problem_id=1325
输入数据只有一组,有很多行。每行的格式可能是下列一种:
insert a name
delete name
show
search name
其中 a 是一个整数,代表在第a个名字前插入名字。name是一个姓名,只包含英文字母的大小写,每个名字不超过30个字符。
输入保证不会插入列表中已经存在的姓名,不会删除列表中不存在的姓名,也不会搜索列表中不存在的姓名。
起始时,列表是空的。只输出show和search name 的结果。show将列表中的姓名全部输出,search只输出找到该名字的序号(从1开始)。每次输出占一行,姓名间用空格隔开。如果列表中没有名字了,show时也要输出一个空行。
insert 1 Stuart
insert 2 Bernadette
show
search Stuart
delete Stuart
show
insert 2 Stuart
show
insert 1 Amy
insert 2 Leslie
insert 3 Stephanie
show
delete Leslie
show
search Stuart
Stuart Bernadette
1
Bernadette
Bernadette Stuart
Amy Leslie Stephanie Bernadette Stuart
Amy Stephanie Bernadette Stuart
4
#include<string.h> #include<malloc.h> /* malloc()等 */ #include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<stdlib.h> /* atoi() */ #include<math.h> /* floor(),ceil(),abs() */ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量 */ #define LISTINCREMENT 2 /* 线性表存储空间的分配增量 */ typedef int Status; typedef int Boolean; typedef struct { char name[100]; } ElemType; typedef struct { ElemType *elem; /* 存储空间基址 */ int length; /* 当前长度 */ int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */ } SqList; Status InitList(SqList *L) /* 算法2.3 */ { /* 操作结果:构造一个空的顺序线性表 */ (*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; } Status ListInsert(SqList *L,int i,ElemType e) /* 算法2.4 */ { /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */ /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */ ElemType *newbase,*q,*p; if(i<1||i>(*L).length+1) /* i值不合法 */ return ERROR; 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; /* 增加存储容量 */ } q=(*L).elem+i-1; /* q为插入位置 */ for(p=(*L).elem+(*L).length-1;p>=q;--p) /* 插入位置及之后的元素右移 */ *(p+1)=*p; *q=e; /* 插入e */ ++(*L).length; /* 表长增1 */ return OK; } Status ListDelete(SqList *L,int i,ElemType *e) /* 算法2.5 */ { /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */ ElemType *p,*q; if(i<1||i>(*L).length) /* i值不合法 */ return ERROR; 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--; /* 表长减1 */ return OK; } int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)) { /* 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */ /* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 */ /* 若这样的数据元素不存在,则返回值为0。算法2.6 */ ElemType *p; int i=1; /* i的初值为第1个元素的位序 */ p=L.elem; /* p的初值为第1个元素的存储位置 */ while(i<=L.length&&!compare(*p++,e)) ++i; if(i<=L.length) return i; else return 0; } void ListShow(SqList L) { int i; for(i = 0; i<L.length; i++) { if(i) printf(" "); printf("%s",L.elem[i].name); } printf("\n"); } Status cmp(ElemType e1,ElemType e2) { return (Status)!strcmp(e1.name,e2.name); } int main() { SqList namelist; InitList(&namelist); char strInstruct[10]; int pos; ElemType e; while(~scanf("%s",strInstruct)) { if(!strcmp(strInstruct,"insert")) { scanf("%d%s",&pos,e.name); ListInsert(&namelist,pos,e); } else if(!strcmp(strInstruct,"show")) { ListShow(namelist); } else if(!strcmp(strInstruct,"delete")) { scanf("%s",e.name); pos = LocateElem(namelist,e,cmp); ListDelete(&namelist,pos,&e); } else if(!strcmp(strInstruct,"search")) { scanf("%s",e.name); printf("%d\n",LocateElem(namelist,e,cmp)); } } return 0; }