靈感範文站

數據結構課程設計心得體會精品多篇

數據結構課程設計心得體會精品多篇

數據結構課程設計 篇一

《數據結構》

課程設計報告

學 號 姓 名 班 級 指導教師

XXX XXX XXX XXX 安徽工業大學計算機學院

2014年6月

利用棧實現迷宮問題的求解

一、問題描述

以一個M*N的長方陣表示迷宮,0和1分別表示迷宮中的通路和牆壁。設計一個程序,對任意設定的迷宮,求出一條從入口到出口的通路,或得出米有通路的結論。

二、設計思路

(1)以二維數組maze[m][n]表示迷宮,數組中元素值爲0表示通路,1表示障礙。

(2)其中迷宮的入口位置和出口位置默認於maze數組的起始元素位置和最後個元素位置。

(3)以鏈表作存儲結構的棧類型,實現求解迷宮的非遞歸程序。

三、數據結構定義 typedef struct{

int x; int y; }item; typedef struct{ int x,y,d; }DataType; typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;

typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;

四、程序清單 #include#include#include#define m 6 #define n 8 int maze[m+2][n+2]={{1,1,1,1,1,1,1,1,1,1},

typedef struct{

{1,0,1,1,1,0,1,1,1,1}, {1,0,0,0,0,1,1,1,1,1}, {1,0,1,0,0,0,0,0,1,1}, {1,0,1,1,1,0,0,1,1,1}, {1,1,0,0,1,1,0,0,0,1}, {1,0,1,1,0,0,1,1,0,1}, {1,1,1,1,1,1,1,1,1,1}}; int x; int y; }item;

item move[4]={{0,1},{1,0},{0,-1},{-1,0}};

typedef struct{ int x,y,d; }DataType;

typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;

PSeqStack Init_SeqStack() {

} PSeqStack p; p=(PSeqStack)malloc(sizeof(SeqStack)); if(p) p->top=-1; return p;

int Empty_SeqStack(PSeqStack p) {

}

int Push_SeqStack(PSeqStack p,DataType x) {

}

int Pop_SeqStack(PSeqStack p,DataType *x) { if(p->top==999) return 0; if(p->top==-1) return 1; else return 0; else {

} p->top++; p->data[p->top]=x; return 1;

} if(Empty_SeqStack(p)) return 0; else {

} *x=p->data[p->top]; p->top--; return 1; void Destroy_SeqStack(PSeqStack *p) {

}

int mazepath(int maze[][n+2],item move[],int x0,int y0) {

PSeqStack S; DataType temp; int x,y,d,i,j; if(*p) free(*p); *p=NULL; return;

temp.x=x0; temp.y=y0; temp.d=-1; S=Init_SeqStack(); if(!S) {

} Push_SeqStack(S,temp); while(!Empty_SeqStack(S)) {

Pop_SeqStack(S,&temp); x=temp.x; y=temp.y; d=temp.d+1; while(d<4) {

i=x+move[d]。x; j=y+move[d]。y; if(0==maze[i][j]) { temp.x=x; printf(“棧初始化失敗!!!”); return 0;

}

}

} temp.y=y; temp.d=d; Push_SeqStack(S,temp); x=i; y=j; maze[x][y]=-1; if(x==m&&y==n) {

} else d=0; while(!Empty_SeqStack(S)) {

} Destroy_SeqStack(&S); return 1; Pop_SeqStack(S,&temp); printf(“(%d,%d)<-”,temp.x,temp.y); else d++;

} Destroy_SeqStack(&S); return 0; int main() {

}

五、運行及調試分析 mazepath(maze,move,1,1); return 0;

六、課程設計總結等

在做實驗前,一定要將課本上的知識吃透,因爲這是做實驗的基礎,否則,在做設計程序實驗時,這將使你做的難度加大,浪費寶貴的時間。使你事倍功半。做實驗時,一定要親力親爲,務必要將每個步驟,每個細節弄清楚,弄明白,實驗後,還要複習,思考,這樣,你的印象才深刻,記得才牢固,否則,過後不久你就會忘得一乾二淨,這還不如不做。通過這次程序設計的實驗,使我們學到了不少實用的知識,更重要的是,做實驗的過程,思考問題的方法,這與做其他的實驗是通用的,真正使我們們受益匪淺。

