1. 程式人生 > >資料結構(總結版)

資料結構(總結版)

ISD1407

---->>C++ 6天

---->>Cocos2d-x ?天

---->>資料結構與演算法  ?天

---->>Lua 1天

day13-1 線性表的順序儲存

#include <stdio.h>

//宣告陣列

int array[3] = {1,2,3};

//檢視陣列中元素的地址

void show(int argc,int argv[]){

    for (int i=0; i<argc; i++) {

        printf("argv[%d]:%d address:%p\n",i,argv[i],&argv[i]);

    }

}

int main(int argc, const char * argv[])

{

    show(sizeof(array)/sizeof(array[0]),array);

    return 0;

}

列印:

argv[0]:1 address:0x100001058

argv[1]:2 address:0x10000105c

argv[2]:3 address:0x100001060

 day13-2 堆記憶體的分配不是連續的

#include <stdio.h>

#include <stdlib.h>

int main(int argc, const char * argv[])

{

    /*

     void *p = malloc(sizeof(int));

     int *p2 = (int*)p;型別轉換

     */

//在堆中開闢一塊記憶體空間

    int *p = (int*)malloc(sizeof(int));

    *p = 1;

printf("p value:%p\n",p);//指標指向堆區的地址

printf("p address:%p\n",&p);//指標變數在棧中的地址

//在堆中開闢5個元素的記憶體空間

    int *p1 = (int*)malloc(sizeof(int));

    int *p2 = (int

*)malloc(sizeof(int));

    int *p3 = (int*)malloc(sizeof(int));

    int *p4 = (int*)malloc(sizeof(int));

    int *p5 = (int*)malloc(sizeof(int));

//檢視5個元素的記憶體地址

printf("p1 value:%p\n",p1);//指標指向堆區的地址

printf("p2 value:%p\n",p2);//指標指向堆區的地址

printf("p3 value:%p\n",p3);//指標指向堆區的地址

printf("p4 value:%p\n",p4);//指標指向堆區的地址

printf("p5 value:%p\n",p5);//指標指向堆區的地址

    return 0;

}

列印:

p value:0x10011c0f0

p address:0x7fff5fbff688

p1 value:0x10011c100

p2 value:0x10011c110

p3 value:0x10011c120

p4 value:0x10011c130

p5 value:0x10011c140

 day13-3 連結串列實現方式

#include <stdio.h>

#include <stdlib.h>

//儲存多個學生資訊

typedefstruct _Student{

    //值域

    int id;

    char name[20];

//指標域描述下一個元素的地址

struct_Student *next;//如果結構體中的型別是當前型別,必須使用原名宣告

} Student;

//宣告頭結點

Student *head = NULL;

//建立一個節點

/*

 函式名稱:my_malloc

 函式引數:void

 函式返回值型別:Student * <==>struct _Student *

函式的功能:建立一個節點

 */

Student *my_malloc();

Student *my_malloc(){

//建立一個Student的型別指標

    Student *pnew = NULL;

//向堆中申請記憶體

    pnew = (Student*)malloc(sizeof(Student));

    if (pnew==NULL) {

printf("分配記憶體不成功!\n");

        return pnew;

    }

printf("分配記憶體成功,請輸入節點資訊\n");

printf("請輸入學員的id資訊:\n");

scanf("%d",&pnew->id);//通過結構體指標訪問成員使用->符號

printf("請輸入學員的姓名資訊:\n");

    scanf("%s",pnew->name);

//節點的值域建立好了

//單向連結串列的尾點指向的NULL

    pnew->next = NULL;

//節點建立成功

    return pnew;

}

//建立連結串列

/*

 函式名稱:create_list

 函式引數:Student *head頭指標

 返回值型別:Student *

函式的功能:建立連結串列

 */

