1. 程式人生 > >1.順序表基本操作

1.順序表基本操作

空間 sql註入 表達 pan 專業 truct 優點 length 理解

(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;
}

優點:順序表由於是隨機存取,因此存儲密度大,輸出指定的元素值以及交換元素值都比鏈表效率高,在插入的時候註意表尾可以追加元素。

缺點:順序表邏輯上相鄰的元素物理上也相鄰,所以插入和刪除操作需要移動大量元素,效率不高。

1.順序表基本操作