大數相乘

一、問題描述

本問題中,要求輸入兩個相對較大的正整數,能夠通過程序計算出其結果

二、設計思路

1、輸入階段採用一維數組a[],b[] 在輸入階段當大數輸入時,大數a,b從高位到低位分別依次存入數組a[ ],b[ ]。

2、調用函數計算階段採用一維數組c[ ] 在計算過程中,由個位到高位依次計算各位的結果,並依次存入數組c[ ]中。

三、數據結構定義

int x[N],y[N],z[N*N];

四、程序清單 #include#include#define N 80 void mul(int *x,int *y,int *z) { int i,j; for(i=0;i<2*N;i++) z[i]=0; for(i=0;i

五、運行及調試分析

六、課程設計總結。

回顧起此次課程設計,至今我仍感慨頗多,的確,從從拿到題目到完成整個編程,從理論到實踐,可以學到很多很多的的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正提高自己的實際動手能力和獨立思考的能力。

數據結構課程設計 篇二

數據結構課程設計

1、赫夫曼編碼器

設計一個利用赫夫曼算法的編碼和譯碼系統,重複地顯示並處理以下項目,直到選擇退出爲止。 要求:

1) 將權值數據存放在數據文件(文件名爲,位於執行程序的當前目錄中)

2) 初始化:鍵盤輸入字符集大小26、26個字符和26個權值(統計一篇英文文章中26個字母),建立哈夫曼樹;

3) 編碼:利用建好的哈夫曼樹生成哈夫曼編碼;

4) 輸出編碼(首先實現屏幕輸出,然後實現文件輸出); 5) 界面優化設計。

代碼如下:

#include#include#include#include #define N 200

typedef struct HTNode

//結構體 { int Weight;

char ch; int Parent,Lchild,Rchild; }HTNode; typedef char * * HCode;

void Save(int n,HTNode *HT)

//把權值保存到文件 {

FILE * fp;

int i;

if((fp=fopen(“”,“wb”))==NULL)

{

printf(“cannot open filen”);

return;

}

for(i=0;i

if(fwrite(&HT[i]。Weight,sizeof(struct HTNode),1,fp)!=1)

printf(“file write errorn”);

fclose(fp);

system(“cls”);

printf(“保存成功!”);

}

void Create_H(int n,int m,HTNode *HT)

//建立赫夫曼樹,進行編碼 {

int w,k,j; char c; for(k=1;k<=m;k++) {

if(k<=n)

{

printf(“n請輸入權值和字符(用空格隔開): ”);

scanf(“%d”,&w);

scanf(“ %c”,&c); HT[k]。ch=c;

HT[k]。Weight=w;

}

else HT[k]。Weight=0;

HT[k]。Parent=HT[k]。Lchild=HT[k]。Rchild=0; }

int p1,p2,w1,w2;

for(k=n+1;k<=m;k++) {

p1=0;p2=0;

w1=32767;w2=32767;

for(j=1;j<=k-1;j++)

{

if(HT[j]。Parent==0)

{

if(HT[j]。Weight

{

w2=w1;p2=p1;

w1=HT[j]。Weight;

p1=j;

}

else if(HT[j]。Weight

{

w2=HT[j]。Weight;

p2=j;

}

}

} HT[k]。Lchild=p1;HT[k]。Rchild=p2; HT[k]。Weight=HT[p1]。Weight+HT[p2]。Weight;

HT[p1]。Parent=k;HT[p2]。Parent=k;

} printf(“輸入成功!”); }

void Coding_H(int n,HTNode *HT)

//對結點進行譯碼 { int k,sp,fp,p; char *cd; HCode HC;

HC=(HCode)malloc((n+1)*sizeof(char *));

cd=(char *)malloc(n*sizeof(char)); cd[n-1]='';

printf(“************************n”); printf(“Char Codingn”);

for(k=1;k<=n;k++)

{

sp=n-1;p=k;fp=HT[k]。Parent;

for(;fp!=0;p=fp,fp=HT[fp]。Parent)

if(HT[fp]。Lchild==p)

cd[--sp]='0';

else

cd[--sp]='1';

HC[k]=(char *)malloc((n-sp)*sizeof(char));

strcpy(HC[k],&cd[sp]);

printf(“%c

%sn”,HT[k]。ch,HC[k]);

}

printf(“************************n”); free(cd) ; } void Read(int n,HTNode *HT)