Student *create_list(Student *head){

//指定節點的個數

    int n = 0;

//遊標儲存臨時操作的指標

    Student *pnew = NULL;

    if (head!=NULL) {

printf("連結串列已經存在,不需要建立!\n");

        //返回當前連結串列

        return head;

    }

printf("連結串列不存在,可以建立\n");

printf("請輸入節點的個數:\n");

    scanf("%d",&n);

    head = my_malloc();//第一節點就是連結串列的首地址

    if (head==NULL) {

printf("錶鏈表頭或節點頭建立不成功\n");

        return NULL;

    }

    pnew = head;

//迴圈建立節點不包括頭節點

    while (--n) {

//建立新的節點並與上一節點關聯在一起

        pnew->next = my_malloc();

        if (pnew->next==NULL) {

            printf("建立新節點失敗\n");

            return NULL;

        }

//如果新節點建立成功,則遊標移動到新節點

        pnew = pnew->next;

    }

printf("連結串列建立成功!\n");

    return head;

}

//遍歷連結串列

/*

 函式名稱:show_list()

 函式引數:Student *head頭指標

 函式返回值:NULL

函式功能:遍歷一個連結串列中所有節點

 */

void show_list(Student *head){

//建立一個遊標

    Student *temp = head;

    if (head==NULL) {

printf("連結串列不存在,無法遍歷!\n");

//return NULL;

    }

//通過遊標來遍歷連結串列

    while (temp) {

//遍歷連結串列就是輸出資料域

        printf("id:%d name:%s\n",temp->id,temp->name);

        temp = temp->next;//將遊標移動到下一節點

    }

printf("遍歷連結串列結束");

//return head;

}

int main(int argc, const char * argv[])

{

    while(1){

        //1.建立連結串列

        printf("1.建立連結串列\n");

        //2.遍歷連結串列

        printf("2.遍歷連結串列\n");

        //3.銷燬連結串列

        printf("3.銷燬連結串列\n");

        //使用者輸入資料

        int number = 0;

printf("請輸入您所要做的操作:\n");

        scanf("%d",&number);

        switch (number) {

            case 1:

                printf("建立連結串列...\n");

                head = create_list(head);

                break;

            case 2:

                printf("遍歷連結串列...\n");

                show_list(head);

                break;

            case 3:

                break;

        }

    }

    return 0;

}

列印::

1.建立連結串列

2.遍歷連結串列

3.銷燬連結串列

請輸入您所要做的操作:

資料結構的運算

資料結構與演算法(排序演算法冒泡)

1.資料結構:是指相互之間具有(存在)一定聯絡(關係)的資料元素的集合。元素之間的相互聯絡(關係)稱為邏輯結構。資料元素之間的邏輯結構有四基本型別:

集合:結構的資料元素除了”同屬於一個集合”外,沒有其它關係。

線性結構:結構中的資料元素之間存在一對一的關係。

樹型結構:結構中的資料元素之間存在一對多的關係。

圖狀結構或網狀結構:結構中的資料元素之間存在多對多關係。

2.資料結構的儲存方式

資料結構在計算機記憶體中的儲存包括資料元素的儲存和元素之間的關係的表示。

元素之間的關係 在計算機中有兩種不同的表現方法:順序表示和非順序表示。由此得出兩種不同的儲存結構:

         順序儲存結構和鏈式儲存結構

順序儲存結構:用資料元素在儲存器中的相對位置來表示資料之間的邏輯結構(關係)。

鏈式儲存結構:每個資料元素增加一個存放另一個元素地址的指標(pointer),用該指標來表示資料元素之間的邏輯結構(關係)。

3.邏輯結構與物理結構

4.資料結構的運算

資料結構的主要運算包括:

(1)建立(Create)一個數據結構

(2)消除(Destroy)一個數據結構

(3)從一個數據結構中刪除(Delete)一個元素

(4)把一個數據元素插入(Insert)到資料結構中

(5)對一個數據結構進行訪問(Access)

(6)對一個數據結構中的元素進行修改(Modify)

(7)對一個數據結構進行排序(Sort)(演算法)

(8)對一個數據結構進行查詢(Search)

5.線性表:線性結構是最常用、最簡單的一種資料結構。而線性表是一種典型的線性結構。其基本特點是線性表中的資料元素是有序且有限的。在這種結構中:

(1)存在一個唯一的被稱為”第一個”的資料元素

(2)存在一個唯一的被稱為“最後一個”的資料元素

(3)除第一個元素外,每個元素均有唯一一個直接前驅

(4)除最後一個元素外,每個元素均有唯一一個直接後續

6.線性表的順序儲存

順序儲存結構中,很容易實現線性表的一些操作:初始化、賦值、查詢、修改、插入、刪除、求長度等。

