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 }
View Code

 

以上是关于wust oj 1635 线性表的删除查找增添的主要内容,如果未能解决你的问题,请参考以下文章

数据结构实验:线性表的顺序表示和链式表示及插入、删除、查找运算

《线性表的插入和删除算法实现》以及《栈和队列的插入和删除算法实现》的c语言代码

用C语言实现线性表的顺序存储(创建,插入,删除和查找)

线性表的创建,删除插入等操作

用C语言编写链式存储结构下实现线性表的创建,插入,删除,按值查找

线性表的查找插入删除运算