//從文件中讀出數據 {

int i; FILE * fp; if((fp=fopen(“”,“rb”))==NULL) {

printf(“cannot open filen”);

exit(0); } for(i=0;i

fread(&HT[i]。Weight,sizeof(struct HTNode),1,fp); // printf(“%d n”,HT[i]。Weight);

} Coding_H(n,HT);

fclose(fp); }

void Print_H(int m,HTNode *HT)

//輸出赫夫曼造樹過程 { int k; printf(“************************n”); printf(“Num Weight

Par LCh RCh n”); for(k=1;k<=m;k++) {

printf(“%d ”,k);

printf(“

%d”,HT[k]。Weight);

printf(“

%d”,HT[k]。Parent);

printf(“

%d”,HT[k]。Lchild);

printf(“

%dn”,HT[k]。Rchild);

} printf(“************************n”); }

void Decode(int m,HTNode *HT)

//對輸入的電文進行譯碼 { int i,j=0; char a[10]; char endflag='2'; i=m; printf(“輸入發送的編碼,以‘2’結束:”); scanf(“%s”,&a); printf(“譯碼後的字符:”); while(a[j]!='2') {

if(a[j]=='0')

i=HT[i]。Lchild;

else i=HT[i]。Rchild;

if(HT[i]。Lchild==0)

//HT[i]是葉結點

{

printf(“%c”,HT[i]。ch);

i=m;

//回到根結點

}

j++; } printf(“n”); if(HT[i]。Lchild!=0&&a[j]!='2')

printf(“ERROR”); }

int main()

//主函數 { int n,m,c; HTNode HT[N]; do {

system(“color 2f”);

//運行環境背景顏色。

printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);

printf(“nttt 赫夫曼編譯碼系統 ttt”);

printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);

printf(“nttt1.輸入權值、字母nttt2.把數據寫入文件nttt3.輸出赫夫曼編碼表nttt”);

printf(“4.輸出赫夫曼譯碼錶nttt5.輸入編碼並譯碼。nttt6.從文件中讀出數據nttt7.退出”);

printf(“nnttt請選擇:”);

scanf(“%d”,&c);

switch(c)

{

case 1:system(“cls”);printf(“輸入多少結點:”);

scanf(“%d”,&n);m=2*n-1;Create_H(n,m,HT);break;

case 2:system(“cls”);Save(n,HT);break;

case 3:system(“cls”);Print_H(m,HT);break;

case 4:system(“cls”);Coding_H(n,HT);break;

case 5:system(“cls”);Decode(m,HT);break;

case 6:system(“cls”);Read(n,HT);break;

case 7:system(“cls”);exit(0);

}

}while(1); return 0; }

運行界面如下:

2、學生成績管理(鏈表實現) 要求:

實現如下功能:增加、查找、刪除、輸出、退出。

代碼如下:

#include#include#includetypedef struct score

//定義成績信息結構體 {

char Number[20]; char Name[20]; char Chinese[20]; char English[20]; char Math[20]; }score; typedef struct node_score

//定義成績信息鏈表結點,包括數據域和指針域 {

score data; struct node_score *next; }node_score,*p_node_score; p_node_score headScore;//定義鏈表的頭指針爲全局變量 void PrintScore(score s) //輸出信息函數 { printf(“ %10s”,er); printf(“ |

%-6s”,); printf(“

|

%-3s”,ese); printf(“

|

%-3s”,ish);

printf(“ |

%-3sn”,); } void View()//輸出函數 {

p_node_score pNodeScore;

