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 }

时间: 2024-10-10 18:22:13

wust oj 1635 线性表的删除查找增添的相关文章

线性表算法-删除

线性表算法-删除

数据结构线性表插入删除的示例

昨天留的作业,数据结构书和c语言书真的不一样,需要自己加加补补,今天写的时候迷迷瞪瞪的,反正在我电脑上能用. 数据结构线性表插入删除的示例: 代码: #include<iostream> #include<cstdio> using namespace std; #define list_init_size 100 #define listincrement 10 typedef struct { int *elem; int length; int listsize; }sqli

基于线性表的哨兵查找和折半查找

#include<stdio.h>typedef int KeyType;#define LIST_SIZE 20typedef struct RecordType{ KeyType key; //OtherType other_data;}RecordType; typedef struct RecordList{ RecordType r[LIST_SIZE+1]; int length;}RecordList; void Init(RecordList *l,KeyType k){ l-

[Data Structure &amp; Algorithm] 线性表的查找

平均查找长度 ASL 影响查找算法好坏的主要标准 - 时间复杂度,通常用 - 平均查找长度 定义 - 为确定记录在查找表中的位置,需要和给定值进行比较的关键字的个数的期望 公式 - ASL = (查找成功时 + 查找失败时)的平均查找长度的期望 基本概念 Ps - 查找成功时的概率 Pf - 查找失败时的概率 Pi - 需要比较I次才能确定位置的记录出现的概率 n - 查找表的长度 好的算法 可以改变 - Pi 对于越小的i对应的Pi越大越好 不可以改变 - Ps和Pf 线性表上的查找 顺序表

线性表删除元素

在线性表中删除指定元素: 1 class deleelem_in_linelist(): 2 def __init__(self,list,maxsize): 3 self.data = list 4 self.length = len(list) 5 self.maxsize = maxsize 6 def dele_elem_in_list(self,e): 7 for i in self.data: 8 if i == e: 9 self.data.remove(i) 10 print("

线性表的插入和删除

hello,大家好,又见面了,这次我们来讲讲线性表 线性表其实跟数组差不多,但多了一个指针的传递 我们先来看看线性表的定义: typedef struct { int *elem; int length; //这里我们定义了线性表的长度,也就是元素的个数了// int listsize;   //这个就是我们线性表的存储容量了// }Sqlist; 这样就定义完了,是不是很OK,接下来我们看看怎么创建线性表 1.创建函数 int Initlist_Sq(Sqlist *L){ L->elem=(

数据结构与算法之线性表

前言 上一篇<数据结构和算法之时间复杂度和空间复杂度>中介绍了时间复杂度的概念和常见的时间复杂度,并分别举例子进行了一一说明.这一篇主要介绍线性表. 线性表属于数据结构中逻辑结构中的线性结构.回忆一下,数据结构分为物理结构和逻辑结构,逻辑结构分为线性结构.几何结构.树形结构和图形结构四大结构.其中,线性表就属于线性结构.剩余的三大逻辑结构今后会一一介绍. 线性表 基本概念 线性表(List):由零个或多个数据元素组成的有限序列. 注意: 1.线性表是一个序列. 2.0个元素构成的线性表是空表.

线性表—顺序表

引言(重点): 1.线性表的概述 2.线性表的抽象数据类型描述 3.线性表的实现方式 4.线性表的具体实现 5.每种具体实现的分析 1.什么是线性表?线性表(Linear List):由同类型元素构成有序序列的线性结构. 特征:1.表中元素个数称为线性表的长度2.线性表没有元素时,称为空表3.表起始位置称表头,表结束位置称为表尾4.在一个元素的前面的元素叫前驱元素,在一个元素后面的元素叫后继元素. 2.线性表的抽象数据类型描述 List MakeEmpty():初始化一个空线性表L;Elemen

基于线性表的功能函数大全

顺序表 一:线性表的存储结构 顺序表的顺序存储是指一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表中在逻辑结构中相邻的元素存储在连续的物理存储单元中.采用顺序存储结构存储的线性表通常简称顺序表,可将顺序表归纳为:关系线性化,结点顺序存. 用C语言定义线性表的顺序存储表示 #define MAXSIZE 100 Typedef struct { ElemType elem[MAXSIZE]; int last; } 二:线性表顺序存储结构上的基本运算 (1)查找操作 查找可采用顺序查找