wust oj 1635 线性表的删除查找增添
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wust oj 1635 线性表的删除查找增添相关的知识,希望对你有一定的参考价值。
输入数据只有一组,有很多行。每行的格式可能是下列一种:
insert a name
delete name
show
search name
其中:a 是一个整数(≥1),name是一个姓名(由长度不超过20的英文字母组成)。
insert a name表示在第a个名字前插入名字name,如果a>线性表的长度,则表示在尾部插入。
delete name表示删除姓名name的所有结点,线性表中允许同名情况出现。
show列出线性表中所有姓名,如果表为空,则输出“0”
search name用来在线性表中查找名字name,输出所在的位置序号。如果有多个,全部输出,序号之间用空格隔开。如果不存在则输出-1。
作为数据结构最简单最基础的知识——线性表,我没有正视它,从而导致这道题久久不能AC,后来经过排查,有以下经验教训:
(1)英文字母长度不超过20,但是char str[20]是不够用的,必须多一个;
(2)这里的ElemType可以用一个含char [21]的成员变量的结构体封装,得到
1 typedef struct elemtype 2 { 3 char str[21]; 4 } elem,*Elem; 5 6 struct sqlist 7 { 8 Elem base; 9 int length; 10 int size; 11 } l;
附所有代码:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cstdlib> 5 using namespace std; 6 7 #define MAXSIZE 21 8 #define INCRESIZE 10 9 #define OK 1 10 11 typedef struct elemtype 12 { 13 char str[21]; 14 } elem,*Elem; 15 16 struct sqlist 17 { 18 Elem base; 19 int length; 20 int size; 21 } l; 22 23 int cp(elem &a,elem b) 24 { 25 strcpy(a.str,b.str); 26 return OK; 27 } 28 29 int show() 30 { 31 int i; 32 //cout<<"当前长度:"<<l.length<<" "; 33 if(l.length==0) 34 { 35 printf("0\\n"); 36 return OK; 37 } 38 for(i=1; i<=l.length; i++) 39 { 40 printf("%s",l.base[i].str); 41 42 if(i==l.length) 43 { 44 printf("\\n"); 45 } 46 else 47 { 48 printf(" "); 49 } 50 } 51 return OK; 52 } 53 54 int insert(int index,elem e) 55 { 56 int i; 57 if(l.length>=l.size) 58 { 59 l.base=(Elem)realloc(l.base,(l.size+INCRESIZE)*sizeof(elem)); 60 l.size+=INCRESIZE; 61 } 62 for(i=l.length+1; i>index; i--) 63 { 64 cp(l.base[i],l.base[i-1]); 65 } 66 cp(l.base[index],e); 67 l.length++; 68 return OK; 69 } 70 71 int idelete(int index) 72 { 73 int i; 74 for(i=index; i<=l.length-1; i++) 75 { 76 cp(l.base[i],l.base[i+1]); 77 } 78 l.length--; 79 return OK; 80 } 81 82 int main() 83 { 84 l.base=(Elem)malloc(MAXSIZE*sizeof(elem)); 85 l.size=MAXSIZE; 86 l.length=0;//线性表是从1开始的 87 88 elem e; 89 char name[21]; 90 char command[21]; 91 int index; 92 int i; 93 while(scanf("%s",&command)!=EOF) 94 { 95 if(!strcmp(command,"insert"))//相等返回0 96 { 97 cin>>index>>e.str; 98 if(index>l.length) 99 { 100 insert(l.length+1,e); 101 } 102 else 103 { 104 insert(index,e); 105 } 106 } 107 else if(!strcmp(command,"show")) 108 { 109 show(); 110 } 111 else if(!strcmp(command,"delete")) 112 { 113 cin>>name; 114 int i; 115 do 116 { 117 for(i=1; i<=l.length; i++) 118 { 119 if(!strcmp(l.base[i].str,name)) 120 { 121 idelete(i); 122 break; 123 } 124 } 125 } 126 while(i<l.length); 127 } 128 else if(!strcmp(command,"search")) 129 { 130 cin>>name; 131 int flag=1; 132 for(i=1; i<=l.length; i++) 133 { 134 if(!strcmp(l.base[i].str,name))//先找一个 135 { 136 cout<<i; 137 flag=0; 138 break; 139 } 140 } 141 if(flag)//如果没有 142 { 143 cout<<"-1"<<endl; 144 } 145 else//继续往下找 146 { 147 i++; 148 for(; i<=l.length; i++) 149 { 150 if(!strcmp(l.base[i].str,name)) 151 { 152 cout<<" "<<i; 153 } 154 } 155 cout<<endl; 156 } 157 } 158 else 159 { 160 break; 161 } 162 }//end of while 163 return 0; 164 }
以上是关于wust oj 1635 线性表的删除查找增添的主要内容,如果未能解决你的问题,请参考以下文章
数据结构实验:线性表的顺序表示和链式表示及插入、删除、查找运算
《线性表的插入和删除算法实现》以及《栈和队列的插入和删除算法实现》的c语言代码