pNodeScore=headScore; printf(“

學號

|

姓名

| 語文成績

| 英語成績| 高數成績n”); while(pNodeScore != NULL) {

PrintScore(pNodeScore->data);//輸出學生信息和成績信息

pNodeScore=pNodeScore->next; } } void Add() {

p_node_score pNodeScore; // 定義一個節點

pNodeScore=(p_node_score)malloc(sizeof(node_score));//爲節點分配存儲空間

printf(“請輸入學號:”); scanf(“%s”,pNodeScore->er); printf(“請輸入姓名:”); scanf(“%s”,pNodeScore->); printf(“請輸入語文成績:”); scanf(“%s”,pNodeScore->ese); printf(“請輸入英語成績:”); scanf(“%s”,pNodeScore->ish); printf(“請輸入高數成績:”); scanf(“%s”,pNodeScore->); if(headScore==NULL) { //如果頭結點爲空

headScore=pNodeScore;

pNodeScore->next=NULL; } else

{ //如果頭結點不爲空

pNodeScore->next=headScore;

headScore=pNodeScore;//將頭結點新結點

} } void Input() { int n,i; printf(“輸入幾個學生的數據:”); scanf(“%d”,&n); for(i=0;i

Add(); printf(“輸入成功!”); } int Delete() { p_node_score pNodeScore,p1; //p1爲pNodeScore的前驅

p1=headScore; if(p1==NULL) {

printf(“成績表中沒有數據!請先添加數據!n”);

return 0; } char DeleteNumber[20];

printf(“請數入要刪除的學生學號:”); scanf(“%s”,DeleteNumber); if(strcmp(p1->er,DeleteNumber)==0)

{ //如果要刪除的結點在第一個

headScore=p1->next;

pNodeScore=p1;

printf(“學號爲%s的學生信息已經刪除!n”,DeleteNumber);

return 0; } else

{

pNodeScore=p1->next;

while(pNodeScore!=NULL)

{

if(strcmp(pNodeScore->er,DeleteNumber)==0)

{

p1->next=pNodeScore->next;

printf(“學號爲%s的學生信息已經刪除!n”,DeleteNumber);

return 0;

}

else

{ //否則,結點向下一個,p1仍爲pNodeScore的前驅

p1=pNodeScore;

pNodeScore=pNodeScore->next;

}

} } printf(“沒有此學號的學生!”); } int Change() {

p_node_score pNodeScore;

pNodeScore=headScore; if(pNodeScore==NULL) {

printf(“成績表中沒有數據!請先添加數據!n”);

return 0; } char EditNumber[20]; printf(“請輸入你要修改的學生學號:”); scanf(“%s”,EditNumber); while(pNodeScore!=NULL) {

if(strcmp(pNodeScore->er,EditNumber)==0)

{ //用strcmp比較兩字符串是否相等,相等則返回0

printf(“原來的學生成績信息如下:n”); //輸出原來的成績信息

printf(“

學號

|

姓名

| 語文成績

| 英語成績| 高數成績n”);

PrintScore(pNodeScore->data);

printf(“語文新成績:”);

scanf(“%s”,pNodeScore->ese);

printf(“英語新成績:”);

scanf(“%s”,pNodeScore->;

printf(“高數新成績:”);

scanf(“%s”,pNodeScore->);

printf(“成績已經修改!”);

return 0;

}

pNodeScore=pNodeScore->next; //如果不相等,pNodeScore則指向下一個結點

} printf(“沒有此學號的學生!n”); //如果找到最後都沒有,則輸出沒有此學號的學生

} int Find() {

p_node_score pNodeScore;

pNodeScore=headScore; if(pNodeScore==NULL) {

printf(“成績表中沒有數據!請先添加數據!n”);

return 0; } char FindNumber[20]; printf(“請輸入你要查找的學生學號:”); scanf(“%s”,FindNumber); while(pNodeScore!=NULL) {

if(strcmp(pNodeScore->er,FindNumber)==0)

{

printf(“你要查找的學生成績信息如下:n”);

printf(“

學號

|

姓名

| 語文成績

| 英語成績| 高數成績n”);

PrintScore(pNodeScore->data);

return 0;

}

pNodeScore=pNodeScore->next; } printf(“沒有此學號的學生!n”); } int main()

//主函數 { int choice=0; headScore=NULL; int c; do {

system(“color 2f”);

//運行環境背景顏色。

printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);

printf(“nttt 學生成績管理系統 ttt”);

printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);

printf(“nttt1.輸入成績信息nttt2.輸出成績信息nttt3.添加成績信息nttt”);

printf(“4.修改成績信息nttt5.刪除成績信息nttt6.查詢成績信息nttt7.退出”);

printf(“nnttt請選擇:”);

scanf(“%d”,&c);

switch(c)

