數(shù)據(jù)結(jié)構(gòu)與算法———順序表

By FastHorse March 5, 2017

順序表定義

按順序方式存儲的線性表稱為順序表(arry - based list),又稱為向量(vector),通過創(chuàng)建數(shù)組來建立。順序表中的每個元素按其順序有唯一的索引值,又稱下標值社裆,可以用來方便地訪問元素內(nèi)容。

順序表的類定義

只要確定了基地址,線性表中的任意元素的地址都可以方便地計算出來涎拉,從而達到隨機存取的效果,因此元素間的物理相鄰關(guān)系表示了他們邏輯上的相鄰關(guān)系的圆。

c++程序?qū)崿F(xiàn):

class arrList{
    private:
        int *data;  //存儲數(shù)據(jù)表的實例
        int maxSize;    //順序表實例的最大長度
        int last;       //當前處理位置

    public:
        arrList(int sz=defaultSize);    //構(gòu)造函數(shù)
        ~arrList(){delete[] data;}      //析構(gòu)函數(shù)
        int Size()const     
          {return maxSize;}
        int Length()const               //返回此順序表的當前實際長度
          {return last+1;}
        void Search()const;             //查詢
        void Locate()const;             //定位
        bool getData(int i,int& x)const //把位置為i的元素值返回到變量x
          {if(i>1&&i<last+1){x=data[i-1];return true;}else return false;}
        bool setData(int i,int& x)      //用x修改位置i的元素值
          {if(i>1&&i<last+1){x=data[i-1];}}
        bool Insert();//插入
        bool SeqInsert();//順序插入
        bool Remove();//刪除
        bool SeqRemove();//區(qū)域刪除
        bool IsEmpty(){return last==-1?true:false;}  //判空
        bool IsFull(){return last==maxSize-1?true:false;}   //判滿
        void input();//寫入
        void output();//輸出
        void upDate();//更新
    };

順序表的運算實現(xiàn)

下面著重介紹基于數(shù)組的順序表插入鼓拧、刪除運算。

順序表的插入

(1)根據(jù)位置插入

根據(jù)位置插入是將指定元素插入到指定位置越妈。除了涉及被更新的那個元素之外季俩,其他的線性關(guān)系的相對順序應(yīng)保持不變。為此梅掠,需要對順序表實施一系列的元素移動操作來維護邏輯和存儲的線性關(guān)系酌住。
c++程序?qū)崿F(xiàn):

bool arrList::Insert(){                              //按位置插入
    if(last==maxSize-1)return false;
    int i,x;
    cout<<endl;
    cout<<"輸入插入的數(shù)字:";
    cin>>x;
    cout<<"輸入插入的位置:";
    cin>>i;
    if(i<0||i>maxSize-1)return false;
    else
    {
    for(int j=last;j>=i;j--)
    {data[j]=data[j-1];}
      data[i-1]=x;
      last++;
      cout<<"插入成功!"<<endl;
      return true;
    }
}

(2)根據(jù)大小插入

根據(jù)大小插入算法適用于數(shù)據(jù)元素遞增的順序表。從順序表的第一個元素開始尋找瓤檐,找到比自己大的元素就插在該元素前面赂韵。輸入一個數(shù)字x,從順序表的第一個元素開始循環(huán)挠蛉,判斷輸入的元素是否小于等于順序表中元素祭示,若成立,則將輸入元素插入表中,若不成立质涛,則繼續(xù)判斷順序表中下一個元素稠歉。
c++程序?qū)崿F(xiàn):

bool arrList::SeqInsert(){                              //按大小順序插入
    if(last==maxSize-1)return false;
    int x;
    cout<<endl;
    cout<<"輸入插入的數(shù)字:";
    cin>>x;

    for(int i=0;i<=last;i++){
      if (x <= data[i])
      {
        for(int j=last;j>=i+1;j-- )
        {data[j]=data[j-1];}
        data[i]=x;
        last++;
        break;
      }
      else if(x > data[last-1])
      {
        data[last]=x;
        last++;
        break;
      }
    }

      cout<<"插入成功!"<<endl;
      return true;
}

順序表的刪除

(1)根據(jù)位置刪除

刪除運算需要事先檢查順序表是否為空表,只在非空表是才能進行刪除汇陆。該算法要求輸入一個刪除的位置怒炸,判斷該位置是否有效。若有效毡代,通過左移運算將data[i-1]數(shù)組元素刪除阅羹,從而完成對指定位置元素刪除的功能。
c++程序?qū)崿F(xiàn):

