1. 程式人生 > >資料結構之旅(一)順序儲存結構來實現線性表

資料結構之旅(一)順序儲存結構來實現線性表

用陣列(順序儲存結構)來實現線性表

該資料結構具有如下功能:

初始化

獲取資料

在表尾新增資料

彈出表尾資料

設定指定位置資料

刪除指定位置資料

在指定位置插入資料

優點

1、無須為表示表中元素之間的邏輯關係而增加額外的儲存空間

2、可以快速地存取表中任一位置的元素

缺點

1、插入和刪除操作需要移動大量元素

2、當線性表長度變化較大時,難以確定儲存空間的容量

3、造成儲存空間的大量浪費。



list_array.h

#ifndef _LIST_ARRAY_H_  
#define _LIST_ARRAY_H_  


#include <iostream>
//magic number
const int maxsize = 100;
//data type
typedef int datatype;
//struct of list saveed by array
struct list_array{
    datatype data[maxsize];
    int length;
};

typedef int status;
const int OK = 0;
const int erro = 1;
const int list_arrayisfull = 2;
const int list_arrayisEmputy = 3;
//初始化
list_array* InitialList(list_array* list, datatype* data);
//獲取資料
status GetData(list_array const* list, int i, datatype* data);
//在表尾新增資料
status PushData(list_array* list, datatype* data);
//彈出表尾資料
status PopData(list_array* list, datatype* data);
//設定指定位置資料
status SetData(list_array* list, int i, datatype* data);
//刪除指定位置資料
status DeleteData(list_array * list, int i);
//在指定位置插入資料
status InsertData(list_array * list, int i, datatype* data);

#endif  
list_array.cpp
#include "list_array.h"
#include <iostream>


list_array* InitialList(list_array* list, datatype* data)
{
    //memcpy(data, (list->data) + i - 1, sizeof(datatype));
    memcpy(list->data, data, sizeof(datatype));
    list->length = 1;
    return list;
}

status GetData(list_array const* list, int i, datatype* data)
{
    if (list->length < i || i<1 || i>maxsize)
    {
        return erro;
    }
    memcpy(data, (list->data)+i-1, sizeof(datatype));
    return OK;
}


status SetData(list_array* list, int i, datatype* data)
{
    if (list->length < i || i<1 || i>maxsize)
    {
        return erro;
    }
    memcpy((list->data)+i-1 ,data , sizeof(datatype));
    return OK;
}

status PushData(list_array* list, datatype* data)
{
    if (list->length == maxsize)
        return list_arrayisfull;

    memcpy((list->data) + list->length, data, sizeof(datatype));
    ++(list->length);
    return OK;
}

status PopData(list_array* list, datatype* data)
{
    if ((list->length)==0)
        return list_arrayisEmputy;
    memcpy(data, (list->data) + (list->length) - 1, sizeof(datatype));
    memset((list->data) + (list->length) - 1, 0, sizeof(datatype));
    --(list->length);
    return OK;
}

status InsertData(list_array * list, int i, datatype* data)
{
    if (i > list->length || i<1 || i>maxsize)
    {
        return erro;
    }
    if ((list->length)==maxsize)
        return list_arrayisfull;
    //memcpy(data, list->data, sizeof(datatype));
    memmove((list->data) + i,
        (list->data) + i - 1,
        sizeof(datatype)*((list->length) - i + 1));

    memcpy((list->data) + i - 1, data, sizeof(datatype));
    (list->length)++;
    return OK;
}

status DeleteData(list_array * list, int i)
{
    if (list->length < i || i<1 || i>maxsize)
    {
        return erro;
    }

    memmove((list->data) + i - 1, 
            (list->data) + i, 
            sizeof(datatype)*((list->length)-i));
    memset((list->data) + (list->length) - 1, 0, sizeof(datatype));

    (list->length)--;
    return OK;
}
main.cpp
#include <iostream>
#include "list_array.h"
using namespace std;

int main()
{

    list_array list;
    list.length = 0;
    datatype da = 123;
    int erro = 0;
    InitialList(&list, &da);
    if (erro = PopData(&list, &da))
        cout << "erro number:" <<erro<<endl;
    PushData(&list, &da);
    PushData(&list, &da);
    PushData(&list, &da);
    PushData(&list, &da);
    da = 321;
    InsertData(&list, 3,&da);
    da = 100;
    SetData(&list, 2, &da);

    DeleteData(&list, 2);


    return 0;
}


相關推薦

資料結構順序儲存結構實現線性

用陣列(順序儲存結構)來實現線性表 該資料結構具有如下功能: 初始化 獲取資料 在表尾新增資料 彈出表尾資料 設定指定位置資料 刪除指定位置資料 在指定位置插入資料 優點 1、無須為表示表中元素之間的邏輯關係而增加額外的儲存空間 2、可以快速地存取表中任一位置的元素

python 資料結構線性 --- 順序儲存

python 的內建資料結構很強大,分裝的很好。為了描述基本的資料結構演算法,用python 來實現一遍。 線性表有多種,其中安裝儲存結構就用順序儲存和連結的,先實現順序結構的。 線性表 List 零個或多個數據元素的有限序列

走進資料結構排序---直接插入排序