{

case 1:system(“cls”);Input();break;

case 2:system(“cls”);View();break;

case 3:system(“cls”);Add();break;

case 4:system(“cls”);Change();break;

case 5:system(“cls”);Delete();break;

case 6:system(“cls”);Find();break;

case 7:system(“cls”);exit(0);

}

}while(1); return 0; }

運行界面如下:

數據結構課程設計心得體會 篇三

本次課程設計所用到的知識完全是上學期的知識,通過這次課程設計,我認識到了我對數據結構這門課的掌握程度。

首先我這個課程設計是關於二叉樹的,由於是剛接觸二叉樹,所以我掌握的長度並不深。在編程之前我把有關於二叉樹的知識有溫習了一遍,還好並沒有忘掉。二叉樹這章節難度中上等,而且內容廣泛,所以我只掌握了百分之六七十。

然後,在編程中我認識到了自己動手能力的不足,雖然相比較大二而言進步很大,但是我還是不滿意,有的在編程中必須看書才能寫出來,有的靠百度,很少是自己寫的。還好,我自己組裝程序的能力還行,要不這東拼西湊的程序根本組裝不了。在編程中我還認識到了,編程不能停下,如果編程的時間少了,知識忘的會很快,而且動手也會很慢。同時,同學之間的合作也很重要,每個人掌握的知識都不一樣,而且掌握程度也不一樣,你不會的別的同學會,所以在大家的共同努力下,編程會變得很容易。在這次編程中,我瞭解到了自己某些方面的不足,比如說鏈表的知識,雖然我能做一些有關於鏈表的編程,但是很慢,沒有別人編程的快,另外,二叉樹和圖的知識最不好掌握,這方面的知識廣泛而複雜。以前,沒動手編程的時候覺得這些知識很容易,現在編程了才發現自己錯了,大錯特錯了,我們這個專業最重視的就是動手編程能力,如果我們紙上寫作能力很強而動手編程能力很差,那我們就白上這個專業了。計算機這個專業就是鍛鍊動手編程能力的,一個人的理論知識再好,沒有動手編程能力,那他只是一個計算機專業的“入門者”。在編程中我們能找到滿足,如果我們自己編程了一個程序,我們會感到自豪,而且充實,因爲如果我們專研一個難得程序,我們會達到忘我的境界,自己完全沉浸在編程的那種樂趣之中,完全會廢寢忘食。編程雖然會乏味很無聊,但是隻要我們沉浸其中,你就會發現裏面的樂趣,遇到難得,你會勇往直前,不寫出來永不罷休;遇到容易的,你會找到樂趣。編程是很乏味,但是那是因爲你沒找到編程重的樂趣,你只看到了他的不好,而沒有看到他的好。其實,只要你找到編程中得樂趣,你就會完全喜歡上他,不編程還好,一編程你就會變成一個兩耳不聞窗外事的“植物人”。可以說只要你涉及到了計算機,你就的會編程,而且還要喜歡上他,永遠和他打交道,我相信在某一天,我們一定會把他當作我們不可或缺的好朋友。

數據結構課程設計心得體會 篇四

本次課程設計,使我對《數據結構》這門課程有了更深入的理解。我的課程設計題目是線索二叉樹的運算。剛開始做這個程序的時候,感到完全無從下手,甚至讓我覺得完成這次程序設計根本就是不可能的,於是開始查閱各種資料以及參考文獻,之後便開始着手寫程序,寫完運行時有很多問題。特別是實現線索二叉樹的刪除運算時很多情況沒有考慮周全,經常運行出現錯誤,但通過同學間的幫助最終基本解決問題。

在本課程設計中,我明白了理論與實際應用相結合的重要性,並提高了自己組織數據及編寫大型程序的能力。培養了基本的、良好的程序設計技能以及合作能力。這次課程設計同樣提高了我的綜合運用所學知識的能力。並對VC有了更深入的瞭解。《數據結構》是一門實踐性很強的課程,上機實習是對學生全面綜合素質進行訓練的一種最基本的方法,是與課堂聽講、自學和練習相輔相成的、必不可少的一個教學環節。上機實習一方面能使書本上的知識變“活”,起到深化理解和靈活掌握教學內容的目的;另一方面,上機實習是對學生軟件設計的綜合能力的訓練,包括問題分析,總體結構設計,程序設計基本技能和技巧的訓練。此外,還有更重要的一點是:機器是比任何教師更嚴厲的檢查者。因此,在“數據結構”的學習過程中,必須嚴格按照老師的要求,主動地、積極地、認真地做好每一個實驗,以不斷提高自己的編程能力與專業素質。