bool arrList::Remove(){                              //刪除
    int i,x;
    if(last==-1)return false;
    cout<<"\n請輸入刪除的位置:";
    cin>>i;
    if(i<0||i>maxSize-1)return false;
        x=data[i-1];
    for(int j=i;j<=last;j++)
      data[j-1]=data[j];
    last--;
    cout<<"delete成功!刪除的數(shù)為:"<<x<<endl;
    return true;
}

(2)區(qū)域刪除

區(qū)域刪除算法適用于要在順序表中刪除多個相鄰元素教寂。首先輸入兩個刪除的位置捏鱼,同樣通過左移運算將該區(qū)域內(nèi)的所有元素刪除。
c++程序?qū)崿F(xiàn):

bool arrList::SeqRemove(){                              //區(qū)域刪除
    int i,k;
    if(last==-1)return false;
    cout<<"\n請輸入刪除的位置1:";
    cin>>i;
    cout<<"\n請輸入刪除的位置2:";
    cin>>k;
    int h=k-i;
    if(i<0||i>maxSize-1)return false;

    for(int j=k;j<=last;j++)
      data[j-h-1]=data[j];
    last = last-h-1;
    cout<<"delete成功!"<<endl;
    return true;
}

順序表的完整c++程序

#include <iostream.h>
#include<stdlib.h>
const int defaultSize=100;
class arrList{
    private:
        int *data;  //存儲數(shù)據(jù)表的實例
        int maxSize;    //順序表實例的最大長度
        int last;       //當前處理位置

    public:
        arrList(int sz=defaultSize);    //構(gòu)造函數(shù)
        ~arrList(){delete[] data;}      //析構(gòu)函數(shù)
        int Size()const     
          {return maxSize;}
        int Length()const               //返回此順序表的當前實際長度
          {return last+1;}
        void Search()const;             //查詢
        void Locate()const;             //定位
        bool getData(int i,int& x)const //把位置為i的元素值返回到變量x
          {if(i>1&&i<last+1){x=data[i-1];return true;}else return false;}
        bool setData(int i,int& x)      //用x修改位置i的元素值
          {if(i>1&&i<last+1){x=data[i-1];}}
        bool Insert();//插入
        bool SeqInsert();//順序插入
        bool Remove();//刪除
        bool SeqRemove();//區(qū)域刪除
        bool IsEmpty(){return last==-1?true:false;}  //判空
        bool IsFull(){return last==maxSize-1?true:false;}   //判滿
        void input();//寫入
        void output();//輸出
        void upDate();//更新
    };

arrList::arrList(int sz){                          //構(gòu)造函數(shù)
    if(sz>0)
    {
        maxSize=sz;last=-1;
        data=new int[maxSize];
        if(data==NULL)
        {
            cerr<<"error!!"<<endl;exit(1);
        }
    }
}


void arrList::input(){                              //輸入
    cout<<"開始建立順序表,輸入表中元素個數(shù):";
    while(1)
    {
        cin>>last;
        if(last<=maxSize-1)break;
        cout<<"輸入有誤酪耕,范圍不能超過"<<maxSize-1<<":";
    }
    for(int i=0;i<last;i++)
      {cout<<i+1<<"\t";cin>>data[i];}
}

void arrList::output(){                              //輸出
    cout<<endl;
    cout<<"最后位置為:"<<last<<endl;
    for(int i=0;i<last;i++)
      {cout<<"#"<<i+1<<":"<<data[i]<<endl;}
}

bool arrList::Insert(){                              //按位置插入
    if(last==maxSize-1)return false;
    int i,x;
    cout<<endl;
    cout<<"輸入插入的數(shù)字:";
    cin>>x;
    cout<<"輸入插入的位置:";
    cin>>i;
    if(i<0||i>maxSize-1)return false;
    else
    {
    for(int j=last;j>=i;j--)
    {data[j]=data[j-1];}
      data[i-1]=x;
      last++;
      cout<<"插入成功!"<<endl;
      return true;
    }
}


bool arrList::SeqInsert(){                              //按大小順序插入
    if(last==maxSize-1)return false;
    int x;
    cout<<endl;
    cout<<"輸入插入的數(shù)字:";
    cin>>x;

    for(int i=0;i<=last;i++){
      if (x <= data[i])
      {
        for(int j=last;j>=i+1;j-- )
        {data[j]=data[j-1];}
        data[i]=x;
        last++;
        break;
      }
      else if(x > data[last-1])
      {
        data[last]=x;
        last++;
        break;
      }
    }

      cout<<"插入成功!"<<endl;
      return true;
}

