1 / 28

Data Structure in C ─ 陣列與結構

Data Structure in C ─ 陣列與結構. 大綱. 陣列 結構和聯結 多項式抽象資料型態 稀疏矩陣抽象資料型態 上三角和下三角表示法. 陣列. 陣列是一組序對,< index,value>, 其中每一個索引( index) 定義了一個相關連的值( value) 陣列的宣告 int list[5], *plist[5]; 記憶體配置 (一維陣列).

mab
Télécharger la présentation

Data Structure in C ─ 陣列與結構

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Data Structure in C ─ 陣列與結構

  2. 大綱 • 陣列 • 結構和聯結 • 多項式抽象資料型態 • 稀疏矩陣抽象資料型態 • 上三角和下三角表示法

  3. 陣列 • 陣列是一組序對,<index,value>,其中每一個索引(index)定義了一個相關連的值(value) • 陣列的宣告 int list[5], *plist[5]; • 記憶體配置 (一維陣列)

  4. 陣列的抽象資料型態(ADT:abstract data type)(是一種資料型態,它的組織方式使得物件的規格與物件上的運算之規格和該物件的內部表示法與運算的實作法是獨立的)

  5. 二維陣列 • 若有一二維陣列是A[0:u1-1, 0:u2-1],表示此陣列有u1列及u2行,也就是每一列是由u2個元素組成。二維陣列化成一維陣列時,對應方式有兩種:(1)以列為主,(2)以行為主 • 以列為主:視此陣列有u1個元素(0, 1, 2,…,u1-1),每一元素有u2個單位,每個單位佔d個空間A(i, j) = l0+i*u2d+j*d • 以行為主:視此陣列有u2個元素(0, 1, 2,…,u2-1),每一元素有u1個單位,每個單位佔d個空間A(i, j) = l0+j*u1d+i*d

  6. 三維陣列 • 若有一三維陣列是A[0:u1-1, 0:u2-1, 0:u3-1]。一般三維陣列皆先化為二維陣列後,再對應到一維陣列,對應方式也有兩種:(1)以列為主,(2)以行為主

  7. 三維陣列 (續) • 以列為主:視此陣列有u1個u2 * u3的二維陣列,每一個二維陣列有u2個元素,每個u2皆有u3d個空間A(i, j,k) = l0+i*u2u3d+j*u3d+k*d

  8. 三維陣列 (續) • 以行為主:視此陣列有u3個u1 * u2的二維陣列,每一個二維陣列有u2個元素,每個u2皆有u1d個空間A(i, j,k) = l0+k*u1u2d+j*u1d+i*d

  9. n維陣列 • 若有一n維陣列是A[0:u1-1, 0:u2-1, 0:u3-1, … , 0:un-1]。同樣地,n維陣列亦有兩種表式方法:(1)以列為主,(2)以行為主 • 參考課本pp.2-9~2-10

  10. 結構和聯結 • 結構是將不相同型態的資料群集在一起 • Ex. struct { char name[10]; int age; float salary; } person; • 聯結的宣告與結構類似,但union中的欄位必須共用記憶空間 • Ex. Union { int children; int bread; } u;

  11. 結構和聯結 • 自我參考結構(self-referential structure)是一種結構,其中的一個或多個組成元素是指向自身的指標 • 通常需要動態記憶管理程式(malloc和free)來明確地取得或釋回記憶體 • Ex. Type struct list { char data; list *link; };

  12. 多項式抽象資料型態 • 何謂多項式? • Ex. A(x)=3x20+2x5+4與B(x)=x4+10x3+3x2+1  axe,其中x是變數,a是係數,而e是指數多項式最大的指數指稱為次方(degree),等於0的係數不必寫出,指數為0的項目不必寫出數 • 多項式加法 A(x) + B(x) = (ai+bi)xi • 多項式乘法 A(x) * B(x) = (aixi* (bjxj))

  13. 多項式的ADT

  14. 多項式抽象資料型態 (續) • 在C中表示多項示的方法是使用typedef建立polynomial型態 #define MAX_DEGREE 101 /*Max degree of polynomial+1*/ typedef struct{ int degree; float coef[MAX_DEGREE]; } polynomial;  若a的型態是polynomial,且n<MAX_DEGREE, 則多項式A(x)= 可表示為: a.degree=n a.coef[i]=an-i, 0 i n

  15. 多項式抽象資料型態 (續) • 若多項式是稀疏的,係數不為0的項次個數相對於係數為0的項次個數是很小時,會有記憶體浪費的現象 #define MAX_TERMS 100 /*size of terms array*/ typedef struct{ float coef; int expon; } polynomial; Polynomial terms[MAX_TERMS]; int avail=0;

  16. 多項式抽象資料型態 (續) • Ex. 將A(X)=2x1000+1和B(X)=x4+10x3+3x2+1相加

  17. void padd (int starta, int finisha, int startb, int finishb, int *stard, int *finishd) { /* add A(x) and B(x) to obtain D(x) */ float coefficient; *startd=avail; while (starta<= finisha && startb <= finishb) switch(COMPARE(terms[starta].expon, terms[startb].expon)) { case –1: /* a expon < b expon*/ attach(terms[startb].coef, terms[startb].expon); startb++; break; case 0: /* equal exponents*/ coefficient = terms[starta].coef+terms[startb].coef;

  18. if (coefficient) attach(coefficient, terms[starta].expon); starta++; startb++; break; case –1: /* a expon > b expon*/ attach(terms[starta].coef, terms[starta].expon); starta++; break; } /* add in remaining terms of A(x)*/ for( ; starta<=finisha; starta++) attach(terms[starta].coef, terms[starta].expon); /* add in remaining terms of B(x)*/ for( ; startb<=finishb; startb++) attach(terms[startb].coef, terms[startb].expon); *finishd=avail-1; }

  19. void attach(float coefficient, int exponent) { /* add a new term to the polynomial*/ if(avail>=MAX_TERMS) { fprintf(stderr,”Too many terms in the polynomial\n”); exit(1); } terms[avail].conf = coefficient; terms[avail].expon = exponent; avail++; }

  20. 稀疏矩陣抽象資料型態 • 在數學上,一個矩陣包含m列和n行的元素。一般寫為m × n,表示矩陣有m列n行,共有mn個元素。若m = n,矩陣為一方陣 • 在計算機科學上,一個矩陣的標準表示法為二維陣列,定義為a[MAX_ROWS][MAX_COLS] • 若矩陣中包含了許多的0,我們稱為“稀疏矩陣”。而多少0少能算是稀疏?並沒有明絶對的定對。一般而言,大於1/2個就可稱之

  21. 稀疏矩陣抽象資料型態 (續) • 稀疏矩陣表示法 #define MAX_TERMS 101 /*maximum number of terms +1*/ typedef struct{ int col; int row; int value; } term; term a[MAX_TERMS]; • 若將稀疏矩陣以陣列a表示,a[0].row為列數, a[0].col為行數,而a[0].value為全部不為0之元素個數。另外,a[1]~a[8]是儲存代表不為0的元素。

  22. 稀疏矩陣抽象資料型態 (續)

  23. 稀疏矩陣 的ADT

  24. 稀疏矩陣抽象資料型態 (續) • 轉置矩陣是將矩陣的行與列互換。也就是將矩陣中的每個元素a[i][j]變成轉置矩陣中的元素b[j][i]

  25. void transpose(term a[], term b[]) /* b is set to the transpose of a */ { int n, i, j, currentb; n = a[0].value; /* total number of elements */ b[0].row = a[0].col /* rows in b = columns in a */ b[0].col = a[0].row /* columns in b = rows in a*/ b[0].value=n; if (n>0) { /*non zero matrix*/ currentb=1; for(I=0; I<a[0].col;I++) /*transpose by the columns in a*/ for(j=1;j<=n;j++) /*find elements from the current column*/ if(a[j].col = = i){ /*element is in current column, add it to b*/ b[currentb].row = a[j].col; b[currentb].col = a[j].row; b[currentb].value = a[j].value; currentb++; } } }

  26. 上三角和下三角表示法 • 若一矩陣的對角線以下的元素均為零時,亦即aij=0,i>j,則稱此矩陣為上三角形矩陣(upper triangular matrix) • 若一矩陣的對角線以上的元素均為零時,亦即aij=0,i<j,則稱此矩陣為上三角形矩陣(lower triangular matrix)

  27. 上三角和下三角表示法 (續) • 一個n*n個的上下三角形矩陣共有[n(n+1)]/2個元素,依序對映至D(1: [n(n+1)]/2) • 以列為主(上三角形矩陣):一個n*n的上三角形矩陣對映至D陣列時,當aij=D(k),則k = n(i-1)-[i(i-1)]/2+j • 以列為主(下三角形矩陣):一個n*n的下三角形矩陣對映至D陣列時,當aij=D(k),則k = [i(i-1)]/2+j

  28. 上三角和下三角表示法 (續) • 以行為主(上三角形矩陣):一個n*n的上三角形矩陣對映至D陣列時,當aij=D(k),則k = [j(j-1)]/2+I • 以行為主(下三角形矩陣):一個n*n的下三角形矩陣對映至D陣列時,當aij=D(k),則k = n(j-1)-[j(j-1)]/2+ji

More Related