一、直接插入排序演算法分析 直接插入排序是假定前i個構成的子序列是處於已排序的情況下進行排序的,然後將第i個元素與前i個構成的子序列逆序進行比較,如果是要升序排序,則比較第i個元素是否比j=i-1(i-1需要>=0)的元素大,如果是則第i個元素的位置(即j+1的位置上

css重構

rdquo lan set 變化 部分 網站 一個 寬度 lang css重構之旅 >前言: 今年我大一,馬上就要大二了。從高三畢業暑假到大學的這一年馬上過去,馬上迎來大二生活.學習前端也有將近一年了。一昧去追求那些視覺的效果和相對高端和新穎的技術,反而忽略了最基礎

小白的linux學習

探索linux一、進入系統*)普通用戶登陸student 普通用戶,密碼student*)超級用戶登陸 —〉not listed 點擊未列出 username 提示輸入用戶名稱 —〉root root 為系統超級用戶 passw

dotNet程序員的Java爬坑

是我 方法 轉java 自己的 java pri 也好 工作 計劃     仔細想了下還是轉java吧,因為後期不管是留在北京也好還是回老家也好,java的工作都會好找一點。現在的工作主要還是寫.net,目標是下一次離職的時候可以找到一份全職的java工作,我一直都覺得實踐

webpack入坑不是開始的開始

targe base 增加 -i pre 版本 uil 靜態頁 obi 最近學習框架,選擇了vue,然後接觸到了vue中的單文件組件,官方推薦使用 Webpack + vue-loader構建這些單文件 Vue 組件,於是就開始了webpack的入坑之旅。因為原來沒有用過

RabbitMQ學習

RabbitMQ學習總結(一) RabbitMQ簡介 RabbitMQ是一個訊息代理,其接收並轉發訊息。類似於現實生活中的郵局:你把信件投入郵箱的過程,相當於往佇列中新增資訊,因為所有郵箱中的信件最終都會彙集到郵局中;當郵遞員把你的新建傳送給收件人的時候,相當於訊息的轉發。 RabbitMQ中

Python學習

Python的簡介 Python是一種面向物件的、動態的指令碼語言,可用來設計網頁和開發後臺功能。其創始人Guido van Rossum於1989年聖誕節期間創造了這門語言。 (圖片來自百度) Python的種類 CPython Jython IronPython PyPy …… 與J

小程式wepy踩坑---- thirdScriptError sdk uncaught third Error module "npm/lodash/_nodeUtil.js

     近期一直在學小程式,作為新手,比較了下mpvue和wepy兩個小程式框架,mpvue作為美團剛出來的vuejs開發看起來很不錯,學習成本很低,但是對於在實際專案開發中,mpvue剛出來,很多資料,比如踩坑,比較少,而we

我的現代Javascript啟程、面向物件的現代Javascript

    Javascript曾經被認為是一門小玩具似的指令碼語言。大部分   的程式設計師都覺得它只是輔助工具,用來頁面端校驗——僅此   而已。隨著Javascript語言的演變,其功能越來越強大。直到  

記錄我的Python學習關於turtle庫的基本用法

關於庫函式的匯入方法:①import <> ②import <> as <> ③ from tutle import <>   1、turtle.setup(width,height,startx,starty)  /

dart

console sta 環境安裝 ria odi 等價 app func tar 前言 最近在看 dart 了,本著 “紙上得來終覺淺,絕知此事 markdown” 的原則,準備邊學邊寫,寫一個系列,這是第一篇。學習過程中主要是參考 A Tour of the Dart L

Java資料結構和演算法順序儲存的樹結構

Java資料結構和演算法(三)順序儲存的樹結構 二叉樹也可以用陣列儲存,可以和完全二叉樹的節點一一對應。 一、樹的遍歷 // 二叉樹儲存在陣列中 int[] data; public void preOrder() { preOrder(0); } // 前序遍歷指定的節點 public

Spring Boot 探索——Spring Boot 簡介

一、什麼是Spring Boot 隨著技術日新月異的發展,如今的軟體設計已不想曾經那般單一。業務複雜,功能繁瑣,大量三方元件的相互整合,成為了開發的一大難題。幸而,Spring Boot如同一道曙光,為我們java開發者帶來了福音,讓我們擺脫專案構架時各種配置的鬧心,得以專

學習Pytorch----

感覺很棒哦,大家可以動動手指到GitHub上點個Star偶~~ 言歸正傳,這是第一次記錄一個深度學習框架的部落格,加上作者自己的觀點和實踐,認真的分析和思考,之前都是寫在本子上@@ 1.Tensors張量 張量是用於GPU加速的類似於Numpy中ndarray的資料

Python基本資料型別字串

在學習一門程式語言的時候可能更多的是從hello world開始,像上篇介紹的print方法,使用一行程式碼輸出hello world,而這裡的變數就是我們今天要介紹的字串型別。 首先談到字串可能第一個想到的就是單引號括起來的東西,其實除了單引號還有雙引號以及三引號

C語言入門

特殊的迴圈語句 ,讓for迴圈開始的方法: 將sum初始化為0;或者先在迴圈體外讀第一個數 注意要先判斷再運算,避免最後一個數據發生錯誤 for(sum=0;n!=-1;) { sum+=n; scanf(“%d”, n); } 輸入x,y之間的閏年 i

大疆無人機Android版SDK開發踩坑----前言

  最近一段時間一直在做大疆無人機安卓版開發,這水也是挺深的,不仔細看官網SDK的介紹就會遇到各種各樣的坑,簡單記錄一下,希望可以讓其他人少走一些彎路。   安卓端用到的SDK大概有兩種:Android SDK和Android UX SDK   Android SDK(官網介紹):   開發人員可以通過SDK

Java架構師

夜光序言:   如果世界和你,都掉進了河裡,我一定先救你,然後忘記世界的呼吸~       正文: MVC框架的演變   我們安裝這個外掛解決沒有tomcat的問題,因為targ