首页 > 文章中心 > 正文

数据结构课程设计心得体会

数据结构课程设计心得体会

一、课程设计目的

数据结构是计算机科学的基础理论知识,也是软件设计的技术基础。本课程设计的性质是检验理论科学系的效果以及综合运用的能力,目的是训练学生进行复杂程序设计的技能和培养良好的程序设计习惯。本课程设计的任务是要求学生使用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、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。