bool arrList::Remove(){                              //刪除
    int i,x;
    if(last==-1)return false;
    cout<<"\n請輸入刪除的位置:";
    cin>>i;
    if(i<0||i>maxSize-1)return false;
        x=data[i-1];
    for(int j=i;j<=last;j++)
      data[j-1]=data[j];
    last--;
    cout<<"delete成功!刪除的數(shù)為:"<<x<<endl;
    return true;
}


bool arrList::SeqRemove(){                              //區(qū)域刪除
    int i,k;
    if(last==-1)return false;
    cout<<"\n請輸入刪除的位置1:";
    cin>>i;
    cout<<"\n請輸入刪除的位置2:";
    cin>>k;
    int h=k-i;
    if(i<0||i>maxSize-1)return false;

    for(int j=k;j<=last;j++)
      data[j-h-1]=data[j];
    last = last-h-1;
    cout<<"delete成功!"<<endl;
    return true;
}

void arrList::Search()const{                      //查詢
    int x;
    cout<<"\n請輸入查詢的數(shù):";
    cin>>x;
    for(int i=0;i<=last;i++)
      if(data[i]==x)      
         cout<<"數(shù)字在位置:"<<i+1;
         
}

void arrList::Locate()const{                       //定位
    int i;
    cout<<"輸入位置:";
    cin>>i;
    if(i>=1||i<=last+1)
      cout<<"位置上的數(shù)為:"<<data[i-1];
}

void arrList::upDate(){                             //更新
    int i,x;
    cout<<"輸入位置:";
    cin>>i;
    if(i<1||i>last+1) return;
    cout<<"輸入更新的數(shù)據(jù):";
    cin>>x;
    data[i-1]=x;
    cout<<"\n更新成功"<<endl;
      
}
int main()
{
    int n;
    arrList s1(30);
    s1.input();
    while(1){
    cout<<"\n------------------------"<<endl;
    cout<<"1,插入"<<endl;
    cout<<"2,順序插入"<<endl;
    cout<<"3,刪除"<<endl;
    cout<<"4,順序刪除"<<endl;
    cout<<"5,查找"<<endl;
    cout<<"6,定位"<<endl;
    cout<<"7,輸出"<<endl;
    cout<<"8,更新"<<endl;
    cout<<"9,退出"<<endl;
    cout<<"-----------------------"<<endl;
    cout<<"輸入選項:";
    cin>>n;
    switch(n){
        case 1:
          s1.Insert();break;
        case 2:
          s1.SeqInsert();break;
        case 3:
          s1.Remove();break;
        case 4:
          s1.SeqRemove();break;
        case 5:
          s1.Search();break;
        case 6:
          s1.Locate();break;
        case 7:
          s1.output();break;
        case 8:
          s1.upDate();break;
        case 9:
          exit(1);  //執(zhí)行程序析構(gòu)
        default:
          cout<<"輸入有誤导梆,請重試"<<endl;
      }
    }   
  
    
    return 0;
}

參考文獻:

張銘,王騰蛟迂烁,趙海燕. 數(shù)據(jù)結(jié)構(gòu)與算法. 高等教育出版社看尼,2008.6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盟步,隨后出現(xiàn)的幾起案子藏斩,更是在濱河造成了極大的恐慌,老刑警劉巖址芯,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灾茁,死亡現(xiàn)場離奇詭異,居然都是意外死亡谷炸,警方通過查閱死者的電腦和手機北专,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旬陡,“玉大人拓颓,你說我怎么就攤上這事∶杳希” “怎么了驶睦?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匿醒。 經(jīng)常有香客問我场航,道長,這世上最難降的妖魔是什么廉羔? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任溉痢,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孩饼。我一直安慰自己髓削,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布镀娶。 她就那樣靜靜地躺著立膛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梯码。 梳的紋絲不亂的頭發(fā)上宝泵,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音忍些,去河邊找鬼鲁猩。 笑死,一個胖子當著我的面吹牛罢坝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搅窿,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼嘁酿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了男应?” 一聲冷哼從身側(cè)響起闹司,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沐飘,沒想到半個月后游桩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡耐朴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年借卧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筛峭。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡铐刘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出影晓,到底是詐尸還是另有隱情镰吵,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布挂签,位于F島的核電站疤祭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饵婆。R本人自食惡果不足惜勺馆,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谓传,春花似錦蜈项、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诗祸,卻和暖如春跑芳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背直颅。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工博个, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人功偿。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓盆佣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親械荷。 傳聞我的和親對象是個殘疾皇子共耍,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容