線性表的順序儲存就是陣列。

7.線性表的鏈式儲存

用一組任意的儲存單元儲存線性表中的資料元素。用這種方法簡稱線性表。儲存連結串列中的結點的一組任意的儲存單元以是連續的或不連續的,甚至是零散分步在記憶體中的任意位置。

為了正確表示結點間的邏輯關係,在儲存每個結點值的同時,還必須儲存指示其直接後繼節點的地址(或位置),稱為(pointer)或鏈(link),這兩部分級成了連結串列中的結點結構。

8.樹與二叉樹

樹型結構是一類非常重要的非線性結構。直觀地,樹型結構是以分支關係定義的層次結構。

樹在計算機領域中也有廣泛的應用,例如在編譯程式中,用樹來表示語法結構;在資料庫系統中,用樹來組織資訊;

樹(Tree)是n(n>=0)個結點的有限集合T。若n=0時,稱為空樹,否則:

有且只有一個特殊的稱為樹的根(Root)結點。

若n>1時,其餘的結點被分為m(m>0)個互不相交的子集T1,T2,T3...Tm,其中每個子集本身又是一棵樹,稱其為根的子樹(Subtree)

這是樹的遞迴定義,即用樹來定義樹,而只有一個結點的樹必定僅由根組成。

結點(node):一個數據元素及若干指向其子樹的分支。

結點的度(degree)、樹的度:結點所擁有的子樹的棵數稱為結點的度。

二叉樹(Binary tree)是n(n>=0)個結點的有限集合。若n=0時稱為空樹,否則:

有且只有一個特殊稱為根(root)結點的。

若n>1時,其餘的結點被分為二個互不相交的子集T1,T2,分別稱之為左、右子樹,並且左、右子樹又都是二叉樹。由此可知二叉樹的定義是迭歸的。

順序儲存結構

用一組地址連續的儲存單元依次“自上而下,自左至右”儲存完全二叉樹的資料元素。

對於完全二叉樹上編號為i的結點元素儲存一維陣列的下標值為i-1的分點中

對於一般的二叉樹,將其每個節點與完全二叉樹的結點相對照,儲存在一維陣列中。

遍歷二叉樹(Traversing Binary Tree)是指按指定的規律對二叉樹中的每個節點進行訪問一次且僅訪問一次。

所謂訪問是指對結點做某種處理。如:輸出資訊、修改結點的值等。

二叉樹是一種非線性結構,每個結點都可能有左、右子樹,因此需要尋找一種規律,使二叉樹的結點能排列在一個線性佇列上,從而便於遍歷。

二叉樹的基本組成:根結點、左子樹、右子樹。若能依次遍歷這三個部分,就是遍歷二叉數。

遍歷二叉樹

若以L、D、R分別表示遍歷左子樹、遍歷根結點和遍歷右子樹,則有六種方案:DLR、LDR、LRD、DRL、RDL、RLD。

DLR—先(根)序遍歷

LDR—中(根)序遍歷

LRD—後(根)序遍歷

1408亮哥用C語言敲得程式碼:

1.Demo_1 順序儲存

//  驗證陣列的順序儲存

//  陣列是線性表的順序儲存  記憶體地址是連續的。

#include <stdio.h>

//宣告一個全域性的陣列

int a[10] = {0,1,2,3,4,5,6,7,8,9};

int b[4][3] = {{1,2,3},{2,2,3},{3,2,3},{4,2,3}};

//封裝一個函式  第一種傳陣列的方式

void show_fun(int *a,int n);

//封裝一個函式  第二種傳陣列的方式

void show_foo(int a[],int n);

//封裝一個函式  傳遞一個二維陣列

void show_arr_arr(int **arr,int m,int n);

//函式實現

void show_fun(int *a,int n)

{

    for (int i = 0; i < n; i++)

    {

printf("陣列元素:a[%d] = 地址:%p ----->資料:%d\n",i,&a[i],a[i]);

    }

}

int main(int argc, const char * argv[])

{

//函式中呼叫一下列印陣列的記憶體地址

    show_fun(a10);

    return 0;

}

2.Demo_2 鏈式儲存(動態記憶體分配)

//   手動記憶體管理時

#include <stdio.h>

