数据结构实验六 数据结构课程设计 数据结构算法演示系统.docx

上传人:b****6 文档编号:8660225 上传时间:2023-02-01 格式:DOCX 页数:47 大小:199.33KB
下载 相关 举报
数据结构实验六 数据结构课程设计 数据结构算法演示系统.docx_第1页
第1页 / 共47页
数据结构实验六 数据结构课程设计 数据结构算法演示系统.docx_第2页
第2页 / 共47页
数据结构实验六 数据结构课程设计 数据结构算法演示系统.docx_第3页
第3页 / 共47页
数据结构实验六 数据结构课程设计 数据结构算法演示系统.docx_第4页
第4页 / 共47页
数据结构实验六 数据结构课程设计 数据结构算法演示系统.docx_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

数据结构实验六 数据结构课程设计 数据结构算法演示系统.docx

《数据结构实验六 数据结构课程设计 数据结构算法演示系统.docx》由会员分享,可在线阅读,更多相关《数据结构实验六 数据结构课程设计 数据结构算法演示系统.docx(47页珍藏版)》请在冰豆网上搜索。

数据结构实验六 数据结构课程设计 数据结构算法演示系统.docx

数据结构实验六数据结构课程设计数据结构算法演示系统

数据结构实验报告

 

实验六

数据结构课程设计

 

实验题目:

数据结构算法演示系统

专业班级:

网络工程1002班

组长:

王星(2010100230)

组员:

郭坤铭(2010100243)

张磊(2010100244)

 

2012年5月25日

实验报告

实验类型__综合__实验室_软件实验室二__

一、实验题目

数据结构算法演示系统

二、实验目的和要求

1、掌握数据结构中的基本算法

2、掌握线性结构(如顺序表、链表)的基本操作,如建立、插入、删除、查找等。

3、掌握非线性结构(如二叉树,图)的基本操作,如建立、查找、删除、遍历,求值等

三、需求分析

本演示程序用vc6.0编写,完成以下内容:

顺序表、链表的插入、删除、查找,求长度等。

在二叉树中实现遍历,显示,求数的深度和叶子结点数。

在图中,要求建立邻接表,并输出;计算和输出顶点的度;采用邻接表存储实现无向图的深度、广度优先遍历;输出其拓扑排序和采用邻接矩阵存储实现无向图的最小生成树的PRIM算法

四、详细设计

#include

#include

#include

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASIBLE-1

#defineOVERFLOW-2

#defineLIST_INIT_SIZE50

#defineLISTINCREMENT10

typedefintStatus;

typedefintElemType;

typedefstruct

{ElemType*elem;

intlength;

intlistsize;

}SqList;

typedefstructlink{

intdata;

structlink*next;

}link,*linklist;

StatusInitList_Sq(SqList*L)

