軟考之路--資料結構之線性表,軟考資料結構

來源:互聯網
上載者:User

軟考之路--資料結構之線性表,軟考資料結構

        資料就是數值,也就是我們通過觀察、實驗或計算得出的結果。資料有很多種,最簡單的就是數字。資料也可以是文字、映像、聲音等。資料可以用於科學研究、設計、查證等。結構,組成整體的各部分的搭配和安排,兩者完美結合在一起,我們這樣需要重新認識她,對她重新審視與定義:資料結構是程式設計的重要理論和技術基礎,她所討論的內容和技術,對從事軟體項目的開發有重要作用,通過學習資料結構,我們學會從問題出發,分析和研究電腦加工的資料的特性,以便為應用所設計的資料懸著適當的邏輯結構、儲存結構及其相應的操作方法,為提高應用電腦解決問題的效率服務。

        學習希賽視頻有一段日子了,這一段日子夾雜的自考和等級考,誇張點兒來說,有過歡笑,也有過淚水,歡笑的是昨天等級考試抽到的兩道大題都是原題,淚水的是,第二題有一個空少些了一個return,又想起那句話,總是要等到考試的時候,才知道該念的書沒有念,大題一共六十分,如果按往年的算分制度,需要佔百分之六十,也就是說六十分要考三十六分才算合格,可是我滿打滿算,最後一題只能拿到三十四分,可是後話是,過了我開心,過不了更開心,可以再學一遍C++`(*∩_∩*)′,今天小編主要來講解一下資料結構的資料表,首先,我們來看一下基本資料結構的一張圖:

        

       瞭解了基本資料結構,進入到我們今天的主題線性表,該博文主要圍繞以下內容展開進行闡述:

        

        一、線性表

        概念:線性表是最簡單,最基本,也是最常用的一種線性結構,她有兩種儲存儲存方法,順序儲存和鏈式儲存,主要的基本操作是插入,刪除和尋找等。

   分類:線性表分為順序表和鏈表,其中鏈表又分為單鏈表、迴圈鏈表和雙鏈表,依次進行分析。

    順序表,如所示:

    

    順序結構:順序結構是最簡單的程式結構,也是最常用的程式結構,只要按照解決問題的順序寫出相應的語句就行,它的執行順序是自上而下,依次執行。舉個簡單的例子,a = 3,b = 5,現交換a,b的值,這個問題就好像交換兩個杯子水,這當然要用到第三個杯子,假如第三個杯子是c,那麼正確的程式為: c = a; a = b; b = c; 執行結果是a = 5,b = c = 3。

    鏈表,如所示:

    

    鏈表:鏈表是一種實體儲存體單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鏈表中的指標連結次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態產生。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表順序結構,操作複雜。

   鏈表的類別:單鏈表、迴圈鏈表、雙鏈表。如所示:

   

    資料域:存放資料;指標域:存放指向下一個節點的地址;迴圈鏈表:最後一個節點她的下一個節點是前端節點。

雙鏈表:有兩個指標域,從兩個不同的方向把鏈錶鏈接起來。雙鏈表可以從兩個方向移動,單鏈表朝單一的方向移動,雙鏈表的靈活度優於單鏈表。雙鏈表的開支會大一些,因為她有兩個指標域。    單雙鏈表的刪除和插入:單鏈表的刪除:結點的刪除,刪除a2,方法:把a1的指標域直接指向a3,跳過a2,就可以了,a2就從鏈表中刪除了,還有一個工作需要把a2釋放掉。把要刪除的前序結點,前序結點的next域指向她的後序結點。單鏈表的插入:刪除結點是把前序指向後序,那麼插入一個結點就是一個逆向的過程,把新的結點,從需要插入的位置,把她的前序結點next域指向新加入的結點,再把新加入的結點的next域指向下一個結點,就可以了。雙鏈表的刪除和插入:牽涉兩個方面,從左至右列出來,從右至左列出來,並不是簡單的一條鏈過去,一條鏈過來就完成的,我們需要把四個步驟都寫出來,把兩個操作的第一步都先完成,完成之後,接著第二步。    順序表PK鏈表

    

    

    二、隊列

    概念:隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列中沒有元素時,稱為空白隊列。比如,去食堂排隊,排頭最先買到菜,後面來的同學排的隊尾;進車站時,安檢行李,先進去的最先出來,後進去的後出來。

    分類:順序隊列和循壞隊列;隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列中沒有元素時,稱為空白隊列。在隊列這種資料結構中,最先插入的元素將是最先被刪除的元素;反之最後插入的元素將是最後被刪除的元素,因此隊列又稱為“先進先出”(FIFO—first in first out)的線性表。如:

   順序隊列:

    

    迴圈隊列:

       

      ps:“對”字寫錯了,大家不要見笑哦。

      三、棧

      棧:並不是一個實實在在存在的東西,是邏輯上的一個概念,一種思想,一種理念,她不像鏈式儲存和順序儲存一個一個結點,很有規律,她是在順序儲存和鏈式儲存之上的,是邏輯的概念,棧既可以用鏈式結構來實現,也可以用順序結構來實現--即數組。定義一個規則,先進後出即可。如下:

   

   小編寄語:線性表(亦作順序表)是最基本、最簡單、也是最常用的一種資料結構。線性表中資料元素之間的關係是一對一的關係,即除了第一個和最後一個資料元素之外,其它資料元素都是首尾相接的。線性表的邏輯結構簡單,便於實現和操作。因此,線性表這種資料結構在實際應用中是廣泛採用的一種資料結構。其中棧和隊列是一種特殊的線性表,軟考之路,未完待續......

       


資料結構-線性表-怎在VC++60中實現

#include<iostream.h>
#include<stdlib.h>
#include<iostream.h>
typedef struct seqlist //定義線性表的順序儲存結構
{
int *elem; //儲存空間分配的首地址
int length ; //線性長度
}seqlist;
//此變數可作為線性表資料類型定義線性表
void init(seqlist &l) //線性表的初始化
{
l.elem=new int[20]; //分配儲存空間儲存線性表中的元素
l.length=0; //空線性表的長度為0
}

void delseqlist(seqlist &l) //銷毀建立的線性表
{
delete []l.elem;
l.length=0;
}

void insert(seqlist &l,int i, int x)//元素e插入線性表中的第i個位置上
{
if(i<1||i>l.length+1)
cout<<"i值不合法!"<<endl; //錯誤處理
for(int j=l.length;j>=i;j--)
l.elem[j+1]=l.elem[j]; //第i個元素及其後的元素依次後移
l.elem[i]=x; //插入新元素於第i個位置上
l.length++; //線性表的長度增1
}

void printout(seqlist &l) //輸出線性表當中的所有元素
{
int j;
for(j=1;j<=l.length;j++)
cout<<l.elem[j]<<" ";
}

int llength(seqlist &l) //求線性表的長度
{
return l.length;
}

int locateElem(seqlist &l, int e) //在順序表L中尋找第一個值於e相等的資料元素
{
int i=1;
int *p;
p=l.elem; p++; //p指向線性表中的第一個元素
while (i<=l.length && *p++!=e ) //依次向後進行比較
++i;
if(i<=l.length)
return i;
else
return 0; //返回結果
}

void Delete( seqlist &l,int i,int &e)//此函數刪除第i個元素,並將其值用e返回
{
int *p,*q;
if((i<1)||(i>l.length)) cout<&lt......餘下全文>>
 
資料結構線性表

include "stdlib.h"
#include "stdio.h"

//順序表基本操作實現

bool InitList_Sq(SqList &L){//初始化
L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L.elem) exit(1);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return 1;
}

bool ListInsert_Sq(SqList &L, int i, int e) { // 演算法2.4
// 在順序線性表L的第i個元素之前插入新的元素e,
// i的合法值為1≤i≤ListLength_Sq(L)+1
int *p;
if (i < 1 || i > L.length+1) return false; // i值不合法
if (L.length >= L.listsize) { // 當前儲存空間已滿,增加容量
int *newbase = (int *)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof (int));
if (!newbase) return false; // 儲存分配失敗
L.elem = newbase; // 新基址
L.listsize += LISTINCREMENT; // 增加儲存容量
}
int *q = &(L.elem[i-1]); // q為插入位置
for (p = &(L.elem[L.length-1]); p>=q; --p) *(p+1) = *p;
// 插入位置及之後的元素右移
*q = e; // 插入e
++L.length; // 表長增1
return true;
} // ListInsert_Sq

void printList_Sq(SqList L){//注意:1.參數是L,而非&L;2.該函數為擴充的操作。
if(L.length>0){
int i=1;
printf("元素的順序是:");
for(i=1;i<L.length+1;i++){
printf("%d",L.elem[i-1]);
}
printf("\n");
}
}...餘下全文>>
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.