//第一步需要匯入標頭檔案  malloc();

#include <stdlib.h>

int main(int argc, const char * argv[])

{

//第二步 使用malloc函式分配記憶體 4位元組 存 100

    int *p = (int *)malloc(sizeof(int));

//分析   p 分配在棧    malloc返回的結果在堆中

//第三步  輸出指標變數p,自己的記憶體地址,和它

//儲存的堆記憶體的地址

    printf("p自己在記憶體中得地址(棧):%p\n",&p);

    printf("p中儲存的malloc()分配的地址(堆):%p\n",p);

//0x1001000e0這塊記憶體空間中儲存一個 整型的資料

    *p = 100;

//通過間接定址運算子 訪問這個段記憶體空間中的值

// 把100 賦值給 *p,也就是p->記憶體地址

    printf("0x1001000e0 地址中儲存的資料:%d\n",*p);

//請你使用malloc函式給5個整型變數分配記憶體地址。

    int *p1 = (int *)malloc(sizeof(int));

    int *p2 = (int *)malloc(sizeof(int));

    int *p3 = (int *)malloc(sizeof(int));

    int *p4 = (int *)malloc(sizeof(int));

    int *p5 = (int *)malloc(sizeof(int));

//輸出 p1--->p5儲存的記憶體地址

    printf("p1 = %p\n",p1);

    printf("p2 = %p\n",p2);

    printf("p3 = %p\n",p3);

    printf("p4 = %p\n",p4);

    printf("p5 = %p\n",p5);

    return 0;

}

3.Demo_3 安全使用malloc

#include <stdio.h>

#include <stdlib.h>

int main(int argc, const char * argv[])

{

//1.使用malloc()函式 分配記憶體空間

    int *p = (int *)malloc(sizeof(int));

//2.判斷 分配是否成功

    if(p != NULL)

    {

printf("親~記憶體分配成功:%p\n",p);

//如果分配成功  繼續操作

        *p = 200;

    }

    else

    {

        printf("記憶體分配失敗!\n");

        //異常退出

        return -1;

    }

       return 0;

}

4.Demo6_二維陣列做引數

//  二維陣列做引數在函式中傳遞

//  使用二級指標int **p,進行傳遞,需要

//  注意的是,二維陣列在展開時的定址規律。

#include <stdio.h>

void show(int **arr,int m,int n)

{

    for(int i = 0; i < m; i++)

    {

        for(int j = 0; j < n; j++)

        {

//   0  1  2  3 先一行的所有列,在換行

相關推薦

資料結構總結

ISD1407 ---->>C++ 6天 ---->>Cocos2d-x ?天 ---->>資料結構與演算法  ?天 ---->>Lua 1天 day

資料結構C#筆記(一)

1.資料結構邏輯結構(Data Structure) 資料結構是相互之間存在一種或多種特定關係的資料元素的集合。在任何問 題中,資料元素之間都不是孤立的,而是存在著一定的關係,這種關係稱為結構 (Structure)。根據資料元素之間關係的不同特性,通常有 4 類基本資料結構

python資料清洗總結-思維導圖

資料清洗是資料預處理的重要組成部分,也是耗時間最長的一部分,因此根本多篇文章總結腦圖便於自己梳理清楚資料清洗的處理步驟,由此知道資料清洗該如何下手。 借鑑文章及資料如下: 專欄1:資料清洗https://zhuanlan.zhihu.com/dataclean

資料結構c語言—— 七大排序演算法總結

排序是資料結構最重要的演算法之一,在這裡整理一下七大排序演算法的思路及程式碼。 排序分為以下四類共七種排序方法: 插入排序:1) 直接插入排序     2) 希爾排序 選擇排序:3) 直接選擇排序     4) 堆排序 交換排序:5) 氣泡排序           

用單鏈表的方式實現集合的基本運算資料結構C語言

①用單鏈表來實現結合的基本運算,首先用的是單鏈表所以我們就先給它建立一個頭結點並且為它分配空間,而結點的結構體中定義了兩個屬性 data域和next指標域。 ②實現集合元素的插入。我用的是單鏈表頭插法的方法,先建立一個新的結點用於輸入值然後插入到線性連結串列中去,然後依次挨

數據結構java學習筆記序章

