1.顺序表基本操作

(ps上了大学,一开始不知道自己专业是学编程的,等到半路知道自己是学编程的时候,又不知道到底该怎么学,该学什么。一直处于一个很尴尬的境地。

大一的时候玩了玩pangolin,学了html和一点点java就想搞sql注入。想想当时挺好玩的,也算是步入了编程这条不归路吧。

到了大二开始学java,当时很懵逼为什么jdk要配置环境变量,环境变量又什么鬼,eclipse又是啥,myeclipse又TM是啥...

到了大三,学完了框架,ssh没怎么写,主要用ssm写了几个项目,感觉就是增删改查,顶多加个solr搞个搜索啥的,然后到了春招,开始后悔当初数据结构没好好学 ,就记得有一道后缀表达式的题都不知道怎么算,自己想想,是真的菜。

大四了,想想自己二本的学校,还想往上海跑,考研,也是迫不得已啊,毕竟这些大佬公司我连笔试都过不了)

数据结构主要是根据王道上面的题来写的,可能自己会加一些比较经典的习题,废话不多说,开始吧。

线性表

学线性表,线性表按存储类型划分,则有顺序存储和链式存储两种,顺序存储即顺序表,链式存储包括单链表、双链表、循环链表以及静态链表,因为408现在要求只能用c或c++语言进行答题,因此前三种使用c++是以指针方式实现,静态链表借助数组实现。

从顺序表开始,把它每个的基本操作都用c或c++语言实现出来,这样能够增加自己的记忆,也方便理解,在细节上也不会出错,例如数组下标的问题等等。

1.顺序表的定义

在定义顺序表时,需要注意线性表中元素的位序是从1开始的,而数组中的元素的下标是从0开始的。

#define Maxsize 50    //定义线性表的最大长度
typedef  struct{
    int data[Maxsize];//顺序表的元素
    int length;       //顺序表当前长度
}SqList;              //顺序表的类型定义

2.插入元素

在顺序表L的第i(L<=i<=L.length+1)个位置插入新元素e,时间复杂度为O(n)实现代码如下

/*
 *插入操作
 */
bool ListInsert(SqList &L,int i,int e){
    if(i<1||i>L.length+1)    //判断i的范围是否有效
        return false;
    if(L.length>=Maxsize)    //当前存储空间已满,不能插入
        return false;
    for(int j=L.length;j>=i;j--)    //将第i个元素及之后的元素后移
        L.data[j]=L.data[j-1];

    L.data[i-1]=e;                //在位置i处放入e
    L.length++;                  //线性表长度加1    return true;
}

3.删除第i个位置的元素,平均时间复杂度为O(n)

/*
 *删除操作
 */
bool ListDelete(SqList &L,int i, int &e){
    if(i>L.length+1||i<1)      //判断i的范围是否有效
        return false;
    e = L.data[i-1];           //将被删除的元素赋给e
    for (int j=i; j<L.length; j++)//将第i 个位置之后的元素前移
        L.data[j-1]=L.data[j];
    L.length--;                //线性表长度减1
    return true;
}

4.按值查找

按值查找的时间复杂度为 O(n)

/*
 *按值查找
 */
int LocateElem(SqList L,int  e){
    int i;
    for(i = 0; i < L.length; i++)
        if(L.data[i]==e){
            return i+1;     //下标为i的元素值等于e,返回位序i+1
        }
    return 0;
}

总的代码

//
//  main.cpp
//  ArrayList
//
//  Created by zhuzhengjun on 2017/9/5.
//  Copyright ? 2017年 zhuzhengjun. All rights reserved.
//

#include <iostream>
#include "stdio.h"
using namespace std;
#define Maxsize 50    //定义线性表的最大长度
typedef  struct{
    int data[Maxsize];//顺序表的元素
    int length;       //顺序表当前长度
}SqList;              //顺序表的类型定义

/*
 *插入操作
 */
bool ListInsert(SqList &L,int i,int e){
    if(i<1||i>L.length+1)    //判断i的范围是否有效
        return false;
    if(L.length>=Maxsize)    //当前存储空间已满,不能插入
        return false;
    cout <<"L.length";
    cout << L.length <<endl;
    cout << "L.data[L.length]";
    cout << L.data[L.length-2] <<endl;
    for(int j=L.length;j>=i;j--)    //将第i个元素及之后的元素后移
        L.data[j]=L.data[j-1];

    L.data[i-1]=e;                //在位置i处放入e
    L.length++;                  //线性表长度加1
    for (int i=0; i<L.length; i++) {
        cout << "Insert";
        cout <<L.data[i] <<endl;
    }
    return true;
}

/*
 *删除操作
 */