{inti,a;L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配空间

if(!

L->elem)exit(OVERFLOW);//若存储分配失败,返回-2

L->length=0;//空表,长度为0

L->listsize=LIST_INIT_SIZE;//初始存储容量

printf("请输入结点数:

");

scanf("%d",&a);

printf("请输入数据:

\n");

for(i=0;i

{

scanf("%d",&L->elem[i]);

(L->length)++;

}

returnOK;

}

voidprintlist_sq(SqListL)

{inti;

printf("输入的元素为:

");

for(i=0;i

printf("%d",L.elem[i]);

printf("\n");

}

StatusListInsert_Sq(SqList*L,inti,ElemTypee)

{

int*q=&(L->elem[i-1]);

ElemType*newbase,*p;

if(i<1||i>L->length+1)

returnERROR;//检查i值是否合理

//将线性表第i个元素之后的所有元素向后移动

if(L->length>=L->listsize)

{newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));

if(!

newbase)

exit(OVERFLOW);

L->elem=newbase;

L->listsize+=LISTINCREMENT;

}

q=&(L->elem[i-1]);

for(p=&(L->elem[L->length-1]);p>=q;--p)

*(p+1)=*p;

*q=e;

++L->length;

returnOK;

}

StatusListDelete_Sq(SqList*L,inti,ElemTypee)

{int*p,*q;

if(i<1||(i>L->length))

returnERROR;

p=&(L->elem[i-1]);

e=*p;

q=L->elem+L->length-1;

for(++p;p<=q;++p)

*(p-1)=*p;

--L->length;

returnOK;

}

StatusGetElem_Sq(SqList*L,inti,ElemType*e)

{printf("输入要查找元素的位置:

");

scanf("%d",&i);

if(i<1||i>L->length)

returnERROR;//判断i值是否合理,若不合理,返回

else*e=L->elem[i-1];//数组中第i-1的单元存储着线性表中第i个数据元素的内容

printf("该位置的元素为%d",L->elem[i-1]);

returnOK;

}

intListLength_Sq(SqList*L)

{

printf("该线性表长为:

%d",L->length);

return(L->length);

}

voidadd_top(link*top)

{

link*p;

intlength,i;

top->next=NULL;

printf("输入建立链表长度:

");

scanf("%d",&length);

printf("请输入结点元素:

");

for(i=1;i<=length;i++)

{

p=(link*)malloc(sizeof(link));

scanf("%d",&i);

p->data=i;

p->next=top->next;

top->next=p;

}

}

voidarrive_end(link*top)

{

link*p=top->next;

while(p!

=NULL)

{printf("%d",p->data);

p=p->next;

}

printf("\n");

}

voidadd_bottom(link*top)

{

link*p,*q;

intlength,i;

q=top;

printf("输入建立链表长度:

");

scanf("%d",&length);

printf("请输入结点元素:

");

for(i=1;i<=length;i++)

{

p=(link*)malloc(sizeof(link));

scanf("%d",&i);

p->data=i;

q->next=p;

q=p;

}

q->next=NULL;

}

intlength(link*top)

{

link*p;

intlength=0;

p=top;

while(p->next!

=NULL)

{

p=p->next;

length++;

}

returnlength;

}

voiddelete(link*top,intpos)

{

inti=0;

link*p=top,*q;

while(p->next!

=NULL&&i

{

p=p->next;

i++;

}

q=p->next;

p->next=q->next;

free(q);

}

intinsert(link*top,inti,intpos)

{intj=0;

link*p=top,*s;

while(j

=NULL)

{

j++;

p=p->next;

}

if(p==NULL)//未找到第i-1个结点

return0;

else//找到第i-1个结点*p

{

s=(link*)malloc(sizeof(link));//创建新结点*s

s->data=pos;

s->next=p->next;//将*s插入到*p之后

p->next=s;

return1;

}

}intGetElem(link*top,inti)

{

intj=0;

link*p;

p=top;

while(p->next&&j

{

p=p->next;

j++;

}

if(i==j)

printf("该位置的元素为%d",p->data);

returnOK;

}

intmenu_select_list()

{

intchoice;

printf("*****************************************\n");

printf("*1------------------顺序表*\n");

printf("*2------------------链表*\n");

printf("*3------------------退出*\n");

printf("*****************************************\n");

printf("请输入选择:

(1-3)");

scanf("%d",&choice);

while(choice<1||choice>3)

{

printf("输入选择有误,请重新选择(1-3):

\n");

scanf("%d",&choice);

}

returnchoice;

}

intmenu_select_2_sqlist()

{

intchoice;

printf("\t^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");

printf("\t*1----------建立顺序表*\n");

printf("\t*2----------显示*\n");

printf("\t*3----------插入*\n");

printf("\t*4----------删除*\n");

printf("\t*5----------查找*\n");

printf("\t*6----------求线性表的长度*\n");

printf("\t*7----------返回*\n");

printf("\t^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");

printf("请输入选择(1-7):

");

scanf("%d",&choice);

while(choice<1||choice>7)

{

printf("输入选择有误,请重新选择(1-7):

");

scanf("%d",&choice);

}

returnchoice;

}

intmenu_select_2_list()

{

intchoice;

printf("\t^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");

printf("\t*1----------前插建立链表*\n");

printf("\t*2----------显示*\n");

printf("\t*3----------后插建立链表*\n");

printf("\t*4----------插入*\n");

printf("\t*5----------删除*\n");

printf("\t*6----------查找*\n");

printf("\t*7----------求线性表的长度*\n");

printf("\t*8----------返回*\n");

printf("\t^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");

printf("请输入选择(1-8):

");

scanf("%d",&choice);

while(choice<1||choice>8)

{

printf("输入选择有误,请重新选择(1-8):

\n");

scanf("%d",&choice);

}

returnchoice;

}

intshunxvbiao()

{

SqListL;inti,e;

linktop,p;

intpos,choice1=1,choice2;

while(choice1==1||choice1==2)

{

choice1=menu_select_list();

switch(choice1){

case1:

choice2=menu_select_2_sqlist();

while(choice2!

=7)

{

switch(choice2){

case1:

InitList_Sq(&L);system("cls");break;

case2:

printlist_sq(L);getch();system("cls");break;

case3:

printf("请输入要插入的位置:

");scanf("%d",&i);printf("请输入要插入的元素:

");

scanf("%d",&e);

ListInsert_Sq(&L,i,e);

printf("插入后的线性表:

");

printlist_sq(L);

getch();

system("cls");break;

case4:

printf("请输入被删除的位置:

");

scanf("%d",&i);

ListDelete_Sq(&L,i,e);

printf("已成功删除!

");

getch();

system("cls");

break;

case5:

GetElem_Sq(&L,i,&e);getch();system("cls");

break;

case6:

ListLength_Sq(&L);

getch();

system("cls");

break;

case7:

break;system("cls");

default:

printf("\t\t\t输入有误,请重新输入:

\n");break;}

choice2=menu_select_2_sqlist();}break;

case2:

choice2=menu_select_2_list();

while(choice2!

=8)

{switch(choice2){

case1:

add_top(&top);

printf("建立好的链表为:

");

arrive_end(&top);

getch();

system("cls");

break;

case2:

printf("建立好的链表为:

");

arrive_end(&top);

getch();

system("cls");

break;

case3:

add_bottom(&top);

arrive_end(&top);

getch();

system("cls");

break;

case4:

printf("请输入插入位置:

");

scanf("%d",&i);

printf("请输入要插入的元素:

");

scanf("%d",&pos);

insert(&top,i,pos);

arrive_end(&top);

getch();

system("cls");

break;

case5:

printf("请输入删除位置:

");

scanf("%d",&pos);

delete(&top,pos);printf("删除后的链表为:

");

arrive_end(&top);

getch();

system("cls");

break;

case6:

printf("请输入查找位置:

");

scanf("%d",&i);

GetElem(&top,i);

getch();

system("cls");

break;

case7:

pos=length(&top);

printf("链表长度为:

%d\n",pos);

getch();

system("cls");

break;

case8:

break;

default:

;break;}

choice2=menu_select_2_list();}

break;}}

system("pause");

return0;

}

/*-------------------------栈---------------------*/

#include

#defineMAXSIZE16

typedefstruct{

intdata[MAXSIZE];

inttop;

intbase;

}seqstack;/*顺序栈的定义*/

voidInitStack(seqstack*);

intEmpty(seqstack*);

voidPush(seqstack*,int);

intPop(seqstack*);

intGetTop(seqstack*);

intOperate(int,char,int);

charProceed(char,char);

intIn(char);

intEvalExpres(void);

/*定义两个栈分别存放运算符和操作数*/

seqstackStackR,StackD;

/*主函数*/

intzhan()

{

intv;

charch;

printf("\t*****************用顺序栈实现整型算术表达式的求值**************\n");

v=EvalExpres();

printf("结果为:

%d",v);

/*以下为程序控制*/

printf("\n输入q为退出程序,输入回车则继续:

");

scanf("%c",&ch);

while(ch!

='q')

{

v=EvalExpres();

printf("结果为:

%d",v);

printf("\n输入q为退出程序,输入回车则继续:

");

scanf("%c",&ch);

}

system("cls");

return0;

}

voidInitStack(seqstack*s)

{s->top=0;

s->base=0;

}/*初始化栈*/

intEmpty(seqstack*s)

{if(s->top==s->base)

return1;

else

return0;

}/*判断栈是否为空*/

voidPush(seqstack*s,intx)

{

if(s->top==MAXSIZE)

{printf("OVERFLOW!

\n");

exit(0);

}

else

{s->data[s->top]=x;

s->top++;

}

}/*进栈*/

intPop(seqstack*s)

{inte;

if(Empty(s))

{printf("Underflow!

\n");

return0;

}/*下溢*/

else

{s->top--;

e=s->data[s->top];

returne;

}

}/*出栈*/

intGetTop(seqstack*s)/*取栈顶元素*/

{

if(Empty(s))

{printf("Underflow!

\n");

return0;

}

else

returns->data[s->top-1];

}

intEvalExpres(void)/*表达式求解函数*/

{

inta,b,i=0,s=0;

charc[80],r;

InitStack(&StackR);

Push(&StackR,'#');

InitStack(&StackD);

fflush(stdin);

printf("请输入表达式并以‘#’结束:

\n");

gets(c);

while(c[i]!

='#'||GetTop(&StackR)!

='#')

{

if(!

In(c[i]))/*判断读入的字符不是运算符是则进栈*/

{if(c[i]>='0'&&c[i]<='9')

{

s+=c[i]-'0';

while(!

In(c[++i]))/*此处实现的功能为当输入的数字为多位数时*/

{s*=10;

s+=c[i]-'0';

}

Push(&StackD,s+'0');

s=0;

}

else

{

printf("你输入的表达式有误!

\n");

return0;

}

}

else

switch(Proceed(GetTop(&StackR),c[i]))/*此函数用来比较读取的运算符和栈顶运算符的优先级*/

{

case'<':

/*栈顶的元素优先级高*/

Push(&StackR,c[i]);

i++;

break;

case'=':

/*遇到匹配的小括号时则去掉他*/

Pop(&StackR);

i++;

break;

case'>':

/*栈顶的优先级低则出栈并将结果写入栈内*/

r=Pop(&StackR);

a=Pop(&StackD)-'0';

b=Pop(&StackD)-'0';

Push(&StackD,Operate(a,r,b));

break;

}

}

return(GetTop(&StackD)-'0');/*返回运算结果*/

}

intIn(charc)/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1