--- tags: 教學,南大,資料結構 ###### tags:'教學','南大','資料結構' --- <!-- # 南大資料結構 ## 練習15 鏈結串列 參考答案 ``` #include <stdio.h> #include <stdlib.h> typedef struct element *linkedlist; typedef struct element { char key; linkedlist link; }; linkedlist top=NULL,front=NULL,rear=NULL,avail=NULL; int capacity = 0; ret_node(linkedlist ptr) { linkedlist tmp; if(avail == NULL) avail = ptr; else { ptr->link = avail; avail = ptr; } } element* get_node() { linkedlist tmp; if(avail != NULL) { tmp = avail; tmp->link = NULL; tmp->key = ' '; avail = avail->link; }else { tmp = (element*) malloc(sizeof(element)); } return tmp; } void Empty(char mode) { if(mode=='s') printf("stack is empty,No elements!\n"); else if(mode=='q') printf("queue is empty,No elements!\n"); else printf("mode error!\n"); exit; } void Push( char inputchar, char mode) { //配置指標 linkedlist tmp; tmp = get_node(); if(mode == 's'){ tmp->key = inputchar; tmp->link = top; top=tmp; capacity++; } else if(mode == 'q') { tmp->key = inputchar; tmp->link = NULL; if(front) rear->link = tmp; else //第一個元素 front = tmp; rear = tmp; capacity++; } else { printf("mode error!! \n"); } } element* Pop(char mode) { //配置指標 linkedlist tmp,outputitem; // element outputitem; if(mode == 's') { tmp = top; if (!tmp ) //空 Empty(mode); else { outputitem->key = tmp->key; top = tmp->link; capacity--; ret_node(tmp); return outputitem; } } else if(mode=='q') { tmp = front; if (!tmp ) //空 Empty(mode); else { outputitem->key = tmp->key; front = tmp->link; capacity--; ret_node(tmp); return outputitem; } } else { printf("mode error!! \n"); } } void Print(char mode) { if(mode=='s') { printf("stack are : \n"); linkedlist tmp; tmp = top; printf( "stack={" ); while(tmp) { printf("%c, ",tmp->key ); tmp = tmp->link; } printf( "} \n " ); } else if(mode=='q') { printf("queue are : \n"); linkedlist tmp; tmp = front; printf( "queue={" ); while(tmp) { printf("%c, ",tmp->key ); tmp = tmp->link; } printf( "} \n " ); } else { printf("mode error!! \n"); } printf("目前容量:%d \n",capacity); } int main(void) { linkedlist letter; char action, mode; int i, end; printf("Please push a 's'(stack) or 'q'(queue) to use this struct ! \n"); scanf(" %c", &mode); // queue = (element*) calloc(capacity, sizeof(element*)); if(mode == 's'){ do{ printf("This is a stack! Please push a letter or '=' for pop or '!' for exit ! \n"); scanf(" %c", &action); if(action > 64 && action < 123) { Push(action, mode); Print(mode); } else if(action == 61){ printf("'%c' \n", Pop(mode)->key); Print(mode); } else { printf("Please input a letter ! \n"); } }while(action != 33 ); } else if(mode =='q'){ do{ printf("This is a queue! Please push a letter or '=' for pop! \n"); scanf(" %c", &action); if(action > 64 && action < 123) { Push(action, mode); Print(mode); } else if(action == 61){ printf("'%c' \n", Pop(mode)->key); Print(mode); } else { printf("Please input a letter ! \n"); } }while(action != 33 ); } else { printf("Don't input other letters! try again! press 'e' to exit! "); } printf("\n目前容量:%d ", capacity); return 0; } ``` --> # 南大資料結構 ## 4-1 鏈結串列練習 ``` #include <stdio.h> #include <stdlib.h> #define max_size 10 typedef struct listNode *listPointer; typedef struct listNode{ int data; listPointer link; }; void insert(listPointer *first ,listPointer x, int num); void del(listPointer *first ,listPointer trail,listPointer x); void print(listPointer *first); int main() { listPointer ptr; listPointer node[max_size]; int i; for( i=0 ;i<=5; i++) { node[i]= (listPointer) malloc(sizeof(listNode)); node[i]->data = 20 + i*10; printf("node[%d]=%u, ", i, node[i]); //印出節點的位址 printf("node[%d].data=%d \n", i,node[i]->data); //印出節點的資料 } for( i=0 ;i<5; i++) { node[i]->link = node[i+1]; printf("node[%d].link=%u\n", i,node[i]->link); //印出下一個節點位址 } ptr=node[0]; node[i-1]->link = NULL; // while(ptr != NULL){ // // printf(" ptr=%u, ", ptr); // printf("data=%d ", ptr->data); // printf("link=%u\n", ptr->link); // // ptr=ptr->link; //將ptr指向下一個節點 // // } return 0; }; void insert(listPointer *first ,listPointer x , int num) { listPointer tmp; tmp = (listPointer) malloc(sizeof(*tmp)); tmp->data=num; if(*first) { tmp->link = x->link; x->link = tmp; } else { tmp->link = NULL; *first = tmp; } } void del(listPointer *first ,listPointer trail,listPointer x) { if(trail) trail->link = x->link; else *first= (*first)->link; free(x); } ``` ## 3-2 結構陣列 queue ``` #include <stdio.h> #include <stdlib.h> struct element { char key; }; element *queue; int capacity = 5; int front=0, rear=0; void queueFull() { int old_capacity=capacity; capacity *=2; queue = (element*) realloc(queue , capacity*sizeof(element*)) ; printf("倍增容量,目前容量:%d \n",capacity); printf("front:%d,rear:%d \n",front, rear); if( front > 0 )//捲繞 { for(int i =front+1 ; i<old_capacity; i++) { queue[i+old_capacity] = queue[i]; queue[i].key = ' '; } front += old_capacity; } else { // front = capacity-1; rear = rear+old_capacity; } // printf("queue is full!\n"); // exit(EXIT_FAILURE); } void queueEmpty() { printf("queue is empty,No elements!\n"); exit(EXIT_FAILURE); } void queuePush( element item) { rear = (rear+1) % capacity; if (rear == front) queueFull(); queue [rear] = item; } element queuePop() { element item; if (front == rear ) queueEmpty(); else { front = (front+1 ) % capacity; item = queue[front]; queue[front].key = ' '; //清空 return item; } } void queuePrint() { printf("queue are : \n"); for(int i=0; i<capacity; i++) printf("queue[%d]= %c \n",i, *(queue+i) ); printf("front:%d rear:%d \n",front, rear); printf("目前容量:%d \n",capacity); } int main(void) { element letter; char action; int i, end; queue = (element*) calloc(capacity, sizeof(element*)); do{ printf("Please push a letter or '=' for pop! \n"); scanf(" %c", &action); if(action > 64 && action < 123) { letter.key = action; queuePush(letter); queuePrint(); } else if(action == 61){ printf("'%c' \n", queuePop().key); queuePrint(); } else { printf("stop the program! \n"); queuePrint(); } }while(action == 61 || (action > 64 && action < 123)); printf("\n目前容量:%d ",capacity); return 0; } ``` ## 3-1結構陣列stack ``` #include <stdio.h> #include <stdlib.h> struct element { char key; }; element *stack; int capacity; int top=-1, front=-1, rear=-1; void stackFull() { capacity *=2; stack = (element*) realloc(stack, capacity*sizeof(element*)) ; printf("倍增容量,目前容量:%d \n",capacity); // exit(EXIT_FAILURE); } void stackEmpty() { printf("Stack is empty,No elements!\n"); // exit(EXIT_FAILURE); } void stackPush( element item) { if (top >= (capacity- 1)) stackFull(); stack [++top] = item; } element stackPop() { if (top == -1 ) stackEmpty(); else return stack[top--]; } void statckPrint() { printf("stack are : \n"); for(int i=top; i>=0; i--) printf("stack[%d]= %c \n",i, *(stack+i) ); printf("目前容量:%d \n",capacity); } int main(void) { element letter; char action; int i, end; capacity=2; stack = (element*) malloc( capacity*sizeof(element*)); do{ printf("Please push a letter or '=' for pop! \n"); scanf(" %c", &action); if(action > 64 && action < 123) { letter.key = action; stackPush(letter); statckPrint(); } else if(action == 61){ printf("'%c' \n", stackPop().key); statckPrint(); } else { printf("stop the program! \n"); statckPrint(); } }while(action == 61 || (action > 64 && action < 123)); printf("\n目前容量:%d ",capacity); return 0; } ``` <!-- ## 期中考 第一題改寫參考範例 ``` #include <stdio.h> #include <stdlib.h> #include <time.h> void make2Dlist(int **list, int &row, int &col); int main(void){ //全域變數改成動態配置 int row, col; int **list; printf("Enter row number to generate:"); scanf("%d", &row); printf("Enter col number to generate:"); scanf("%d", &col); //二維陣列動態配置法 list = (int**) malloc(sizeof(int*)*row); for(int i=0 ;i < row ; i++) list[i] = (int*) malloc(sizeof(int)*col); //以址傳遞呼叫函式 make2Dlist(list, row, col); return 0; } void make2Dlist(int **list, int &row, int &col) { srand(time(NULL)); for(int i = 0; i < row ; i++) for(int j=0; j < col; j++) list[i][j] = rand( ) % 100; } ``` --> ## 2-5 稀疏矩陣 轉置 ``` #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_COL 50 typedef struct term { int col; int row; int value; }; void transpose (term a[], term b[]); void fastTranspose(term a[], term b[]); int main() { int i,j,k,isZero=1; term oring[MAX_COL], trans[MAX_COL]; printf("show array now \n"); oring[0].row= 4; oring[0].col= 6; oring[0].value= 3; int col_num = oring[0].row; int row_num = oring[0].col; int n = oring[0].value; srand( time(NULL) ); for( i=1 ; i<= n ; i++) { oring[i].col= rand( ) % oring[0].col ; oring[i].row= rand( ) % oring[0].row; oring[i].value= (rand( ) % 100) -50 ; printf("oring[%d][%d]=%d ",oring[i].row , oring[i].col, oring[i].value ); printf("\n"); } printf("\n"); for( i=0 ; i< col_num ; i++) { printf("%d : ",i); for( j=0 ; j< row_num ; j++) { for( k=1; k<=n; k++) { if(i == oring[k].row && j == oring[k].col) { printf("[%d] ",oring[k].value); isZero=0; break; } else { isZero=1; } } if(isZero) printf("[0] "); } printf("\n"); } //transpose(oring, trans); fastTranspose(oring, trans); printf("\n show sparse matrix after transform \n"); for(i=0 ; i<row_num; i++) { printf("%d : ",i); for(j=0; j<col_num; j++) { for(k=1; k<=n; k++) { if(i == trans[k].row && j == trans[k].col) { printf("[%d] ",trans[k].value); isZero=0; break; } else { isZero=1; } } if(isZero) printf("[0] "); } printf("\n"); } return 0; } void transpose (term a[], term b[]) { /* 轉置a之後放進b裡 */ int n,i,j,currentb; n = a[0].value; /* 所有元素的個數 */ b[0].row = a[0].col; /* b的列數等於a的行數 */ b[0].col = a[0].row; /* b的行數等於a的列數 */ b[0].value = n; if (n > 0) { /* 非零矩陣 */ currentb = 1; for (i = 0; i < a[0].col; i++) /* 依照a的行轉置 */ for (j = 1; j<= n; j++) /* 從目前的行中找元素 */ if (a[j].col == i) { /* 元素在目前的行裡,把它加入b中 */ b[currentb].row = a[j].col; b[currentb].col = a[j].row; b[currentb].value = a[j].value; currentb++; } } } void fastTranspose(term a[], term b[]) { /* 把a轉置後放入b裡 */ int rowTerms[MAX_COL], startingPos[MAX_COL]; int i,j, numCols = a[0].col, numTerms = a[0].value; b[0].row = numCols; b[0].col = a[0].row; b[0].value = numTerms; if (numTerms > 0) { /* 非零矩陣 */ for (i = 0; i < numCols; i++) rowTerms[i] = 0; for (i = 1; i <= numTerms; i++) { rowTerms[a[i].col]++; // printf("i=%d , col=%d, rowterms=%d ; ",i,a[i].col,rowTerms[a[i].col]); } // printf("\n"); startingPos[0] = 1; for (i = 1; i < numCols; i++) { startingPos[i] = startingPos[i-1] + rowTerms[i-1]; // printf("i=%d , startingPos[i-1]=%d, rowTerms[i-1]=%d ,startingPos[i]=%d ;\n ",i,startingPos[i-1],rowTerms[i-1],startingPos[i]); } for (i = 1; i <= numTerms; i++) { j = startingPos[a[i].col]++; b[j].row = a[i].col; b[j].col = a[i].row; b[j].value = a[i].value; } } } ``` ## 2-3三元序練習 ``` #include <stdio.h> #include <stdlib.h> typedef struct sp_matrix{ int row; int col; int value; }; sp_matrix *ptr; void printsp(int n); int main(void) { int i,n; printf("輸入矩陣的個數: "); scanf("%d", &n); ptr=(sp_matrix*) malloc(sizeof(sp_matrix)*n+1); printf("輸入矩陣的維度row: "); scanf("%d", &ptr[0].row); printf("輸入矩陣的維度col: "); scanf("%d", &ptr[0].col); ptr[0].value = n; for(i = 1 ; i <= n ; i++) { printf("請輸入 %d 項的row: ", i ); scanf("%d", &ptr[i].row); printf("請輸入 %d 項的col: ", i ); scanf("%d", &ptr[i].col); printf("請輸入 %d 項的value: ", i); scanf("%d", &ptr[i].value); } printf("印出三元序:\n"); printf("%5d %5d %5d \n", ptr[0].row,ptr[0].col,ptr[0].value); printf("----------------\n"); for(int i = 1 ; i <= n ; i++) { printf("%5d %5d %5d \n", ptr[i].row,ptr[i].col,ptr[i].value); } // printsp(n); return 0; } void printsp(int n) { int i; printf("印出三元序:\n"); printf("%5d %5d %5d \n", ptr[0].row,ptr[0].col,ptr[0].value); printf("----------------\n"); for(int i = 1 ; i <= n ; i++) { printf("%5d %5d %5d \n", ptr[i].row,ptr[i].col,ptr[i].value); } } ``` ## 2-2 多項式練習 ``` #include <stdio.h> #include <stdlib.h> typedef struct polynomial{ float coef; int expon; } ; polynomial*ptr; void printpoly(int n); int main(void) { int i,n; printf("輸入多項式的項次有幾項: "); scanf("%d", &n); ptr=(polynomial*)malloc(sizeof(polynomial)*n); for(i = 0 ; i < n ; i++) { printf("請輸入 %d 項的係數: ", i + 1); scanf("%f", &ptr[i].coef); printf("請輸入 %d 項的指數: ", i + 1); scanf("%d", &ptr[i].expon); } printpoly(n); return 0; } void printpoly(int n) { int i; printf("印出多項式:"); for(int i = 0 ; i < n ; i++) { printf("(%1.0f)x^%d", ptr[i].coef,ptr[i].expon); if( i != n-1) printf("+"); } printf("\n"); } ``` ## 1-4 Struct練習2 ``` #include <stdio.h> #include <stdlib.h > #include <string.h> #include <time.h> struct stu { int age, stu_id; char name[10] ; // char text[10] = "hello"; // char text[10] = {'h', 'e', 'l', 'l', 'o', '\0'}; int score[4] ; float average; }; int main(void) { int i; float average; int age = 6; char name[10] = "apple"; stu my , stu1; my.age = 15; strcpy(my.name ,"linda"); stu1.age=20; strcpy(my.name ,"John"); my.average = 0; stu1.average = 0; srand(time(NULL)); for(i=0 ;i<4;i++) { my.score[i] = rand()%100+1; stu1.score[i] =rand()%100+1; my.average +=my.score[i]; stu1.average +=stu1.score[i]; } my.average /= 4; stu1.average /= 4; printf("my name is: %s\n", my.name); printf("my age is: %d\n", my.age); printf("my average is: %f\n", my.average); printf("stu1 name is: %s\n", stu1.name); printf("stu1 age is: %d\n", stu1.age); printf("stu1 average is: %f\n", stu1.average); printf("age is: %d\n", age); printf("name is: %s\n", name); return 0; } ``` ## 1-4 Struct練習1 ``` #include <stdio.h> #include <stdlib.h > #include <string.h> struct data { int age; char name[6] = "vicky"; // char text[10] = "hello"; char text[10] = {'h', 'e', 'l', 'l', 'o', '\0'}; int score; }; int main(void) { char name[10] = "apple"; int i, age; data my; strcpy(my.name ,"linda"); // my.name[6] = "apple"; my.age = 5; my.score = 90; age = 6; printf("my name is: %s\n", my.name); printf("my name is: %s\n", my.text); printf("my name is: %s\n", name); printf("my age is: %d\n", my.age); printf("age is: %d\n", age); printf("my score is: %d\n", my.score); return 0; } ``` ### 1-5 Magic Square ``` #include <stdio.h> #include <stdlib.h> #include <math.h> void magic_square(int **square, int size); int main(void) {/* 反覆地產生一個大小為n的魔術方陣 */ //int square[15][15]; int **square; int i, j; /* 索引 */ //int count; /* 計數值 */ int size; /* 方陣大小 */ printf("Enter the size of the square: "); scanf("%d", &size); /* 檢查錯誤的輸入 if ( (size < 1) || (size > MAX_SIZE ) ) { fprintf(stderr, "Error! Size is out od range\n"); exit(EXIT_FAILURE); }*/ if (!(size %2) || size < 0) { fprintf(stderr, "Error! Size is even or smaller than zero!\n"); exit(EXIT_FAILURE); } square = (int**) malloc(size*sizeof(int*)); for (i = 0; i < size; i++ ) square[i] = (int*) calloc(size , sizeof(int)); printf("Magic Square of size %d : \n\n", size); for ( i = 0 ; i < size; i++) { for ( j = 0 ; j < size; j++) { printf("%3d", square[i][j] ); } printf("\n"); } printf("\n\n"); /*函式呼叫*/ magic_square(square, size); /*輸出魔術方陣*/ printf("Magic Square of size %d : \n\n", size); for ( i = 0; i < size; i++) { for ( j = 0; j < size; j++) printf("%5d", square[i][j]); printf("\n"); } printf("\n\n"); return 0; } void magic_square(int **square, int size) { int i,j,row, column; square[0][(size-1)/2] = 1; /* 第一列的中間 */ /* i 跟 j 是目前的位置*/ i = 0; j = (size -1)/2; for ( int count = 2; count <= size* size; count ++) { row = (i - 1<0) ? (size - 1) : (i - 1) ; /* 上面 */ column = (j - 1<0) ? (size - 1) : (j - 1) ; /* 左邊 */ if(square[row][column]) /* 下面 */ i = (++i) % size; else { i = row; j = (j - 1<0) ? (size - 1) : --j; } square[i][j] = count; } } ``` ### 動態配置 建立二維陣列 ``` int** make2dArray(int rows, int cols) { /* 建立一個 rows × cols的二維陣列 */ int **x, i;   /* 取得列指標所需的記憶體 */ //MALLOC( x, rows * sizeof(*x)); x = (int**) malloc( rows * sizeof(int*)); //rows * 8 bytes   /* 取得每列需要的記憶體 */ for ( i = 0; i < rows; i++) x[i] = (int*) malloc( cols * sizeof(int)); //cols * 4bytes return x; } ``` ## 練習5:Selection sort and binary search (遞迴版) ``` void sort(int [], int ); /*選擇排序*/ int compare( int x, int y ); int binarysearch (int list[], int searchnum, int left, int right); int binarysearch_re(int list[], int searchnum, int left, int right, int &count); int Sequentialsearch(int list[],int n, int searchnum); void swap(int &a , int &b); int main(void) { int i, n, searchnum, left, right,key; int* list ; printf("Enter the number of numbers to generate: "); scanf("%d", &n); if( n < 1 ){ printf("Improper value of n , system exit! \n"); exit(EXIT_FAILURE); } else{ list = (int*) malloc(n*sizeof(int)); } /*隨機產生數值*/ srand (time(NULL)); for(i = 0; i < n ; i++) { list[i] = rand() % 1000; printf("%d ",list[i]); } /*呼叫排序函式*/ sort(list,n); /*印出已排好序的數值*/ printf("\n Sorted array:\n "); for(i = 0; i < n ; i++) printf("%d ",list[i]); printf("\n"); int answer1, answer2,answer3, number; printf("Enter a serach number: "); scanf("%d", &number); answer1 = binarysearch(list, number, 0, n-1); if(answer1==-1) printf("無此數"); else printf("在數列的第%d位置 ",answer1); printf("\n"); answer2 = Sequentialsearch(list, n, number); if(answer2==-1) printf("無此數"); else printf("在數列的第%d位置 ",answer2); printf("\n"); printf("遞迴法:\n"); int count=0; answer3 = binarysearch_re(list, number, 0, n-1, count); if(answer3==-1) printf("無此數"); else printf("在數列的第%d位置 ",answer3); printf("\n"); return 0; } void sort(int list[], int n) { int i, j, min, temp; for(i = 0; i < n ; i++) { min = i; for(j = i+1 ; j < n ; j++) if(list[j] < list[min]) min = j; //SWAP(list[i],list[min],temp); swap(list[i],list[min]); } } int compare( int x, int y ) { /* 比較x和y ,若是x小於y,則傳回-1;等於則傳回0;大於則傳回1*/ if(x < y) return -1; else if(x == y) return 0; else return 1; } int binarysearch (int list[], int searchnum, int left, int right) { int middle,a=-1, count=0 ; while (left <= right) { middle = (left + right)/2; switch(compare(list[middle], searchnum)) { case -1: left = middle+1; break; case 0 : a= middle; case 1 : right = middle-1; } if(a != -1) { count++; break; } else count++; } printf("\n search times:%d \n",count); if(a==-1) return -1; else return a; } int Sequentialsearch(int list[], int n, int searchnum) { int a=-1,count=0; for(int i=0; i<n; i++) { count++; if(list[i] == searchnum) { a= i; break; } } printf("\n search times:%d \n",count); if(a==-1) return -1; else return a; } int binarysearch_re(int list[], int searchnum, int left, int right, int &count) { int a=-1,middle ; if (left <= right) { count++; printf("\n search times:%d \n",count); middle = (left + right)/2; switch(compare(list[middle], searchnum)) { case -1 : return binarysearch_re(list, searchnum, middle+1, right,count); case 0 : return middle; case 1 : return binarysearch_re(list, searchnum, left, middle-1,count); } } return -1; } void swap(int &a , int &b) { int tmp; tmp =a; a=b; b=tmp; } ``` ## 練習4:Selection sort and binary search (正常版) ``` #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> void sort(int [], int ); /*選擇排序*/ int binsearch(int [], int , int, int); /*二元搜尋*/ int compare(int x, int y); int swap(int &x,int &y) { int temp; temp = x; x=y; y=temp; } int main(void) { int i, n, searchnum, left, right,key; int i, n; int* list ; printf("Enter the number of numbers to generate: "); scanf("%d", &n); if( n < 1){ fprintf(stderr, "Improper value of n\n"); exit(EXIT_FAILURE); } else{ list = (int*) malloc(n*sizeof(int)); } /*for(i = 0; i < n ; i++) { /*隨機產生數值*/ list[i] = rand( ) % 1000; printf("%d ",list[i]); }*/ srand(time(NULL)); for(i = 0; i < n ; i++) { /*隨機產生數值*/ list[i] = rand( ) % 100; printf("%d ",list[i]); } sort(list,n); printf("\n Sorted array:\n "); for(i = 0; i < n ; i++) /*印出已排好序的數值*/ printf("%d ",list[i]); printf("\n"); printf("Enter the number of numbers to search : "); scanf("%d", &key); int num = binsearch(list, key, 0, n-1); printf("\n Sorted: %d the number is %d \n ", num, list[num] ); return 0; } void sort(int list[], int n) { int i, j, min; for(i = 0; i < n ; i++) { min = i; for(j = i+1 ; j < n ; j++) if(list[j] < list[min]) min = j; swap(list[i],list[min]); //SWAP(list[i],list[min],temp); } } int binsearch(int list[], int searchnum, int left, int right) { int middle; while(left <= right){ middle = (left+right)/2; printf("m:%d\n", middle); if(list[middle]== searchnum) return middle; else{ switch (compare(list[middle], searchnum)) { case -1 : left = middle+1; break; case 0: return middle; break; case 1: right = middle-1; break; } } } return -1; } int compare(int x, int y) { if(x < y) return -1; else if(x==y) return 0; else return 1; } ``` ### 練習二:selection sort 改寫 ``` #include <stdio.h> #include <stdlib.h> #include <math.h> void sort(int [], int ); /*選擇排序*/ void swap(int &a, int &b); /*交換*/ int main() { int i, n; int* list ; printf("Enter the number of numbers to generate: "); scanf("%d", &n); if( n < 1){ fprintf(stderr, "Improper value of n\n"); exit(EXIT_FAILURE); } else{ list = (int*) malloc(n*sizeof(int)); } for(i = 0; i < n ; i++) { /*隨機產生數值*/ list[i] = rand( ) % 1000; printf("%d ",list[i]); } sort(list,n); printf("\n Sorted array:\n "); for(i = 0; i < n ; i++) /*印出已排好序的數值*/ printf("%d ",list[i]); printf("\n"); } void sort(int list[], int n) { int i, j, min ; for(i = 0; i < n ; i++) { min = i; for(j = i+1 ; j < n ; j++) if(list[j] < list[min]) min = j; swap(list[i],list[min]); } } void swap(int &a, int &b){ int tmp; tmp = a; a = b; b =tmp; } ``` ### 練習一:二維陣列練習 範例的參考答案 ``` #include <stdio.h> #include <stdlib.h> int main(void) { char sys; for(int i=0 ; i<5 ;i++) { for(int j=0 ; j<5 ;j++) { sys = i<j ? '*': ' '; printf("%c", sys); // if(i<j) // printf("*"); // else // printf(" "); } printf("\n"); } for(int i=0 ; i<5 ;i++) { for(int j=0 ; j<5 ;j++) { if(i%2 == 0 ) printf("*"); else printf("%d", (j+1)%2); } printf("\n"); } printf("\n"); for(int i=0 ; i<5 ;i++) { for(int j=0 ; j<5 ;j++) { if(i*5+j+1 < 10 ) printf("%2d", i*5+j+1 ); else printf("%d", i*5+j+1); } printf("\n"); } return 0; } ```