bool ListDelete(SqList &L,int i, int &e){
    if(i>L.length+1||i<1)      //判断i的范围是否有效
        return false;
    e = L.data[i-1];           //将被删除的元素赋给e
    for (int j=i; j<L.length; j++)//将第i 个位置之后的元素前移
        L.data[j-1]=L.data[j];
    L.length--;                //线性表长度减1
    for (int i=0; i<L.length-1; i++) {
        cout << "Delete" ;
        cout << L.data[i]<<endl;
    }
    return true;
}

/*
 *按值查找
 */
int LocateElem(SqList L,int  e){
    int i;
    for(i = 0; i < L.length; i++)
        if(L.data[i]==e){
            return i+1;
        }
    return 0;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    SqList slist;
    slist.length=49;
    for (int i=0; i<slist.length-1; i++) {
        slist.data[i]=i;
    }
//    for (int i=0; i<50; i++) {
//        cout << slist.data[i]<<endl;
////    }
    int e=24;
    bool s = ListInsert(slist,24,24);
    bool d = ListDelete(slist,24,e);
    cout << "顺序表插入情况";
    cout << s <<endl;
    cout << "顺序表删除情况";
    cout << d <<endl;
    cout << "23所在的位置";
    cout <<LocateElem(slist, 23)<<endl;

    printf("hello\n");
    cout << "Hello, World!\n"<<endl;
    return 0;
}

优点:顺序表由于是随机存取,因此存储密度大,输出指定的元素值以及交换元素值都比链表效率高,在插入的时候注意表尾可以追加元素。

缺点:顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素,效率不高。

时间: 2024-08-24 10:02:52

1.顺序表基本操作的相关文章

顺序表 基本操作

1 实验1 顺序表基本操作 2 3 实验目的 4 1. 熟悉C语言的上机环境,掌握C语言的基本结构. 5 2. 会定义线性表的顺序存储结构. 6 3. 熟悉对顺序表的一些基本操作和具体的函数定义. 7 注意事项 8 在做第一次“数据结构”课程实验之前,要在硬盘上建立好自己的工作目录,专门来存储你所做的实验程序及相关信息,以后每次做实验都采用这个目录. 9 实验内容 10 该程序的功能是对元素类型为整型的顺序表进行一些操作.该程序包括顺序表结构类型的定义以及对顺序表操作的具体的函数定义和主函数.

顺序表基本操作函数总结

/*************************************************************************************//*   顺序表基本操作函数/*------------------------------------------------------------------------------------------------------------------------------/*  /* Date: 2016年10月

[BS]线性表-顺序表基本操作

线性表分为顺序表和链表. 顺序表的基本操作如下: #include <stdio.h> #include <stdlib.h> /*---------------------------------------------*/ #define INIT_VOLUME_OF_LIST 100 #define INCRESE_VOLUME 10 /*---------------------------------------------*/ typedef char ElemType

1.1顺序表基本操作的设计与实现

实现顺序表的基本操作,包括顺序表的建立,查找,求长度,查找前驱,插入,删除,输出等函数 #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define List_INIT_SPACE 100 //存储空间初始分配量 #define List_INC_SPACE 10

数据结构(一)线性表——顺序表

一.顺序表基本操作的实现 通常把顺序存储结构实现的线性表称为顺序表. 1.状态类型Status的定义 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef char ElemType; 2.顺序表类型SqList的定义 #define ListSpaceIncr 20 typedef stru

【数据结构】顺序表和链表

一.顺序表 顺序表定义 :顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素.使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 顺序表可以分为静态顺序表和动态顺序表,静态较为简单,本文提供全部动态顺序表基本操作的代码. 顺序表的基本操作:

数据结构实验报告-实验一 顺序表、单链表基本操作的实现

实验一    顺序表.单链表基本操作的实现   l  实验目的 1.顺序表 (1)掌握线性表的基本运算. (2)掌握顺序存储的概念,学会对顺序存储数据结构进行操作. (3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能力. l  实验内容 1. 顺序表 1.编写线性表基本操作函数: (1)InitList(LIST *L,int ms)初始化线性表: (2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插入元素: (3)DeleteList1

C++ 顺序表的基本操作

顺序表的基本操作: "seqlist.h"头文件 #ifndef SEQLIST_H_INCLUDED #define SEQLIST_H_INCLUDED #include <iostream> #include <stdlib.h> using namespace std; template <class Type> class SeqList { public: SeqList(size_t sz = INIT_SIZE); bool IsFu

Java语言描述顺序表类,顺序表类的基本操作实现

数据结构(Java版)ch2 线性表的顺序存储(顺序表) 线性表的抽象数据Java接口描述如下: package ch2; /** * 线性表的抽象数据接口,用Java语言描述线性表的这些功能! * @author 房廷飞 * */ public interface IList { public void clear(); //将线型表置成空表 public boolean isEmpty(); //判断是不是空表 public int length(); //返回线性表的长度 public O