日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(1).数据结构概述

發(fā)布時(shí)間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (1).数据结构概述 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

數(shù)據(jù)結(jié)構(gòu)概述

預(yù)備知識(shí):

模塊:


這篇筆記是根據(jù)郝斌老師的上課講義整理而得:

數(shù)據(jù)結(jié)構(gòu)概述

定義:如何把現(xiàn)實(shí)中大量復(fù)雜的問題以特定的數(shù)據(jù)類型和特定的存儲(chǔ)結(jié)構(gòu)保存到主存儲(chǔ)器中(內(nèi)存)中, 以及在此基礎(chǔ)上為實(shí)現(xiàn)某一個(gè)功能而執(zhí)行的相應(yīng)操作,這個(gè)相應(yīng)的操作也叫算法。

特定的數(shù)據(jù)類型和結(jié)構(gòu)是指:如果我們保存少量的數(shù)據(jù),我們可以使用數(shù)組(連續(xù));如果保存大量的數(shù)據(jù),我們就必須使用鏈表(不連續(xù),通過指針相連);如果我們還要保存數(shù)據(jù)item之間的關(guān)系,如一個(gè)部門的上下級(jí)關(guān)系,我們就必須使用樹來保存;如果我們要保存一個(gè)城市的地圖(任何節(jié)點(diǎn)之間都可能產(chǎn)生關(guān)系),那我們必須使用圖來保存。

數(shù)據(jù)結(jié)構(gòu) = 個(gè)體的存儲(chǔ)+個(gè)體的關(guān)系存儲(chǔ)

?算法 = 對(duì)存儲(chǔ)數(shù)據(jù)的操作

算法:
?? ?解題的方法和步驟
?? ?衡量算法的標(biāo)準(zhǔn)
?? ??? ?1. 時(shí)間復(fù)雜度:大概程序要執(zhí)行的次數(shù),而非執(zhí)行的時(shí)間
?? ??? ?2. 空間復(fù)雜度:算法執(zhí)行過程中大概所占用的最大內(nèi)存
?? ??? ?3. 難易程度
?? ??? ?4. 健壯性

數(shù)據(jù)結(jié)構(gòu)的地位:
?? ?數(shù)據(jù)結(jié)構(gòu)是軟件中最核心的課程
?? ?程序 = 數(shù)據(jù)的存儲(chǔ) + 數(shù)據(jù)的操作 + 可以被計(jì)算機(jī)執(zhí)行的語言

?

預(yù)備知識(shí):

1)指針:

指針是C語言的靈魂 ;

表示一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu) ;快速的傳送數(shù)據(jù);使函數(shù)返回一個(gè)以上的值;能直接訪問硬件 ;能夠方便的使用數(shù)組和字符串;是理解面向?qū)ο笳Z言中引用的基礎(chǔ)

定義:地址,內(nèi)存單元的編號(hào)。指針變量占4個(gè)字節(jié)。指針就是地址 地址就是指針;指針變量是存放內(nèi)存單元地址的變量;指針的本質(zhì)是一個(gè)操作受限的非負(fù)整數(shù)

分類:
?? ??? ?1. 基本類型的指針
?? ??? ??? ?int *i;

如何通過被調(diào)函數(shù)修改主調(diào)函數(shù)中普通變量的值 Ⅰ 實(shí)參為相關(guān)變量的地址 Ⅱ 形參為以該變量的類型為類型的指針變量Ⅲ在被調(diào)函數(shù)中通過 *形參變量名 的方式就可以修改主函數(shù)相關(guān)變量的值void f(int * p) //不是定義了一個(gè)名字叫做*p的形參, 而是定義了一個(gè)形參,該形參名字叫做p,它的類型是int * {*p = 100; // }int main(void) {int i = 9;f(&i);printf("i = %d\n", i);return 0; }


?? ??? ?2. 指針和數(shù)組的關(guān)系

指針 和 一維數(shù)組
數(shù)組名

一維數(shù)組名是個(gè)指針常量,它存放的是一維數(shù)組第一個(gè)元素的地址,?它的值不能被改變一維數(shù)組名指向的是數(shù)組的第一個(gè)元素

?? ??? ?

int a[5] = {1,2,3,4,5}; printf("%p\n", *a+1);//平移四個(gè)字節(jié)地址double arr[3]; double *q; q = &arr[0]; q = &arr[1];?? ?//平移8個(gè)字節(jié)地址,但指針變量只占4個(gè)字節(jié) void Show_Array(int * p, int len) {int i = 0;for (i=0; i<len; ++i)printf("%d\n", p[i]);//p[2] = -1; //p[0] == *p p[2] == *(p+2) == *(a+2) == a[2]//p[i]就是主函數(shù)的a[i] }int main(void) {int a[5] = {1,2,3,4,5};Show_Array(a, 5); //a等價(jià)于&a[0], &a[0]本身就是int *類型//printf("%d\n", a[2]);return 0; }

