程式設計與演算法 17 結構

2021-10-05 06:28:51 字數 3779 閱讀 3564

本專欄主要基於北大郭煒老師的程式設計與演算法系列課程進行整理,包括課程筆記和oj作業。該系列課程有三部分: (一) c語言程式設計;(二) 演算法基礎;(三) c++物件導向程式設計

(一) c語言程式設計 課程鏈結

現實需求

結構(struct)

struct 結構名

;

struct student 

;

student s1,s2;
struct date 

;struct studentex

;

struct employee 

;

訪問結構變數的成員變數

struct date 

;struct studentex

;studentex stu;

cin >> stu.fgpa;

stu.id =

12345

;strcpy

(stu.szname,

"tom");

cout << stu.fgpa;

stu.birthday.year =

1984

;unsigned

int* p =

& stu.id;

//p指向stu中的id成員變數

結構變數的初始化
studentex stu =};

//一一對應

結構陣列
studentex myclass [50]

;//結構陣列 裡面的每乙個元素都是乙個studentex結構型別

studentex myclass2[50]

=},}

,},}

};myclass[1]

.id =

1267

; myclass[2]

.birthday.year =

1986

;int n = myclass[2]

.birthday.month;

cin >> myclass[0]

.szname;

指向結構變數的指標
studentex * pstudent; 

studentex stu1;

pstudent =

& stu1;

//pstudent是指向結構變數stu1的指標,*pstudent就是結構變數stu1

studentex stu2 =

* pstudent;

(嚴格來說,pstudent儲存的是結構變數stu1的首位址,即pstudent指向結構變數stu1的首位址,*pstudent是從這個首位址開始sizeof(studentex)個位元組的記憶體區域內儲存的內容。方便起見,可以像上面那樣表述)

studentex stu;

studentex * pstu;

pstu =

& stu;

pstu->id =

12345;(

*pstu)

.fgpa =

3.48

;cout << stu.id << endl;

//輸出12345

cout << stu.fgpa << endl;

//輸出 3.48

全域性變數和區域性變數
#include

using namespace std;

int n1=

5,n2=10;

//全域性變數

void

function1()

void

function2()

靜態變數

靜態變數示例

#include

using namespace std;

void

func()

intmain()

上述結果是:4 5 6;如果去掉static 輸出結果將會是:4 4 4。

靜態變數應用:strtok的實現

#include

#include

using namespace std;

intmain()

return0;

}

輸出結果:

手寫實現乙個strtok:

char

*strtok

(char

* p,

char

* sep)

return q;

// q指向第乙個非分隔字元,即所找到子串的開始位置。可以輸出q,直到我們設定的結束符為止,那麼乙個子串就找到了/輸出完畢。

}

我們之所以把start指標變數宣告為static,是因為下次再呼叫該函式時,可以接著上次start位置繼續往下找新的子串。第一呼叫函式時,可以給static賦乙個初值(起始位置),之後每次第乙個引數傳入null即可,接著上次start指向的位置繼續往下走。

識別符號的作用域

void

func

(int m)

else

} i =2;

//編譯出錯,i無定義

}

變數的生存期排序問題

例題: 程式設計接收鍵盤輸入的若干個整數,排序後從小到大輸出。先輸入乙個 整數n,表明有n個整數需要排序,接下來再輸入待排序的n個整數。

解題思路:先將n個整數輸入到乙個陣列中,然後對該陣列進行排序,最後遍歷整個陣列,逐個輸出其元素。

對陣列排序有很多種簡單方法,如「氣泡排序」、 「選擇排序」、 「插入排 序」等

選擇排序

如果有n個元素需要排序,那麼首先從n個元素中找到最小的那個(稱為第0 小的)放在第0個位子上(和原來的第0個位子上的元素交換位置),然後再從剩 下的n-1個元素中找到最小的放在第1個位子上,然後再從剩下的n-2個元素 中找到最小的放在第2個位子上…直到所有的元素都就位。

4,3,2,1

1,3,2,4

1,2,3,4

void

selectionsort

(int a,

int size)

}

時間複雜度:程式中執行最多的操作被執行了多少次。

上面程式中a[j]o(s

ize2

)o(size^2)

o(size

2),size是陣列大小,即陣列包含的元素個數。

插入排序

4,3,2,1

3,4,2,1

2,3,4,1

1,2,3,4

void

insertionsort

(int a,

int size)

}}

氣泡排序
void

bubblesort

(int a,

int size)

}

簡單排序的率

C 資料結構與演算法揭秘17

這節我們介紹直接插入排序和希爾排序演算法,一 直接插入排序 直接插入排序 direct insert sort 的基本思想是 順序地將待排序的記錄按其關鍵碼的大小插入到已排序的記錄子串行的適當位置。子串行的記錄個數從1開始逐漸增大,當子串行的記錄個數與順序表中的記錄個數相同時排序完畢。設待排序的順序...

python演算法與資料結構(17)快速排序

快速排序 也是分治法。很多標準語言的排序方法,最優的演算法複雜度比較好。原理 定乙個主元,左邊指標從左往右,右邊指標從右往左,把與主元小的元素,把主元函式和這個元素調換位置。方案1 缺點需要額外記憶體空間 def quicksort array if len array 2 return array...

資料結構 演算法與程式設計(1)

這部分不會有很系統的講解,只是列舉一些題目,分享一下我和別人的思路。1.1 陣列的查詢 陣列,可以說是最簡單的資料型別,它占用一塊連續的記憶體並按照順序儲存資料。與vector不同,建立陣列時,需要指定陣列的大小,而且不允許動態增加陣列元素。陣列中的記憶體是連續的,而且可以根據下標讀寫元素,時間效率...