我們如何把現實中大量而複雜的問題以特定的資料型別和特定的儲存結構儲存到主儲存器(記憶體)中,以及在此基礎上為實現某個功能(比如查詢某個元素,刪除某個元素,對所有元素進行排序)而執行的相應的操作,這個相應的操作也叫演算法
資料結構=個體+個體的關係
演算法=對儲存資料的操作
演算法:解題的方法和步驟
衡量演算法的標準:
①時間複雜度:大概程式要執行的次數,而非執行的時間
②空間複雜度:演算法執行過程中大概所佔的最大記憶體
③難易程度
④健壯性
程式 = 資料的儲存+資料的操作+可以被計算機執行的語言
1.指標
指標是c語言的靈魂
控制線:表示是讀還是寫或唯讀、只寫
資料線:資料傳輸,表示是把記憶體的資料傳送到cpu內部執行還是cpu內部把執行結果寫到記憶體
2.指標和陣列
①陣列名
②下標和指標的關係
a[i]等價於*(a+i)
*a + 3 == a[0]+3;
假設指標變數 的名字是 p;則p+i 的值是 p+i*(p所指的變數所佔的位元組數);
# include
void show_array(int *p,int len)
int main(void);
show_array(a,5);
printf("%d\n",a[0]); //-1
return
0;}
③指標變數的運算3.結構體
①為什麼會出現結構體
為了表示一些複雜的資料,而普通的基本型別變數無法滿足要求
②什麼是結構體
結構體是使用者根據實際需要自己定義的資料型別
③使用結構體
兩種方式:
struct student st =
struct student * pst = &st;
1.st.sid
2.pst->sid
pst所指向的結構體變數中的sid這個成員
demo:結構體的第一種使用方法
# include
struct student
;//分號不能省略
//結構體不是變數 結構體是一種新的資料型別
int main(void)
; //用 前面的資料型別 定義乙個st 變數。
printf("%d %s %d\n",st.sid,st.name,st.age);
//1000 zhangsan 20
//或者用以下方式賦值:
//strcpy(st.name,"list");
return
0;}
注意:以上字串的賦值不可以直接使用st.name=」lisi」;此種寫法是錯誤的。
注意事項結構體的第二種使用方法結構體變數不能加減乘除,但可以相互賦值
普通結構體變數和結構體指標變數作為函式傳參問題
#include
struct student;
int main(void)
;// st.age=99;第一種方式
struct student * pst;
//第二種方式 是最常用的 資料結構中就是用的這種方式
pst = &st;
pst->sid = 99;
//pst -> sid 等價於 (*pst).sid
//(*pst).sid 等價於 st.sid;
}
普通結構體變數和結構體指標變數作為函式傳參的問題:在傳遞引數時 最好不要傳遞變數,最好傳遞指標
因為指標變數永遠只佔 4個位元組,如果你傳遞了乙個結構體變數,那麼就可能需要占用幾百上千個位元組的記憶體,而你傳遞乙個指標變數只需要四個位元組就可以了。
例:
#include
#include
struct student;
void f(struct student *pst)
void p(struct studet *pst)
int main(void)
4.動態記憶體的分配和釋放
假設動態構造乙個int型的一位陣列
int len;
int * parr = (int *)malloc (sizeof(int) * len);
①本語句分配了兩塊記憶體,一塊記憶體是動態分配的,總共len個位元組;另一塊是靜態分配的,是parr變數本身所佔的記憶體,總共4個位元組(指標變數只佔4個位元組)。
②malloc只有乙個int型的形參,表示要求系統分配的位元組數
③malloc函式的功能是請求系統分配len個位元組的記憶體空間,如果分配成功,則返回第乙個位元組的位址,如果分配不成功,則返回null
④malloc函式能且只能返回第乙個位元組的位址,所以我們需要把這個無任何實際意義的第乙個位元組的位址(俗稱幹位址)轉化為乙個有實際意義的位址,因此,malloc函式前面必須加強制型別轉換(資料型別 *)(傳入的是什麼樣的資料型別就強制轉換什麼資料型別),表示把這個無實際意義的第乙個位元組的位址轉化為相應型別的位址。
⑤free(* parr)
表示把parr所指向的記憶體給釋放掉
parr本身的記憶體是靜態的,不能有程式設計師手動釋放,只能在parr變數所在的函式執行終止時有系統自動釋放
⑥跨函式使用記憶體
靜態記憶體不可以跨函式使用:
靜態內存在函式執行期間可以被其它函式使用
靜態內存在函式執行完畢之後就不能在被其它函式使用
動態記憶體可以跨函式使用
動態記憶體在函式執行完畢之後仍然可以被其它函式使用
例一:動態的構造乙個int型別的陣列:
#include
#include
int main(void)
; int len;
printf("請輸入你需要分配的陣列長度:len = ");
scanf("%d",&len);
int *parr = (int *)malloc(sizeof(int)*len);
//我們可以把parr當作乙個普通陣列來使用。
int i;
for( i = 0;iscanf("%d",&parr[i]);
}for( i = 0;iscanf("%d\n",*(parr+i));
}free(parr);//把parr 所代表的動態分配的20個位元組的記憶體釋放了。
return
0;}
例二:
#include
struct student
struct student * createstudent(void)
void showstudent(struct student *pst)
int main(void)
資料結構概述
1 資料 資料是資訊的的載體,是描述客觀事物的數 字元,以及所有能輸入到計算機中並被電腦程式識別和處理的符號的集合。資料大致可以分為 數值型資料 整數 浮點數 複數 雙精度數等 非數值型資料 字元 字串,以及文字 圖形 影象 語音等資料 2 資料結構 data structure 資料結構有兩個層次...
資料結構概述
還可以通過另乙個方面來看資料結構,那就是從它們的強項和弱項來看。在這裡用 的 方式來概述主要資料結構。下面的表顯示了不同資料結構的優缺點,大致給出它們的特性,就象從天空中鳥瞰地面的風景一樣。所以如果對其中的術語不太清楚的話,請不要太著急。陣列 插入快,如果知道下標 但查詢慢,刪除慢,大小固定 有序陣...
資料結構 概述
資料結構概述 定義 我們如何把現實中大量而複雜的問題以特定的資料型別和特定的儲存結構 儲存到主儲存器 記憶體 中,以及在此基礎上為實現某個功能 比如查詢 某個元素,刪除某個元素,對所有元素進行排序 而執行的相應操作,這 個相應的操作也叫演算法。資料結構 個體 個體的關係 演算法 對儲存資料的操作 演...