前言:本站為你精心整理了數據結構課程設計心得體會范文,希望能為你的創作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。
一、課程設計目的
數據結構是計算機科學的基礎理論知識,也是軟件設計的技術基礎。本課程設計的性質是檢驗理論科學系的效果以及綜合運用的能力,目的是訓練學生進行復雜程序設計的技能和培養良好的程序設計習慣。本課程設計的任務是要求學生使用C或C++語言編程,解決具有一定規模的、具有實際意義的應用題,實現理論課所要求的數據組織、存儲、處理的基本方法。
二、課程設計所用到的工具
這次課程設計所用到的工具Microsoftvisualc++6.0PC機一臺。
三、這次課程設計我所選擇的兩個題目
1、一元多項式計算。
2、文章編輯器。
設計分析
一)一元多項式計算
1、需求分析
要求按照指數將序排列建立并輸出多項式;能夠完成兩個多項式的相加、相減,并將結果輸入。
2、概要設計
在分析題目要求的基礎上,我首先設計了一個結構體,定義如下:
structpoly
{floatcoef;
intexp;
polytypenext;};
在這個結構體中,定義了一個浮點型的系數coef,還定義了一個整形的指針exp。接下來要做的就是定義各個不同用途的函數,以滿足課程設計的需要,所用到的函數定義如下:
polytypeCreate_Empty_Node(int);創建一個空鏈表
voidInput_Values(polytype,int);輸入值
voidInsert_Node(polytype,float,int);插入接點
voidAdd_Poly(polytype,polytype);將兩個多項式相加
voidSub_Poly(polytype,polytype);將兩個多項式相減
voidOutPut_Results(polytype);將結果在顯示器上顯示
3、源代碼
#include"stdio.h"
#include"stdlib.h"
typedefintdatatype;/*定義多項式節點的結構*/
typedefstructnode
{floatcoef;/*系數*/
intexpn;/*指數*/
structnode*next;/*指向結構體的指針*/
}PotyNode;/*建立連表,返回指向多項式頭節點的指針*/
PotyNode*Creat_PotyNodeTail()
{PotyNode*L,*s,*r;/*聲明結構體指針*/
floatc;/*系數*/
inte;/*指數,建立頭節點,頭節點指針設置為空*/
L=(PotyNode*)malloc(sizeof(PotyNode));
L->next=NULL;/*是指針r指向頭節點*/
r=L;
printf("\ninputcoefandexpn:");
scanf("%f%d",&c,&e);
while(c!=0)/*輸入的第一項系數不允許為0,防止無意義的輸入*/
{/*初始化節點*/
s=(PotyNode*)malloc(sizeof(PotyNode));s->coef=c;s->expn=e;s->next=NULL;
r->next=s;/*連接節點*/
r=s;/*指針r指向當前節點,用于連接下一節點*/
printf("\ncoefandexpn:");
scanf("%f%d",&c,&e);
}returnL;
}/*獲得多項式的長度,參數為多項式頭節點指針*/
intGetlength(PotyNode*L)
{PotyNode*p;intcount=0;p=L->next;
while(p)
{count++;p=p->next;}
returncount;}/*獲得指向i節點的指針,在刪除節點的時候來獲得準備刪除的前一節點*/
PotyNode*GetElem_PotyNode(PotyNode*L,inti)
{PotyNode*p;intj=0;p=L;
while(p->next&&j!=i)/*當p不是尾節點,并且不是第i個節點*/
{j++;p=p->next;}
if(i==j)
returnp;/*找到節點*/
else
returnNULL;/*沒有找到節點*/}/*刪除節點i*/
intDelete_PotyNode(PotyNode*L,inti)
{PotyNode*q,*p;/*獲得節點i的前一個節點,便于刪除節點i*/
p=GetElem_PotyNode(L,i-1);q=p->next;
if(q)/*如果P為空,則說明節點p也就是節點i-1就是尾節點,節點i實際并不存在*/
{p->next=q->next;
free(q);return1;}
else
return0;}/*對輸入的多項式LA,LB進行相加,結果為LC,返回指向LC頭節點的指針*/
PotyNode*Add_PotyNode(PotyNode*LA,PotyNode*LB)
{PotyNode*LC,*q1,*q2,*r,*s,*p;
intx=1;q1=LA->next;q2=LB->next;LC=LA;
LC->next=NULL;/*指針r是當前指針便于進行各種操作*/
r=LC;
while(q1&&q2)/*當多項式LA,和LB都沒有結束的時候*/
{if(q1->expn<q2->expn)
{s=q1;q1=q1->next;}
elseif(q1->expn>q2->expn)
{s=q2;q2=q2->next;}/*指數相同,相加*/
else{q1->coef+=q2->coef;
s=q1;q1=q1->next;q2=q2->next;}/*結果連接到多項式LC*/
s->next=NULL;r->next=s;r=s;}/*如果LB已結束,把LA剩余的部分連接到LC上*/
if(q1)r->next=q1;
if(q2)r->next=q2;/*去除多項式中系數為零的項,我對代碼作了小的修改*/
p=LC->next;
while(p->next)
{if(p->coef==0)
{p=p->next;
Delete_PotyNode(LC,x);}
else
{p=p->next;x++;}}
returnLC;}/*打印多項式*/
voidprint_PotyNode(PotyNode*L)
{inti;PotyNode*p=L->next;
for(i=0;i<Getlength(L);i++)
{printf("%fX%d",p->coef,p->expn);
if(p->next==NULL)
return;
elseprintf("+");
p=p->next;}}
voidmain()
{PotyNode*LA,*LB,*LC;
intx;
printf("inputLA(endby0):\n");
LA=Creat_PotyNodeTail();
printf("f(LA)=");
print_PotyNode(LA);
printf("\ninputLB(endby0):\n");
LB=Creat_PotyNodeTail();
printf("\n");
printf("f(LB)=");
print_PotyNode(LB);
printf("\n");
LC=Add_PotyNode(LA,LB);
printf("Afteraddf(LA)andf(LB),f(LC)is:");
print_PotyNode(LC);
scanf("%d",&x);}
3、運行結果
提示輸入一個多項式LA(以0結束)然后輸入每項的系數和指數,輸入后再提示輸入另一個多項式LB(以0結束)然后輸入每項的系數和指數。按回車鍵后得出f<LC>=f<LA>+f<LB>。
二)文章編輯器
1、需求分析
1)輸入數據的形式和范圍:可以輸入大寫、小寫的英文字母、任何數字及標點符號。
2)輸出形式:(1)分行輸出用戶輸入的各行字符;(2)分4行輸出“全部字母數”、
“數字個數”、“空格個數”、“文章總字數”(3)輸出刪除某一字符串后的文章
2、概要設計
a、建立文本,存儲結構用鏈表
voidCreateTXT(LINE*&head){
printf("\n請輸入文本,每行最多輸入80字符!\n");
printf("輸入Ctrl+E(^E)則結束輸入\n");
LINE*p=newLINE;//首先為鏈表建立一個附加表頭結點
head=p;//將p付給表頭指針
chartmp[80];
b、計算空格數
intCount_Space(LINE*&head){//統計空格數
LINE*p=head;
intasc_space=32;//空格的ASCIC碼值
intcount=0;
do
{intLen=strlen(p->data);//計算當前data里的數據元素的個數
for(inti=0;i<Len;i++)
if(p->data[i]==asc_space)count++;}//計算空格數
while((p=p->next)!=NULL);//遍歷鏈表
returncount;}
c、統計數字數
intCount_Num(LINE*&head){//統計數字數
LINE*p=head;
intcount=0;
do
{intLen=strlen(p->data);//計算當前data里的數據元素的個數
for(inti=0;i<Len;i++)
if(p->data[i]>=48&&p->data[i]<=57)count++;}//計算空格數
while((p=p->next)!=NULL);//遍歷鏈表
returncount;}
d、統計文章的總字數
intCount_All_Word(LINE*&head){//統計文章的總字數
LINE*p=head;//保存鏈表的首地址
intcount=0;//總字母數
do
{count+=strlen(p->data);}//計算當前行內的字符數!除''''\0''''結束符外!注意,該統計包含“空格的長度!”
while((p=p->next)!=NULL);//遍歷鏈表
returncount;}
3、源代碼
/*definemacrovariables*/
#definetrue1
#definefalse0
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<conio.h>
#defineSTACK_INIT_SIZE100/*variablesinthesavestoragespace*/
#defineSTACKINCREMENT10/*incrementofdistributioninthesavestoragespace*/
typedefstruct
{char*base;/*beforeandafterthecreatingoftheshed,baseisNULL*/
char*top;/*shedpointer*/
intstacksize;/*thesavestoragespacedistributivebytheelement*/
}SqStack;
SqStackS,q;
/*constructastructuerarray*/
typedefstruct{
charcc[9999];
intno;}Array;
/*definethewholebureauvarible*/
Arraya[10000];
intm,n,i,j;
charname[40];
chart=''''\n'''';
FILE*fp;
/*constructanemputyshed*/
voidInitStack()
{S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(S.base==NULL)
exit(1);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;}
/*usingcharactershed,acceptthedatafromtheterminal*/
voidpush(chare)
{if(S.top-S.base>=S.stacksize)
{/*applyanewroom*/
S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)
exit(1);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;}
/*acceptthenextcharacter*/
*S.top++=e;}
/*carrythewholedatainthestackintothedatasection*/
charpop()
{chare;
if(S.top==S.base)
returnfalse;
e=*(--S.top);
returne;}
/*emptythedatainthestack*/
voidClearStack()
{S.top=S.base;/*letS.topandS.basepointtothesameplace*/}
/*destroythestack*/
voidDestroyStack()
{free(S.base);/*freethedatainthestack*/
S.top=S.base;}
/*judgetheemputyoftheshed*/
intStackEmpty()
{if(S.top==S.base)
returntrue;
returnfalse;}
/*takeoutthedatafromthestackandtheputinthestucterarray*/
voidBuffer(){
n=0;m=1;
/*movethedataintheshadeuntillthestackisempty*/
while(S.top!=S.base)
{n=n+1;
a[m].no=a[m].no+1;
a[m].cc[n]=*(S.top-1);
S.top--;}}
/*savethedata*/
voidsave()
{printf("\n\nfilename:");
scanf("%s",&name);
fp=fopen(name,"wb");
for(i=1;i<=m;i++)
{for(j=a[i].no;j>=1;j--)
{fwrite(&(a[i].cc[j]),1,1,fp);}
fwrite(&t,1,1,fp);}
fclose(fp);}
/*mainfunction*/
voidmain()
{charch,e;
printf("\n\n\n\t\t\twelcometousethewholescreeneditor");
printf("\n\npressF6ifyouwanttosavethefile,youcansavethefilewhenyousee\"^Z\"\n");
printf("\n******************************************************************************\n\n");/*SqStackS_stack,D_stack;*/
InitStack();/*InitStack(D_stack);*/
ch=getchar();
while(ch!=EOF)
{while(ch!=EOF&&ch!=''''\n'''')
{switch(ch)
{case''''#'''':e=pop();break;
case''''@'''':ClearStack();break;
default:push(ch);break;}
ch=getchar();}
Buffer();
ClearStack();
if(ch!=EOF)
ch=getchar();}
save();
DestroyStack();}
4、運行結果
三、這次課程設計的心得體會
通過實習我的收獲如下
1、鞏固和加深了對數據結構的理解,提高綜合運用本課程所學知識的能力。
2、培養了我選用參考書,查閱手冊及文獻資料的能力。培養獨立思考,深入研究,分析問題、解決問題的能力。
3、通過實際編譯系統的分析設計、編程調試,掌握應用軟件的分析方法和工程設計方法。
4、通過課程設計,培養了我嚴肅認真的工作作風,逐步建立正確的生產觀念、經濟觀念和全局觀念。
根據我在實習中遇到得問題,我將在以后的學習過程中注意以下幾點:
1、認真上好專業實驗課,多在實踐中鍛煉自己。
2、寫程序的過程中要考慮周到,嚴密。
3、在做設計的時候要有信心,有耐心,切勿浮躁。
4、認真的學習課本知識,掌握課本中的知識點,并在此基礎上學會靈活運用。
5、在課余時間里多寫程序,熟練掌握在調試程序的過程中所遇到的常見錯誤,以便能節省調試程序的時間。