簡單 size com bsp 一個 隊列 我們 程序 http 程序=數據結構+算法 序章做一個簡單的思維導圖,方便理解數據結構這門課的大綱,接下來我們將是按照線性表,棧,隊列,串,樹和圖的順序依次往下學。 數據結構(java版)學習筆記(序章)

數據結構課本代碼重敲——第四章

all col 除了 如果 free null span maxsize 課本 復習筆記 數據結構 第四章 串 1 #include <iostream> 2 #include <string.h> 3 #inclu

利用python進行資料分析第二 pdf下載

適讀人群 :適合剛學Python的資料分析師或剛學資料科學以及科學計算的Python程式設計者。 閱讀本書可以獲得一份關於在Python下操作、處理、清洗、規整資料集的完整說明。本書第二版針對Python 3.6進行了更新,並增加實際案例向你展示如何高效地解決一系列資料分析問題。你將在閱讀

資料結構c語言——鏈棧儲存結構及實現

鏈棧:就是一種特殊的單鏈表,FILO(先進後出) 通常對於連結串列來說: 1.是不需要頭節點的。 2.基本不存在滿棧的情況,除非記憶體已沒有可用的空間。   不多bibi你們都懂哈,直接上程式碼:  鏈棧結構: typedef struct Stock

資料結構c語言——雙向連結串列的基本操作

定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struct DulNode *

資料結構十五排序

排序演算法 0. 前言 本來準備自己寫,無意間看到一位大佬的博文…大家還是移步吧 推薦一套自己開發的演算法演示工具 1. 總結 排序方法 平均時間複雜度 最壞時間複雜度 額外空間複雜度 穩定性

資料結構十五最小生成樹

最小生成樹問題 1. 什麼是最小生成樹 是一棵樹 無迴路 |V|個頂點一定有 |V|-1 條邊 是生成樹 不唯一 包含全部頂點 |V|-1 條邊都在圖裡 邊的權值和最小

資料結構十四最短路問題

最短路徑問題 1. 概述 1. 抽象 在網路(帶權圖)中,求兩個不同頂點之間的所有路徑中,邊的權值之和最小的那一條路徑 這條路徑就是兩點之間的最短路徑(ShorttestPath) 第一個頂點為源點(Source) 最後一個頂點為終點(Destinatio

資料結構非線性表

非線性結構-樹 實驗簡介 前面兩章我們講解了資料結構中的線性結構--線性表、棧和佇列,這章開始以及下一章我們將講解非線性結構樹和圖。 一、樹 什麼是樹呢?樹很好地反應了一種層次結構,例如下圖,這就是一種樹形結構,它有很多結點組成,最上面的實驗樓課程結點稱為樹的根,結點擁

資料結構學習中

預先知識:(C語言) 1、指標 地址:記憶體單元的編號 指標:指標就是地址,地址就是指標            指標變數:就是一個變數,這個變數儲存了一個非負整數,即儲存了記憶體單元的編號的變數,所有指標變數只佔4個位元組(

資料結構C#版本_圖

推薦閱讀:  我的CSDN  我的部落格園  QQ群:704621321 頂點的度=頂點的入度+頂點的出度。 頂點 v 的入度是指以該頂點 v 為弧頭的弧的數目;頂點 v 的出度

資料結構C語言棧的建立、入棧、出棧並進行進位制轉換

十進位制數轉換為八進位制: | N |N div 8(商) | N mod 8(餘數) |1348| 168 | 4 | 168 | 21 | 0

NOIP模擬 資料結構線段樹

【題目描述】 在看了 jiry_2 的課件《Segment Tree Beats!》後,小 O 深深沉迷於這種能單次 O(logn) 支援區間與一個數取 min/max,查詢區間和等資訊的資料結構,於是他決定做一道與區間與 一個數取 min/max 的好題。 這題是這樣的

資料結構c語言--雙向連結串列的基本操作

定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struc

資料結構c語言——鏈佇列儲存結構及實現

是佇列鴨,FIFO,先進先出! 對於帶頭節點的和不帶頭節點的鏈佇列的操作有個小小的區別: 不帶頭結點的鏈佇列在入佇列的時候,第一個元素時要先判斷是否為空,再插入。而帶頭結點不需要,操作更方便些;  我是分割線-----------------------------