通過這段時間的課程設計,我認識到數據結構是一門比較難的課程。需要多花時間上機練習。這次的程序訓練培養了我實際分析問題、編程和動手能力,使我掌握了程序設計的基本技能,提高了我適應實際,實踐編程的能力。

總的來說,這次課程設計讓我獲益匪淺,對數據結構也有了進一步的理解和認識。

數據結構課程設計心得體會 篇五

通過兩週的課程設計,完成了預定的目標,其中有很多的隨想。老師的題目發下來的很早,大概提前了3周,當時就着手搜索有關線索二叉樹的思想,思路,借了一本《數據結構-c語言描述》,在大體上就有了一個輪廓,先是輸入二叉樹,在對二叉樹進行線索化,依次往下,但在具體實現時,遇到了很多問題:首先是思想的確定,其非常重要,以前有了這個想法,現在愈加清晰起來,因此,花了大量的時間在插入刪除的具體操作設計上,大概三個晚上的時間,對其中什麼不清晰明確之處均加以推敲,效果是顯著的,在上機上相應的節約了時間。

通過具體的實驗編碼,思路是對的,但是在小問題上摔了一次又一次,大部分時間都是花在這方面,這個節點沒傳過來啊之類的,以後應該搞一個小冊子,記錄一些錯誤的集合,以避免再犯,思想與C語言聯繫起來,纔是我們所需要的,即常說的理論與實踐的關係。