? 指針的指針

結(jié)構(gòu)體:
?? ?為什么會(huì)出現(xiàn)結(jié)構(gòu)體
?? ??? ?為了表示一些復(fù)雜的數(shù)據(jù),普通的數(shù)據(jù)類型無法滿足要求
?? ??? ?
?? ?什么叫結(jié)構(gòu)體
?? ??? ?結(jié)構(gòu)體是用戶根據(jù)實(shí)際需要自己定義的復(fù)合數(shù)據(jù)類型
?? ??? ?
?? ?如何使用結(jié)構(gòu)體
?? ??

#include <string.h>struct Student { int sid;char name[200];int age; }; //分號(hào)不能省int main() {strcpy(st.name, "lisi");struct Student * pst = &st;pst->sid ==(*pst).sid == st.sid;?? ?//pst所指向的結(jié)構(gòu)體變量中sid成員}


?? ??? ?
?? ?注意事項(xiàng)
?? ??? ?結(jié)構(gòu)體變量不能加減乘除,但可以相互賦值
?? ??? ?普通結(jié)構(gòu)體變量和結(jié)構(gòu)體指針變量作為函數(shù)參數(shù)的問題

傳輸?shù)臅r(shí)候最好傳輸指針:地址,而不要傳輸變量,因?yàn)樽兞靠赡苄枰獋鬏敽芏嘧止?jié),而指針始終傳輸?shù)氖撬膫€(gè)字節(jié)。
?? ?
動(dòng)態(tài)內(nèi)存的分配和釋放

int * pArr = (int *)malloc(sizeof(int) * len);//等價(jià)于 int pArr[len] *pArr = 4;//等價(jià)于a[0] = 4 pArr[1] = 10;//等價(jià)于a[1] = 10free(pArr);1、 malloc只有一個(gè)int型的形參,表示要求系統(tǒng)分配的字節(jié)數(shù) 2、 malloc函數(shù)的功能是請(qǐng)求系統(tǒng)len個(gè)字節(jié)的內(nèi)存空間,如果請(qǐng)求分配成功,則返回第一個(gè)字節(jié)的地址,如果分配不成功,則返回NULL 3、 malloc函數(shù)能且只能返回第一個(gè)字節(jié)的地址,所以我們需要把這個(gè)無任何實(shí)際意義的第一個(gè)字節(jié)的地址(俗稱干地址)轉(zhuǎn)化為一個(gè)有實(shí)際意義的地址,因此malloc前面必須加(數(shù)據(jù)類型 *),表示把這個(gè)無實(shí)際意義的第一個(gè)字節(jié)的地址轉(zhuǎn)化為相應(yīng)類型的地址。如: int *p = (int *)malloc(50); 表示將系統(tǒng)分配好的50個(gè)字節(jié)的第一個(gè)字節(jié)的地址轉(zhuǎn)化為int *型的地址,更準(zhǔn)確的說是把第一個(gè)字節(jié)的地址轉(zhuǎn)化為四個(gè)字節(jié)的地址,這樣p就指向了第一個(gè)的四個(gè)字節(jié),p+1就指向了第2個(gè)的四個(gè)字節(jié),p+i就指向了第i+1個(gè)的4個(gè)字節(jié)。p[0]就是第一個(gè)元素, p[i]就是第i+1個(gè)元素double *p = (double *)malloc(80); 表示將系統(tǒng)分配好的80個(gè)字節(jié)的第一個(gè)字節(jié)的地址轉(zhuǎn)化為double *型的地址,更準(zhǔn)確的說是把第一個(gè)字節(jié)的地址轉(zhuǎn)化為8個(gè)字節(jié)的地址,這樣p就指向了第一個(gè)的8個(gè)字節(jié),p+1就指向了第2個(gè)的8個(gè)字節(jié),p+i就指向了第i+1個(gè)的8個(gè)字節(jié)。p[0]就是第一個(gè)元素, p[i]就是第i+1個(gè)元素 free(p) 釋放p所指向的內(nèi)存,而不是釋放p本身所占用的內(nèi)存

?

模塊:

模塊一:線性結(jié)構(gòu)

連續(xù)存儲(chǔ)[數(shù)組]

離散存儲(chǔ)[鏈表]

線性結(jié)構(gòu)的兩種常見應(yīng)用之一 棧

線性結(jié)構(gòu)的兩種常見應(yīng)用之二 隊(duì)列

專題:遞歸

  • 1+2+3+...+100
  • 求階乘
  • 漢諾塔
  • 走迷宮
  • 模塊二: 非線性結(jié)構(gòu)

  • 模塊三: 查找和排序

    折半查找

    排序:

  • 冒泡
  • 快速排序
  • 插入排序
  • 選擇排序
  • 歸并排序
  • 總結(jié)

    以上是生活随笔為你收集整理的(1).数据结构概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。