最近別實驗室的學弟要寫一個計算機,但是他沒想到方法
我推薦他用中序轉後序的方式去處理,不過他似乎不太瞭解
所以我就直接幫他分析一下程式碼
這次程式碼是由良葛格的『中序式轉後序式(前序式)』及『 後序式的運算』複製過來的XD
分別由『Calculator』及『Infix』所組成的,Infix類別是在做『中序轉前序』或『中序轉後序』
Calculator則是提供輸入四則運算以及運算的類別
觀念部份,改天補上
2013/08/01
2013/07/27
資料結構 刪除單向鍊結串列
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
struct List
{
int num;
int total;
struct List *Next;
};
typedef struct List Node;
typedef Node *Link;
int Data[2][MAX]={1,3,5,7,9,2,4,6,8,10,
141,77,150,200,19,12,1414,176,188,20};
Link Delete_List(Link Head, int Key)
{
Link Pointer = Head;
Link Back;
while(1){
if(Pointer->Next == NULL){
printf("Not found\n");
break;
}
if(Head->num == Key){
Head = Pointer->Next;
free(Pointer);
break;
}
Back = Pointer;
Pointer = Pointer->Next;
if(Pointer->num == Key){
Back ->Next = Pointer->Next;
free(Pointer);
break;
}
}
return Head;
}
void Print_List(Link Head)
{
Link Pointer = Head;
while (Pointer != NULL){
printf("[%d, %d] ", Pointer->num, Pointer->total);
Pointer = Pointer->Next;
}
printf("\n");
}
void Free_List(Link Head)
{
Link Pointer;
while(Head != NULL){
Pointer = Head;
Head = Head->Next;
free(Pointer);
}
}
Link Create_List(Link Head)
{
Link New;
Link Pointer;
int i;
Head = (Link)malloc(sizeof(Node));
if(Head == NULL)
printf("Memory allocate Failure!!\n");
else{
Head->num = Data[0][0];
Head->total = Data[1][0];
Head->Next = NULL;
Pointer = Head;
for(i=1; i<MAX; i++){
New = (Link)malloc(sizeof(Node));
New->num = Data[0][i];
New->total = Data[1][i];
New->Next = NULL;
Pointer->Next = New;
Pointer = New;
}
}
return Head;
}
void main()
{
Link Head = Create_List(Head);
int key;
if(Head != NULL){
Print_List(Head);
while(1){
printf("Input 0 to Exit\n");
printf("Input data number for Delete:");
scanf("%d", &key);
if(key == 0)
break;
Head = Delete_List(Head, key);
Print_List(Head);
}
Free_List(Head);
}
}
參考資料:
資料結構 黃國瑜/葉乃菁
資料結構 單向鍊結串列插入
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
struct List
{
int num;
int total;
struct List *Next;
};
typedef struct List Node;
typedef Node *Link;
int Data[2][MAX]={1,3,5,7,9,2,4,6,8,10,
141,77,150,200,19,12,1414,176,188,20};
Link Insert_List(Link Head, Link New, int key)
{
Link Pointer = Head;
while(1){
if(Pointer == NULL){
New->Next = Head;
Head = New;
break;
}
if(Pointer->num == key){
New->Next = Pointer->Next;
Pointer->Next = New;
break;
}
Pointer = Pointer->Next;
}
return Head;
}
void Print_List(Link Head)
{
Link Pointer = Head;
while (Pointer != NULL){
printf("[%d, %d] ", Pointer->num, Pointer->total);
Pointer = Pointer->Next;
}
printf("\n");
}
void Free_List(Link Head)
{
Link Pointer;
while(Head != NULL){
Pointer = Head;
Head = Head->Next;
free(Pointer);
}
}
Link Create_List(Link Head)
{
Link New;
Link Pointer;
int i;
Head = (Link)malloc(sizeof(Node));
if(Head == NULL)
printf("Memory allocate Failure!!\n");
else{
Head->num = Data[0][0];
Head->total = Data[1][0];
Head->Next = NULL;
Pointer = Head;
for(i=1; i<MAX; i++){
New = (Link)malloc(sizeof(Node));
New->num = Data[0][i];
New->total = Data[1][i];
New->Next = NULL;
Pointer->Next = New;
Pointer = New;
}
}
return Head;
}
void main()
{
Link Head = Create_List(Head);
Link New;
int key;
if(Head != NULL){
Print_List(Head);
while(1){
printf("Input 0 to Exit\n");
New = (Link) malloc(sizeof(Node));
printf("Input data number:");
scanf("%d", &New->num);
if(New->num == 0)
break;
printf("Input data total:");
scanf("%d", &New->total);
printf("Input the data number for Insert:");
scanf("%d", &key);
Head = Insert_List(Head, New, key);
Print_List(Head);
}
Free_List(Head);
}
}
參考資料:
資料結構 黃國瑜/葉乃菁
資料結構 單向鍊結串列搜尋
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
struct List
{
int num;
int total;
struct List *Next;
};
typedef struct List Node;
typedef Node *Link;
int SearchTime = 0;
int Data[2][MAX]={91,35,75,75,99,2,400,6,85,100,
141,77,150,200,19,12,1414,176,188,20};
int Search_List(int key, Link Head)
{
Link Pointer;
Pointer = Head;
while( Pointer != NULL){
SearchTime++;
if( Pointer->num == key ){
printf("Data number: %d\n", Pointer->num);
printf("Data total: %d\n", Pointer->total);
return 1;
}
Pointer = Pointer->Next;
}
return 0;
}
void Free_List(Link Head)
{
Link Pointer;
while(Head != NULL){
Pointer = Head;
Head = Head->Next;
free(Pointer);
}
}
Link Create_List(Link Head)
{
Link New;
Link Pointer;
int i;
Head = (Link)malloc(sizeof(Node));
if(Head == NULL)
printf("Memory allocate Failure!!\n");
else{
Head->num = Data[0][0];
Head->total = Data[1][0];
Head->Next = NULL;
Pointer = Head;
for(i=1; i<MAX; i++){
New = (Link)malloc(sizeof(Node));
New->num = Data[0][i];
New->total = Data[1][i];
New->Next = NULL;
Pointer->Next = New;
Pointer = New;
}
}
return Head;
}
void main()
{
Link Head = Create_List(Head);
int number;
if(Head != NULL){
printf("Input Data number:");
scanf("%d", &number);
if( Search_List(number,Head)){
printf("Search time = %d\n", SearchTime);
}else{
printf("NO found!!\n");
}
Free_List(Head);
}
}
參考資料:
資料結構 黃國瑜/葉乃菁
資料結構 Greatest common divisor(最大公因數)
GCD是耳熟能詳的一種遞迴方法,中文意思是『求最大公因數』
求最大公因數再小學的時候就有交過,有一種方法就是透過輾轉相除法
透過輾轉相除法不斷的對除,最後解即為最大公因數
程式碼如下:
求最大公因數再小學的時候就有交過,有一種方法就是透過輾轉相除法
透過輾轉相除法不斷的對除,最後解即為最大公因數
程式碼如下:
#include <stdio.h>
int count = 0;
int GCD(int a, int b){
count++;
if(a % b == 0) return b;
else return GCD(b, a % b);
}
int main()
{
printf("Number:%d\n", GCD(120, 45));
printf("Count:%d\n", count);
return 0;
}
資料結構 Ackermain's function(阿克曼函數)
感覺是很複雜的函數,有興趣可以探討『阿克曼函数--一个计算方法』
參考資料:
http://zh.wikipedia.org/wiki/%E9%98%BF%E5%85%8B%E6%9B%BC%E5%87%BD%E6%95%B8
http://blog.sina.com.cn/s/blog_4765a1560100bpqn.html
#include <stdio.h>
int count = 0;
int Ackerman(int m, int n){
count++;
if(m == 0) return n + 1;
else if(n == 0) return Ackerman(m - 1, 1);
else return Ackerman(m - 1, Ackerman(m, n - 1));
}
int main()
{
printf("Number:%d\n", Ackerman(2,2));
printf("Count:%d\n", count);
return 0;
}
參考資料:
http://zh.wikipedia.org/wiki/%E9%98%BF%E5%85%8B%E6%9B%BC%E5%87%BD%E6%95%B8
http://blog.sina.com.cn/s/blog_4765a1560100bpqn.html
資料結構 Binomial coefficient(二項式係數)
有興趣可以參考一下Binomial coefficient
參考資料:
http://en.wikipedia.org/wiki/Binomial_coefficient
#include <stdio.h>
int count = 0;
int Binomial(int n, int m){
count++;
if( n == m || m == 0 )
return 1;
else
return (Binomial( n - 1, m) + Binomial( n - 1 , m - 1 ));
}
int main()
{
printf("Number:%d\n",Binomial(5,3));
printf("Count%d\n",count);
return 0;
}
參考資料:
http://en.wikipedia.org/wiki/Binomial_coefficient
2012/11/30
2012/11/28
2012/11/27
2012/11/24
訂閱:
文章 (Atom)