數據結構是基礎的一門課,對於有過編程經驗的人,結合自己的編程體會去悟它的思想;而且我覺得隨着編程經歷的豐富對它的體會越深入,最初接觸是對一些思想可能只是生硬的記憶,隨着學習的深入逐漸領悟了很多。看了這次課程設計的題目,雖然具體要求沒有看清,但是總結一下,可以看出,其需要我們能把一個具體案例或一件事情反映爲程序來表達,數據結構就是橋樑,通過自己的設計,使應用能力得以融匯,對與問題,具有了初步的分析,繼而解決之的能力,感覺對以後的學習會有很大的`幫助,學習無非是用於實踐。

認識到自己的不足,希望能有進一步的發展。

數據結構課程設計 篇六

一,課程題目

(算符優先法計算算數表達式)以字符序列的形式從終端輸入語法正確的、不含變量的整數表達式。利用教材表3.1(P53)給出的算符優先關係,實現對於算術四則混合運算(加、減、乘、除)表達式的求值。例如:7+(4-2)*3+12/2=19。注:按照四捨五入的方式將四則運算結果取整。

二,程序設計思想

在程序中分別設立一個運算符棧(OPTR 棧),用於存儲‘+’,‘-’,‘*’,‘/’,‘#’(‘#’用於判斷算術表達式結束),和一個操作數棧(OPND 棧),用於存放整數,輸入算式後,先將數字與運算符分開入i棧,若爲數字則先用轉換函數將char類型的數轉換爲int型並進入操作數棧,若爲運算符則根據教材表3.1(P53)給出的算符優先級關係,判斷棧頂運算符和從鍵盤取得的運算符作優先級比較,若取得的運算符優先級高則進棧,直到取得運算符優先級低的,則將操作數取出作operate運算後存入棧頂,反覆操作知道遇到‘#’,則結束運算,輸出棧頂元素即爲結果。 三,程序流程圖

四,程序關鍵代碼設計

本次程序設計共調用了12個方法分別是:

InitNumStack,ParseInt,PushNum,PopNum ,InitCalStack,PopCal ,PushCal,In,GetTopCal,GetTopNum,Preced,Operate。 其中

ParseInt方法

int ParseInt(char c[]){ int number[5],i; for(i=0;i<5;i++){

number[i]=(int)(c[i])-48; } i=10000*number[0]+1000*number[1]+100*number[2]+10 *number[3]+number[4]; return i; } 爲將輸入的數字字符型轉換爲整型的轉換函數,通過Ascall表的轉換關係,將輸入的字符型數字轉換爲整型。在入棧前進行此方法,以便整型數的計算。 Preced,Operate函數

char Preced(char a , char b){ char c[7]={'+','-','*','/','(',')','#'}; char d[7][7]={ {'>','>','<','<','','>'}, {'>','>','<','<','','>'}, {'>','>','>','>','','>'}, {'>','>','>','>','','>'}, {'<','<','<','<','','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='}, }; int Operate (int a,char theta,int b){ int c ; if (theta=='+'){

c=a+b; return c; } if (theta=='-'){

c=a-b; return c; } if (theta=='*'){

c=a*b; return c; } if (theta=='/'){

c=a/b; return c; } return 0; } 其中preced是判定運算符棧的棧頂運算符C1與讀入的運算符C2之間優先關係函數;Opearte爲進行二元運算aCb的函數,如果是編譯表達式,則產生這個運算的一組相應的指令並返回存放結果的中間變量名;如果是解釋執行表達式,則直接進行該運算,並返回運算結果。 五,程序源代碼以及運行結果

#include#include #includetypedef struct{ int *base; int *top; int Stacksize; }SqlNum; void InitNumStack(SqlNum &S){ =(int *)malloc(100*sizeof(int)); =; ksize=100; } int ParseInt(char c[]){ int number[5],i; for(i=0;i<5;i++){

number[i]=(int)(c[i])-48; } i=10000*number[0]+1000*number[1]+100*number[2]+10*number[3]+number[4]; return i; } void PushNum(SqlNum &S,int c){ *=c; ++; } int PopNum(SqlNum &S){ int c; --; c=*; return c; } typedef struct{ char *base; char *top; int Stacksize; }SqlCal; void InitCalStack(SqlCal &S){ =(char *)malloc(100*sizeof(char)); =; ksize=100; } void PushCal(SqlCal &S,char c){ *=c; ++; } char PopCal(SqlCal &S){ char c; --; c=*; return c; }

int In(char c,char s[]){ int i; for(i=0;i

if(c==s[i])

return 1;

return 0; }

char GetTopCal(SqlCal &s){ char c; c=*(-1); return c; } int GetTopNum(SqlNum &s){ int c; c=*(-1); return c; } char Preced(char a , char b){ char c[7]={'+','-','*','/','(',')','#'}; char d[7][7]={ {'>','>','<','<','','>'}, {'>','>','<','<','','>'}, {'>','>','>','>','','>'}, {'>','>','>','>','','>'}, {'<','<','<','<','','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='}, }; if(a=='+'){

if(b=='+'){

return d[0][0];}

if(b=='-'){

return d[0][1];}

if(b=='*'){

return d[0][2];}

if(b=='/'){

return d[0][3];}

if(b=='('){

return d[0][4];}

if(b==')'){

return d[0][5];}

if(b=='#'){

return d[0][6];} } if(a=='-'){

if(b=='+'){

return d[1][0];}

if(b=='-'){

return d[1][1];}

if(b=='*'){

return d[1][2];}

if(b=='/'){

return d[1][3];}

if(b=='('){

return d[1][4];}

if(b==')'){

return d[1][5];}

if(b=='#'){

return d[1][6];} } if(a=='*'){

if(b=='+'){

return d[2][0];}

if(b=='-'){

return d[2][1];}

if(b=='*'){

return d[2][2];}

if(b=='/'){

return d[2][3];}

if(b=='('){

return d[2][4];}

if(b==')'){

return d[2][5];}

if(b=='#'){

return d[2][6];} } if(a=='/'){

if(b=='+'){

return d[3][0];}

if(b=='-'){

return d[3][1];}

if(b=='*'){

return d[3][2];}

if(b=='/'){

return d[3][3];}

if(b=='('){

return d[3][4];}

if(b==')'){

return d[3][5];}

if(b=='#'){

return d[3][6];} } if(a=='('){

if(b=='+'){

return d[4][0];}

if(b=='-'){

return d[4][1];}

if(b=='*'){

return d[4][2];}

if(b=='/'){

return d[4][3];}

if(b=='('){

return d[4][4];}

if(b==')'){

return d[4][5];}

if(b=='#'){

return d[4][6];} } if(a==')'){

if(b=='+'){

return d[5][0];}

if(b=='-'){

return d[5][1];}

if(b=='*'){

return d[5][2];}

if(b=='/'){

return d[5][3];}

if(b=='('){

return d[5][4];}

if(b==')'){

return d[5][5];}

if(b=='#'){

return d[5][6];} } if(a=='#'){

if(b=='+'){

return d[6][0];}

if(b=='-'){

return d[6][1];}

if(b=='*'){

return d[6][2];}

if(b=='/'){

return d[6][3];}

if(b=='('){

return d[6][4];}

if(b==')'){

return d[6][5];}

if(b=='#'){

return d[6][6];} } return 0; } int Operate (int a,char theta,int b){ int c ; if (theta=='+'){

c=a+b; return c; } if (theta=='-'){

c=a-b; return c; } if (theta=='*'){

c=a*b; return c; } if (theta=='/'){

c=a/b; return c; } return 0; } void main(){ SqlCal OPTR; SqlNum OPND; char c,d[5]={'0','0','0','0','0'}; int f=0; char op[]={'+','-','*','/','(',')','#'}; InitCalStack(OPTR); InitNumStack(OPND); printf(“請輸入算式並在尾部添加一個#號n”); c=getchar(); PushCal(OPTR,'#'); while(c!='#'||GetTopCal(OPTR)!='#') { if (!In(c,op))

{

d[0]=d[1];

d[1]=d[2];

d[2]=d[3];

d[3]=d[4];

d[4]=c;

c=getchar(); f=1;

}

else

{

if(f==1){

PushNum(OPND,ParseInt(d));

d[0]='0';d[1]='0';d[2]='0';d[3]='0';d[4]='0';

f=0;

}

switch(Preced(GetTopCal(OPTR),c))

{

case'<':

PushCal(OPTR,c);

c=getchar();

break;

case'=':

PopCal(OPTR);

c=getchar();

break;

case'>':

char theta;int a;int b;

theta=PopCal(OPTR);

b=PopNum(OPND);

a=PopNum(OPND);

PushNum(OPND,Operate(a,theta,b));

break;

}

} } printf(“%dn”,GetTopNum(OPND)); }

程序運行結果: 六,心得體會

通過這次編程,我發現很多編程過程中的不足與問題,很多問題由於考慮不全面,導致程序運行失敗。還有一些小問題,比如字母的大小寫,括號的遺漏,語法書寫錯誤等等一些基礎錯誤,也是讓我體會很深寫程序要謹慎仔細。

數據結構課程設計心得體會 篇七

通過本次課程設計,對圖的概念有了一個新的認識,在學習離散數學的時候,總覺得圖是很抽象的東西,但是在學習了《數據結構與算法》這門課程之後,我慢慢地體會到了其中的奧妙,圖能夠在計算機中存在,首先要捕捉他有哪些具體化、數字化的信息,比如說權值、頂點個數等,這也就說明了想要把生活中的信息轉化到計算機中必須用數字來完整的構成一個信息庫,而圖的存在,又涉及到了頂點之間的聯繫。圖分爲有向圖和無向圖,而無向圖又是有向圖在權值雙向相等下的一種特例,如何能在計算機中表示一個雙向權值不同的圖,這就是一件很巧妙的事情,經過了思考和老師同學的幫助,我用edges[i][j]=up和edges[j][i]=up就能實現了一個雙向圖信息的存儲。對整個程序而言,Dijkstra算法始終都是核心內容,其實這個算法在實際思考中並不難,也許我們誰都知道找一個路徑最短的方法,及從頂點一步一步找最近的路線並與其直接距離相比較,但是,在計算機中實現這麼一個很簡單的想法就需要涉及到很多專業知識,爲了完成設計,在前期工作中,基本都是以學習C語言爲主,所以浪費了很多時間,比如說在程序中,刪除頂點和增加頂點的模塊中都有和建圖模塊相互重複的函數,但是由於技術的原因,只能做一些很累贅的函數,可見在調用知識點,我沒有掌握好。不過,有了這次課程設計的經驗和教訓,我能夠很清楚的對自己定一個合適的水平,而且在這次課程設計中我學會了運用兩個新的函數sprintf和包涵在#include頭文件中的輸入函數。因爲課程設計的題目是求最短路徑,本來是想通過算法的實現把這個程序與交通情況相連,但是因爲來不及查找各地的信息,所以,這個計劃就沒有實現,我相信在以後有更長時間的情況下,我會做出來的。