题目链接:点我点我
题意:线性表的一些操作
题解:书上模板
1 //Big Bang 2 #include <string.h> 3 #include <malloc.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <math.h> 7 8 #define TRUE 1 9 #define FALSE 0 10 #define OK 1 11 #define ERROR 0 12 #define INFEASIBLE -1 13 #define LIST_INIT_SIZE 10 //线性表存储空间的初始分配量 14 #define LISTINCREMENT 2 //线性表存储空间的分配增量 15 16 typedef int Status; 17 typedef int Boolean; 18 19 typedef struct{ 20 char name[55]; 21 }ElemType; 22 23 typedef struct{ 24 ElemType *elem; //存储空间基址 25 int length; //当前长度 26 int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位) 27 }SqList; 28 29 Status InitList(SqList *L){ //算法2.3 构造一个空的顺序线性表 30 (*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 31 if(!(*L).elem) exit(OVERFLOW); //存储分配失败 32 (*L).length=0; //空表长度为0 33 (*L).listsize=LIST_INIT_SIZE; //初始存储容量 34 return OK; 35 } 36 37 Status ListInsert(SqList *L,int i,ElemType e){ //算法2.4 在L中第i个位置之前插入新的数据元素e,L的长度加1 38 //初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 39 ElemType *newbase,*q,*p; 40 if(i<1||i>(*L).length+1) return ERROR; //i的值不合法 41 if((*L).length>=(*L).listsize){ //当前存储空间已满,增加分配 42 newbase=(ElemType*)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType)); 43 if(!newbase) exit(OVERFLOW); //存储分配失败 44 (*L).elem=newbase; //新基址 45 (*L).listsize+=LISTINCREMENT; //增加存储容量 46 } 47 q=(*L).elem+i-1; 48 for(p=(*L).elem+(*L).length-1;p>=q;--p) *(p+1)=*p; //插入位置及之后的元素左移 49 *q=e; 50 ++(*L).length; //表长增1 51 return OK; 52 } 53 54 Status ListDelete(SqList *L,int i,ElemType *e){ //算法2.5 删除L的第i个数据元素,并用e返回其值,L的长度减1 55 //初始条件:顺序线性表L已存在,1≤i≤ListLength(L) 56 ElemType *p,*q; 57 if(i<1||i>(*L).length) return ERROR; //i值不合法 58 p=(*L).elem+i-1; //p为被删除元素的位置 59 *e=*p; //被删除元素的值赋给e 60 q=(*L).elem+(*L).length-1; //表尾元素的位置 61 for(++p;p<=q;++p) *(p-1)=*p; //被删除元素之后的元素左移 62 (*L).length--; //表长减一 63 return OK; 64 } 65 66 67 Status ListTraverse(SqList L,void(*vi)(ElemType*)){ //依次对L的每个数据元素调用函数vi().一旦vi()失败,则操作失败 68 //初始条件:顺序线性表L已存在 69 ElemType *p; 70 p=L.elem; 71 for(int i=1;i<=L.length;i++){ 72 if(i!=1) printf(" "); 73 vi(p++); 74 } 75 printf("\n"); 76 return OK; 77 } 78 79 int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)){ 80 //算法2.6 在顺序线性表中第1个值与e满足compare()的元素的位序 81 //若找到,则返回其在L中的位序,否则返回0 82 int i=1;//i的初值为第1个元素的位序 83 ElemType *p;//p的初值为第1个元素的存储为位置 84 p=L.elem; 85 while(i<=L.length&&!(*compare)(*p++,e)) ++i; 86 if(i<=L.length) return i; 87 else return 0; 88 } 89 90 void ListShow(SqList L){ 91 for(int i=0;i<L.length;i++){ 92 if(i) printf(" "); 93 printf("%s",L.elem[i].name); 94 } 95 printf("\n"); 96 } 97 98 Status cmp(ElemType e1,ElemType e2){ 99 return (Status)!strcmp(e1.name,e2.name); 100 } 101 102 int main(){ 103 SqList namelist; 104 InitList(&namelist); 105 char op[10]; 106 int pos; 107 ElemType e; 108 while(scanf("%s",op)!=EOF){ 109 if(!strcmp(op,"insert")){ 110 scanf("%d%s",&pos,e.name); 111 ListInsert(&namelist,pos,e); 112 } 113 else if(!strcmp(op,"delete")){ 114 scanf("%s",e.name); 115 pos=LocateElem(namelist,e,cmp); 116 ListDelete(&namelist,pos,&e); 117 } 118 else if(!strcmp(op,"show")){ 119 ListShow(namelist); 120 } 121 else if(!strcmp(op,"search")){ 122 scanf("%s",e.name); 123 printf("%d\n",LocateElem(namelist,e,cmp)); 124 } 125 } 126 return 0; 127 }
时间: 2024-10-11 23:19:31