数据结构课程设计.docx
- 文档编号:25212031
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:47
- 大小:68.16KB
数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(47页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
数据结构课程设计
----个人设计报告
院系:
信息工程学院
班级:
姓名
学号:
指导教师:
杨
日期:
2013年1月11号
1课程设计目的
1、学习获取知识的方法;
2、提高发现问题、分析问题和解决实际问题的能力;
3、加强创新意识和创新精神;
4、掌握面向实际背景思考问题的方法。
2设计报告
2.1单链表
2.1.1设计内容及要求
本程序用c语言编写,完成单链表的建立、插入、查询、删除、遍历。
2.1.2详细代码
#include
#include
#definelensizeof(structnode)
structnode{//定义单链表结构体
intdata;
structnode*next;};
intn=0;//建立结点的个数
voidfine(){//界面函数
printf("----单链表操作----\n");
printf("1.单链表的删除\n");
printf("2.单链表的插入\n");
printf("3.单链表的查找\n");}
voidprint(structnode*head){//单链表的遍历输出
structnode*p;
p=head;
if(head!
=NULL)
do{printf("%d,",p->data);
p=p->next;}while(p!
=NULL);}
structnode*creat(void){//单链表的建立
structnode*head,*p1,*p2;
inti;
p1=p2=(structnode*)malloc(len);
head=NULL;
scanf("%d",&p1->data);
while(p1->data!
=0){
n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(structnode*)malloc(len);
scanf("%d",&p1->data);}
p2->next=NULL;
returnhead;}
structnode*search(structnode*head,intx){//单链表的查找
structnode*s;inti=1;
s=head;
if(s->next!
=NULL){
while(s!
=NULL){if(s->data==x)
printf("x在链表中的位置:
%d\n",i);
s=s->next;
i=i+1;}}
else
printf("找不到要查找的数据\n");
returnNULL;}
structnode*insert(structnode*head,intx,inti){//单链表的插入
structnode*p0,*p1;
intj=0;
p1=head;
while(p1&&j
++j;}
if(!
p1||j>i-1){printf("不合法\n");
printf("请重新输入\n");
printf("\n输入要插入的数据和位置:
");
scanf("%d%d",&x,&i);
insert(head,x,i);}
p0=(structnode*)malloc(len);
p0->data=x;
if(i==1){head=p0;
p0->next=p1;}
else{p0->next=p1->next;
p1->next=p0;}
n=n+1;
printf("插入元素后表如下:
");
print(head);
returnhead;}
structnode*del(structnode*head,intnum){//单链表的删除
structnode*p1,*p2;
if(head==NULL){printf("\n链表为空\n");
returnhead;}
p1=head;
while(num!
=p1->data&&p1->next!
=NULL){p2=p1;
p1=p1->next;}
if(num==p1->data){if(p1==head)
head=p1->next;
else
p2->next=p1->next;
n=n-1;
printf("删除数据后表如下:
");
print(head);}
else
printf("找不到%d\n",num);
returnhead;}
structnode*menue(structnode*head,intm){//测试函数
intdel_num;//要删除的数据
intx;//要插入的数据
inti;//要插入的数据的位置
intn;
inta;//要查找的数据
if(m==1){printf("\n输入要删除的数据:
");
scanf("%d",&del_num);
while(del_num!
='#'){
head=del(head,del_num);
printf("\n");
printf("\n");
printf("是否继续删除:
");
printf("1.是2.否,返回主界面\n");
printf("请选择:
");
scanf("%d",&n);
if(n==1){printf("\n输入要删除的数据:
");
scanf("%d",&del_num);}
elseif(n==2){
printf("\n");
fine();
printf("请选择:
");
scanf("%d",&n);
menue(head,n);}}
printf("\n");}
elseif(m==2){printf("\n输入要插入的数据和要插入的位置:
");
scanf("%d%d",&x,&i);
while(x!
='#'){
head=insert(head,x,i);
printf("\n");
printf("\n");
printf("是否继续插入:
");
printf("1.是2.否,返回主界面\n");
printf("请选择:
");
scanf("%d",&n);
if(n==1){printf("\n输入要插入的数据和位置:
");
scanf("%d%d",&x,&i);}
elseif(n==2){
printf("\n");
fine();
printf("请选择:
");
scanf("%d",&n);
menue(head,n);}}
printf("\n");}
elseif(m==3){printf("\n输入要查找的数据:
");
scanf("%d",&a);
while(a!
=0){search(head,a);
printf("\n");
printf("\n");
printf("是否继查找:
");
printf("1.是2.否,返回主界面\n");
printf("请选择:
");
scanf("%d",&n);
if(n==1){printf("\n输入要查找的数据:
");
scanf("%d",&a);}
elseif(n==2){printf("\n");
fine();
printf("请选择:
");
scanf("%d",&n);
menue(head,n);}}}
else{printf("输入错误,请重新输入\n");
scanf("%d",&n);
menue(head,n);}}
intmain(){structnode*head;//建立head为头的头结点
intm;
printf("单链表的建立\n");
head=creat();//建立单链表
printf("操作成功表如下:
");
printf("\n");
print(head);
printf("\n");
printf("\n");
fine();
printf("请选择:
");
scanf("%d",&m);
menue(head,m);}
2.1.3测试结果与分析
输入0时结束输入
2.2顺序栈
2.2.1设计内容及要求
本程序用c语言编写,完成顺序栈的建立、入栈,出栈操作。
2.2.2详细代码
#include
#include
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefcharType;
typedefstruct{Type*base;
Type*top;
intstacksize;}SqStack;
voidshow(){//界面函数
printf("----$栈的操作$----\n");
printf("1.入栈操作\n");
printf("2.出栈操作\n");}
voidDispStack(SqStack*S){//从栈顶到栈底输出元素
inti;
if(S->top==S->base)
printf("空栈!
");
for(i=S->top-S->base;i>0;i--)
printf("%c",S->base[i-1]);
printf("\n");}
intInitStack(SqStack*S){//栈的建立
S->base=(Type*)malloc(STACK_INIT_SIZE*sizeof(Type));
if(!
S->base)
return0;
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
return1;}
intGetTop(SqStack*S,Type&e){
if(S->top==S->base)
return0;
e=*(S->top-1);return1;}
voidPush(SqStack*S,Typee){//入栈操作
if(S->top-S->base>=S->stacksize){
S->base=(Type*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(Type));
if(!
S->base)
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;}
*S->top++=e;}
intPop(SqStack&S){//出栈操作
Typee;
if(S.top==S.base)
return0;
e=*--S.top;
printf("出栈元素为:
");
printf("%c",e);
printf("\n");
return1;}
voidtest(SqStack*S,inta){//测试函数
Typex;//要入栈的数据
intn;
if(a==1){printf("\n输入要入栈的数据:
");
scanf("%c",&x);
while(x!
='#'){Push(S,x);
DispStack(S);
printf("\n");
printf("是否继续入栈:
");
printf("1.是2.否,返回主界面\n");
printf("请选择:
");
scanf("%d",&n);
if(n==1){printf("\n输入要入栈的数据:
");
scanf("%d",&x);}
elseif(n==2){printf("\n");
show();
printf("请选择:
");
scanf("%d",&n);
test(S,n);}}
printf("\n");}}
intmain(){Typee,x;
intm;
SqStack*S;
InitStack(S);
printf("栈的建立:
\n");
scanf("%c",&x);
Push(S,x);
while(x!
='\n'){scanf("%c",&x);
Push(S,x);}
printf("栈S如下:
");
DispStack(S);
show();
printf("请选择:
");
scanf("%d",&m);
printf("\n");
test(S,m);}
2.2.3测试结果与分析
2.3栈实现行编辑
2.3.1设计内容及要求
本程序用c语言编写,要栈实现行编辑。
2.3.2详细代码
#ifndefSTACKH_H_INCLUDED
#defineSTACKH_H_INCLUDED
#include
#include
#defineSTACK_INIT_SIZE10
#defineSTACK_INCR_SIZE3
typedefcharElemType;
typedefstruct{ElemType*sbase;
ElemType*stop;
intstacksize;}STACK;
intInitStack(STACK*s);
intDestroyStack(STACK*s);
intIsEmpty(STACK*s);
intClearStack(STACK*s);
intGetTop(STACK*s,ElemType*e);
intGetLength(STACK*s);
intPush(STACK*s,ElemTypee);
intPop(STACK*s,ElemType*e);
intTraverseStack(STACK*s);
intStackToFile(STACK*s);
intLineEditor();
<栈实现行编辑.cpp>
#include"stackh.h"
#include
intInitStack(STACK*s){s->sbase=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!
s->sbase){printf("OVERFLOW!
\n");
exit
(1);}
s->stop=s->sbase;
s->stacksize=STACK_INIT_SIZE;
return0;}
intDestroyStack(STACK*s){free(s->sbase);
s->sbase=NULL;
s->stop=NULL;
s->stacksize=0;
return0;}
intClearStack(STACK*s){s->stop=s->sbase;
return0;}
intIsEmpty(STACK*s){if(s->sbase==s->stop)
{return1;}
else{return0;}}
intGetTop(STACK*s,ElemType*e){if(s->sbase==s->stop){
printf("OVERFLOW!
\n");
exit
(1);}
e=s->stop-1;
return0;}
intGetLength(STACK*s){
returns->stop-s->sbase;}
intPush(STACK*s,ElemTypee){
if(GetLength(s)>=s->stacksize){s->sbase=(ElemType*)realloc(s->sbase,(s->stacksize+
STACK_INCR_SIZE)*sizeof(ElemType));
if(!
s->sbase){printf("OVERFLOW!
\n");}
s->stop=s->sbase+s->stacksize;
s->stacksize+=STACK_INCR_SIZE;}
*s->stop++=e;
return0;}
intPop(STACK*s,ElemType*e){
if(IsEmpty(s)){printf("OVERFLOW!
\n");
exit
(1);}
*e=*--s->stop;
return0;}
intTraverseStack(STACK*s){if(s->sbase==s->stop){
printf("OVERFLOW!
\n");
exit
(1);}
ElemType*p=s->sbase;
while(p!
=s->stop){printf("%c",*p++);}
printf("\n");
return0;}
intStackToFile(STACK*s){FILE*fp=fopen("f:
//www.txt","a+");
fwrite(s->sbase,sizeof(ElemType),GetLength(s),fp);
fclose(fp);
return0;}
#include"stackh.h"//实现行编辑器
voidshow()
{printf("**********************************行编辑器**************************************");
printf("\n");
printf("=========================帮助===================================================");
printf("\t1.想清除单字符时字符后输入'#'以清除此字符\n");
printf("\t2.想清楚整行时在行后面尾输入'@'以清除整行\n");
printf("\t3.想要清除输入的所有字符请输入'^'进行清屏\n");
printf("================================================================================");
printf("\n");
printf("********************************以下进行编辑************************************\n");}
intLineEditor(){charch;
STACKsline;
InitStack(&sline);
while((ch=getchar())!
=EOF){switch(ch){
case'#':
if(IsEmpty(&sline)){
printf("ERROR!
\n");
printf("-------------------请重新输入-----------------\n");
LineEditor();}
chartm;
Pop(&sline,&tm);
if(tm=='\\'){Push(&sline,ch);}
break;
case'@':
if(IsEmpty(&sline)){printf("ERROR!
\n");
printf("-------------------请重新输入-------------------\n");
LineEditor();}
chartmp;
Pop(&sline,&tmp);
if(tmp=='\\'){Push(&sline,ch);}
else{ClearStack(&sline);}
break;
case'\n':
Push(&sline,ch);
TraverseStack(&sline);
StackToFile(&sline);
ClearStack(&sline);
break;
case'^':
system("cls");
ClearStack(&sline);
show();
break;
default:
Push(&sline,ch);
break;}}return0;
}#include"stackh.h"intmain(){show();LineEditor()return0;}
2.3.3测试结果与分析
2.4迷宫求解
2.4.1设计内容及要求
本程序用c语言编写,用栈显示迷宫,找到从出口到入口的所有路径。
2.4.2详细代码
#include
#include
intmaze[100][100];
intM,N;//输入迷宫的行数列数
intp=0,y=0;
intstartI,startJ;//入口坐标
intendI,endJ;//出口坐标
intvisit(inti,intj){intm,n;
maze[i][j]=8;//该点走过,标记为8
//走到终点,成功,打印路径
if(i==endI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计