摘要:其中,數(shù)據(jù)元素的個數(shù)為表的長度,當為零時成為空表,非空的線性表通常記為,,,,,,,一線性表的順序存儲及算法線性表的順序存儲指的是將線性表的數(shù)據(jù)元素按其邏輯次序依次存入一組地址連續(xù)的存儲單元里,用這種方法存儲的線性表稱為順序表。
線性表
線性表是最簡單和最常用的一種數(shù)據(jù)結(jié)構(gòu),它是有n個數(shù)據(jù)元素(節(jié)點)組成的有限序列。其中,數(shù)據(jù)元素的個數(shù)n為表的長度,當n為零時成為空表,非空的線性表通常記為:
(a1,a2,… ,ai-1,ai, ai+1,…,an)一. 線性表的順序存儲及算法
線性表的順序存儲指的是將線性表的數(shù)據(jù)元素按其邏輯次序依次存入一組地址連續(xù)的存儲單元里,用這種方法存儲的線性表稱為順序表。
1.順序表的結(jié)構(gòu)定義public class SeqList { /* 初始空間為10 */ private static final int LIST_SIZE = 10; /* 數(shù)組data用來存放元素 */ private int[] data; /* 當前表長,實際存儲元素的個數(shù) */ private int length; }2.插入運算
順序表的插入運算是指在線性表的第i-1個元素和第i個元素之間插入一個新元素。由于順序表邏輯上相鄰的元素在物理結(jié)構(gòu)上也相鄰,其物理存儲關(guān)系也要發(fā)生相應(yīng)的變化。除非i=n+1,否則必須將原順序表的第i個元素開始的所有元素分別向后移動1個位置。
/** * 在順序表list中第i個位置之前插入一個新元素node * @param list 順序表 * @param i 插入位置 * @param node 新元素 */ public void insertList(SeqList list, int i, int node) { if (i < 1 || i > list.length + 1) { System.out.println("position error"); return; } if (list.length >= LIST_SIZE) { System.out.println("overflow"); return; } for (int j = list.length - 1; j >= i - 1; j --) { /* 從最后一個元素開始逐一后移 */ list.data[j+1] = list.data[j]; } /* 插入新元素 */ list.data[i-1] = node; /* 表長加1 */ list.length ++; }3.刪除運算
順序表的刪除運算指的是將表中第i個元素刪除,與插入運算相反,插入是向后移動元素,刪除運算則是向前移動元素。
/** * 在順序表list中刪除第i個元素,并返回被刪除的元素 * @param list 順序表 * @param i 元素位置 * @return node */ public int deleteList(SeqList list, int i) { int node = 0; if (i < 0 || i > list.length) { System.out.println("position error"); return node; } node = list.data[i-1]; for (int j = i; j < list.length; j ++) { /* 元素前移 */ list.data[j-1] = list.data[j]; } list.length --; return node; }4.順序表逆置
先以表長的一半為循環(huán)控制次數(shù),將表中最后一個元素同順序順數(shù)第一個元素交換,將倒數(shù)第二個元素同順數(shù)第二個元素交換,以此類推,直至交換完為止。
/** * 順序表逆置 * @param list 原始順序表 * @return 逆置后的順序表 */ public SeqList converts(SeqList list) { int node; int length = list.length/2; for (int i = 0; i < length; i ++) { /* 對稱交換元素 */ int j = list.length - 1 - i; node = list.data[i]; list.data[i] = list.data[j]; list.data[j] = node; } return list; }二. 線性表的鏈式存儲及算法
鏈式存儲結(jié)構(gòu)存儲線性表數(shù)據(jù)元素的存儲空間可能是連續(xù)的,也可能是不連續(xù)的,因而鏈表的節(jié)點是不可以隨機存取的,鏈式存粗是最常見的存儲方式之一。
在使用鏈式存儲結(jié)構(gòu)表示每個數(shù)據(jù)元素時,除了存儲元素本身的信息外,還需要一個存儲指示后繼元素存儲位置的地址,利用這種存儲方式表示的線性表稱為鏈表。
5.單鏈表的結(jié)構(gòu)定義public class LinkList { /* 數(shù)據(jù)域 */ private char data; /* 后繼元素 */ private LinkList next; }6.頭插法建表算法
頭插法是從一個空表開始,重復(fù)讀入數(shù)據(jù),生成新節(jié)點,將讀入的數(shù)據(jù)存放到新節(jié)點的數(shù)據(jù)域中,然后將新節(jié)點插入到當前鏈表的表頭上,直到結(jié)束為止。
/** * 頭插法創(chuàng)建表 * @param chars 字符數(shù)組 * @return 單鏈表 */ public LinkList createListF(char[] chars) { LinkList node; LinkList head = null; for (char ch : chars) { /* 申請新節(jié)點 */ node = new LinkList(); node.data = ch; /* 指向后繼節(jié)點 */ node.next = head; head = node; } /* 返回頭節(jié)點 */ return head; }7.尾插法建表算法
頭插法建表中節(jié)點的次序和輸入時的順序相反,若需要和輸入次序一致,則可使用尾插法。
/** * 尾插法建表 * @param chars 字符數(shù)組 * @return 單鏈表 */ public LinkList createListR(char[] chars) { LinkList node; LinkList head = null; LinkList rear = null; for (char ch : chars) { node = new LinkList(); node.data = ch; if (head == null) { /* 新節(jié)點為頭節(jié)點 */ head = node; } else { /* 上一個節(jié)點指向新節(jié)點 */ rear.next = node; } /* 表尾指向新的節(jié)點 */ rear = node; } /* 返回頭節(jié)點 */ return head; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69617.html
摘要:常見數(shù)據(jù)結(jié)構(gòu)分析及實現(xiàn)說明本文中的代碼是參考編程思想某培訓(xùn)機構(gòu)。同時還要分析這些數(shù)據(jù)結(jié)構(gòu)在時間和空間上的開銷。這種專門研究應(yīng)用程序中的數(shù)據(jù)之間的邏輯關(guān)系,存儲方式及其操作的學(xué)問就是數(shù)據(jù)結(jié)構(gòu)。 常見數(shù)據(jù)結(jié)構(gòu)分析及實現(xiàn) 說明 本文中的代碼是參考《Java編程思想》、某培訓(xùn)機構(gòu)。 文中的代碼放Github了,有興趣的可以看看,點歌star鼓勵下我。 代碼在Sublime中敲的,坑爹的GBK...
摘要:亦即總結(jié)常見的的數(shù)據(jù)結(jié)構(gòu),以及在中相應(yīng)的實現(xiàn)方法,務(wù)求理論與實踐一步總結(jié)到位。中,使用鏈表作為其基礎(chǔ)實現(xiàn)。其限制是僅允許在表的一端進行插入和刪除運算。 前言 仿佛一下子,2017年就快過去一半了,研一馬上就要成為過去式了,我打算抓住研一的尾巴,好好梳理一下數(shù)據(jù)結(jié)構(gòu)與算法,畢竟這些基礎(chǔ)知識是很重要的嘛。所以準備在這里搞一個系列的文章,以期透徹。 本系列將采用Java語言來進行描述。亦即總...
摘要:前文數(shù)據(jù)結(jié)構(gòu)與算法常用數(shù)據(jù)結(jié)構(gòu)及其實現(xiàn)總結(jié)了基本的數(shù)據(jù)結(jié)構(gòu),類似的,本文準備總結(jié)一下一些常見的高級的數(shù)據(jù)結(jié)構(gòu)及其常見算法和對應(yīng)的實現(xiàn)以及應(yīng)用場景,務(wù)求理論與實踐一步到位。 前文 數(shù)據(jù)結(jié)構(gòu)與算法——常用數(shù)據(jù)結(jié)構(gòu)及其Java實現(xiàn) 總結(jié)了基本的數(shù)據(jù)結(jié)構(gòu),類似的,本文準備總結(jié)一下一些常見的高級的數(shù)據(jù)結(jié)構(gòu)及其常見算法和對應(yīng)的Java實現(xiàn)以及應(yīng)用場景,務(wù)求理論與實踐一步到位。 跳躍表 跳躍列表是對...
摘要:前言通過前面數(shù)據(jù)結(jié)構(gòu)與算法前導(dǎo)我么知道了數(shù)據(jù)結(jié)構(gòu)的一些概念和重要性,那么我們今天總結(jié)下線性表相關(guān)的內(nèi)容。基本結(jié)構(gòu)對于線性表,我們只需要一個數(shù)組和就能表示基本信息。 前言 通過前面數(shù)據(jù)結(jié)構(gòu)與算法前導(dǎo)我么知道了數(shù)據(jù)結(jié)構(gòu)的一些概念和重要性,那么我們今天總結(jié)下線性表相關(guān)的內(nèi)容。當然,我用自己的理解解分享給大家。 其實說實話,可能很多人依然分不清線性表,順序表,和鏈表之間的區(qū)別和聯(lián)系! 線性...
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續(xù)后端好書閱讀與推薦續(xù)二后端好書閱讀與推薦續(xù)三后端好書閱讀與推薦續(xù)四這里依然記錄一下每本書的亮點與自己讀書心得和體會,分享并求拍磚。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續(xù))后端好書閱讀與推薦(續(xù)二)后端好書閱讀與推薦(續(xù)三)后端好書閱讀與推薦(續(xù)四) 這里依然記錄一下每本書的亮點與自己讀書心得...
閱讀 1750·2021-09-28 09:43
閱讀 1111·2021-09-23 11:22
閱讀 2707·2021-09-14 18:05
閱讀 1822·2019-08-30 15:52
閱讀 2811·2019-08-30 10:55
閱讀 2007·2019-08-29 16:58
閱讀 1322·2019-08-29 16:37
閱讀 3030·2019-08-29 16:25