数据结构作业.docx

上传人:b****5 文档编号:6504270 上传时间:2023-01-07 格式:DOCX 页数:30 大小:21.52KB
下载 相关 举报
数据结构作业.docx_第1页
第1页 / 共30页
数据结构作业.docx_第2页
第2页 / 共30页
数据结构作业.docx_第3页
第3页 / 共30页
数据结构作业.docx_第4页
第4页 / 共30页
数据结构作业.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

数据结构作业.docx

《数据结构作业.docx》由会员分享,可在线阅读,更多相关《数据结构作业.docx(30页珍藏版)》请在冰豆网上搜索。

数据结构作业.docx

数据结构作业

班级:

计算机科学与技术02班

组长:

宋志浩41009010212

小组成员:

康维虎41009010211

赵兵41009010216

许晓飞41009010213

刘望41009010215

朱元410090102126

#include

#include

#include

#defineP30/*除数余留法中的除数*/

#defineNULLKEY0

#defineMAX30/*人名个数*/

#definehashlen30/*哈希表长度*/

#defineMax20000//最大值为20000

#defineNUM10//顶点最大数为10

intsum=0,k=0;

MGraphG;

intP[NUM][NUM];//定义景点指针

longintD[NUM];//最短距离

intx[10]={0};

voidCreateUDN(intv,inta);

voidShortestPath(intnum);

voidoutput(intsight1,intsight2);

charMenu();

voidsearch();

charSearchMenu();

voidHaMiTonian(int);

voidNextValue(int);

voiddisplay();

voidsearch()//查询景点信息

typedefstructxinxi

{

inthaoma;

intcode;

structxinxi*next;

}xinxi;

structnode

{

intk;

}a[30];//paixu

typedefstructNode/*哈希表结构体*/

{

charkey_code[10];/*哈希表地址*/

structNode*next;

}Node;

typedefstructhashtable/*创建哈希表*/

{

intkey;

structNode*next;

}HashTable[MAX];

typedefstructArcCell//弧信息

{

intadj;//权值,顶点距离

}ArcCell;

typedefstructVertexType//顶点类型

{

intnumber;

char*sight;//景点名称

char*description;//景点介绍

}VertexType;

typedefstruct

{

VertexTypevex[NUM];//顶点向量

ArcCellarcs[NUM][NUM];//数组表示,邻接矩阵

intvexnum,arcnum;//图的当前顶点数和弧数

}MGraph;

 

typedefstructNode

{

chardata;

structNode*LChild;

structNode*RChild;

}BiTNode,*BiTree;

 

typedefstruct

{

char*ch;

intlen;

}HString;

//@@@-----文本处理器

//------paixu

intshell(structnodea[30],intn)

{

inti,j,t;

for(t=n/2;t>=1;t=t/2)

{

for(i=t+1;i<=n;i++)

if(a[i].k

{

a[0].k=a[i].k;

for(j=i-t;a[0].k0;j=j-t)

a[j+t].k=a[j].k;

a[j+t].k=a[0].k;

}

}

return0;

}

//快速排序

intpartition(structnodea[30],ints1,ints2)

{

inti,j;

i=s1;

j=s2;

a[0].k=a[s1].k;

while(i

{

while(i

j--;

if(i

{

a[i].k=a[j].k;

i++;

}

while(i

i++;

if(i

{

a[j].k=a[i].k;

j--;

}

}

a[i].k=a[0].k;

returni;

}

voidquick(structnodea[30],ints1,ints2)

{

intm,i,j;

if(s1

{

m=partition(a,s1,s2);

quick(a,s1,m-1);

quick(a,m+1,s2);

}

//for(i=1;i<=n;i++)

}

//堆排序

voidsift(structnodea[30],intp,intm)

{

inti,j,flag,t;

flag=a[p].k;

i=p;

j=2*i;

t=0;

while(j<=m&&!

t)

{

if(j

if(flag>=a[j].k)t=1;

else{

a[i].k=a[j].k;

i=j;

j=2*i;

}

}

a[i].k=flag;

}

voidheap(structnodea[30],intn)

{

inti,flag;

for(i=n/2;i>=1;--i)

sift(a,i,n);

for(i=n;i>=2;--i)

{

flag=a[1].k;

a[1].k=a[i].k;

a[i].k=flag;

sift(a,1,i-1);

}

}

 

//菜单

voidMune()

{

printf("\n");

printf("请输入你的选择!

\n");

printf("1:

希尔排序!

\n");

printf("2:

快速排序!

\n");

printf("3:

堆排序!

\n");

printf("4:

退出?

\n");

printf("\n");

}

 

intHash(intkey)

{

intmode=key%P;/*除留余数法得到的余数*/

returnmode;

}

voidHash_Init(HashTableht)/*哈希表初始化*/

{

inti;

for(i=0;i

{

ht[i].key=NULLKEY;

ht[i].next=NULL;

}

}

intCharToInt(charstr[]){

returnstr[0]+str[1]+str[2];

}

intHash_Insert(HashTableht,Node*node)/*为哈希表分配地址*/

{

intkey=Hash(CharToInt(node->key_code));

Node*p;

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

if(ht[key].key==NULLKEY)

{

ht[key].key=key;

ht[key].next=node;

k++;

}

elseif(ht[key].key==key)

{

p=ht[key].next;

k++;

while(p->next!

=NULL)

{

p=p->next;

k++;

}

p->next=node;

k++;

}

return1;

}

 

Node*Hash_Search(HashTableht,intkey)/*查找函数*/

{

intp0=Hash(key);

if(ht[p0].key==NULLKEY)

{sum++;returnNULL;}

elseif(ht[p0].key==p0)

{

Node*p=ht[p0].next;

while(p!

=NULL)

{

if(CharToInt(p->key_code)==key)

{sum++;

returnp;

}

p=p->next;

sum++;

}

}

returnNULL;

}

intHash_Create(HashTableht)/*哈希表长度*/

{

inti;

Node*node;

Hash_Init(ht);

printf("请输入姓名:

");/*输入30个姓名*/

for(i=0;i<30;i++)

{

node=(Node*)malloc(sizeof(Node));

scanf("%s",node->key_code);

node->next=NULL;

Hash_Insert(ht,node);

}

printf("\nCreateSuccessfully!

\n");

return1;

}

inthash_output(HashTableh)/*哈希表的输出部分*/

{

Node*a;

inti,j,count2=0;

a=(Node*)malloc(sizeof(Node));

j=0;

for(i=0;i

{

printf("%4d",i);

printf("%4d",h[i].key);

if(h[i].next!

=0)

count2++;

j=1;

a=h[i].next;

while(a)

{

printf("->%s",(*a).key_code);

a=(*a).next;

j++;

count2+=j;

}

printf("\n");

}

returncount2;

}

 

voidHash_Link()/*链表法构造函数*/

 

{

intkey;

inti;

Node*node;

HashTableht;

Hash_Create(ht);

hash_output(ht);

printf("count=%d\n",k);/*查找总长度*/

printf("ASL=%d/30\n",k);/*平均查找长度*/

printf("请输入要查找的数据:

");/*输入查找的姓名*/

scanf("%s",&key);

node=Hash_Search(ht,key);

printf("查找次数:

%d\n",sum);

if(node!

=NULL)

printf("查找成功!

");

else

printf("查找不成功!

");

}

voidhash_create(inth[],intstatus[],intdata)

{

intaddress;

intdi;

address=data%P;

if(status[address]==0)

{

h[address]=data;

status[address]=1;

}

else

{

for(di=1;di<=hashlen-1;di++)

{

address=((data%P)+di)%hashlen;

if(status[address]==0)

{

h[address]=data;

status[address]=1;

break;

}

}

}

return;

}

inthash_search(inth[],intkey)

{intaddress,di;

address=key%P;

if(h[address]==key)/*哈希表中元素与查找元素是否相等*/

return1;

else

{

for(di=1;di<=hashlen-1;di++)/*哈希表中元素与查找元素不相等,查找下一元素*/

{

address=((key%P)+di)%hashlen;

if(h[address]==key)

{

returndi+1;

break;

}

}

}

if(di>=hashlen)

return0;

}

 

charMenu()

{

charc;

intflag;

do

{

flag=1;

system("cls");

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

printf("^^^^^^^1、查询景点路径^^^^^^^^\n");

printf("^^^^^^^2、查询景点信息^^^^^^^^\n");

printf("^^^^^^^3、推荐参观路线^^^^^^^^\n");

printf("^^^^^^^4、退出^^^^^^^^^^^^^^^^\n");

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

printf("请输入您的选择:

");

scanf("%c",&c);

if(c=='1'||c=='2'||c=='3'||c=='4')

flag=0;

}while(flag);

returnc;

}

charSearchMenu()//查询景点路径

{

charc;

intflag;

do

{

flag=1;

system("cls");

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

printf("^^^^^^^1、按照景点编号查询^^^^^^^\n");

printf("^^^^^^^2、按照景点名称查询^^^^^^^\n");

printf("^^^^^^^3、返回^^^^^^^^^^^^^^^^^^^\n");

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

printf("请输入您的选择:

");

scanf("%c",&c);

if(c=='1'||c=='2'||c=='3')

flag=0;

}while(flag);

returnc;

}

 

voidsearch()//查询景点信息

{

intnum;

inti;

charc;

charname[20];

do

{

system("cls");

c=SearchMenu();

switch(c)

{

case'1':

system("cls");

printf("请输入您要查找的景点编号:

");

scanf("%d",&num);

for(i=0;i

{

if(num==G.vex[i].number)

{

printf("您要查找景点信息如下:

");

printf("%-25s\n",G.vex[i].description);

printf("按ENTER返回");

getchar();

getchar();

break;

}

}

if(i==NUM)

{

printf("没有找到!

");

printf("按ENTER返回");

getchar();

getchar();

}

break;

case'2':

system("cls");

printf("请输入您要查找的景点名称:

");

scanf("%s",name);

for(i=0;i

{

if(!

strcmp(name,G.vex[i].sight))

{

printf("您要查找景点信息如下:

");

printf("%-25s\n",G.vex[i].description);

printf("按ENTER返回");

getchar();

getchar();

break;

}

}

if(i==NUM)

{

printf("没有找到!

");

printf("按ENTER返回");

getchar();

getchar();

}

break;

}

}while(c!

='3');

}

 

voidCreateUDN(intv,inta)//采用数组表示法,构造无向图G

{

inti,j;

G.vexnum=v;//初始化图的顶点数和边数

G.arcnum=a;

for(i=0;i

G.vex[0].sight="大门";

G.vex[0].description="校园出入的正门。

";

G.vex[1].sight="图书馆";

G.vex[1].description="阅览,借阅图书。

";

G.vex[2].sight="教学楼";

G.vex[2].description="学生上课的地方";

G.vex[3].sight="食堂一";

G.vex[3].description="吃饭的地方";

G.vex[4].sight="大学生活动中心";

G.vex[4].description="日常庆典活动,社团演出";

G.vex[5].sight="游泳馆";

G.vex[5].description="游泳";

G.vex[6].sight="体育场";

G.vex[6].description="土操场";

G.vex[7].sight="2宿舍";

G.vex[7].description="学生日常生活起居地";

G.vex[8].sight="食堂三";

G.vex[8].description="民族餐厅";

G.vex[9].sight="运动场地";

G.vex[9].description="篮球、排球、足球场地";

for(i=0;i

for(j=0;j

G.arcs[i][j].adj=Max;

G.arcs[0][1].adj=G.arcs[1][0].adj=20;

G.arcs[1][2].adj=G.arcs[2][1].adj=24;

G.arcs[1][3].adj=G.arcs[3][1].adj=26;

G.arcs[1][4].adj=G.arcs[4][1].adj=16;

G.arcs[1][5].adj=G.arcs[5][1].adj=50;

G.arcs[2][7].adj=G.arcs[7][2].adj=1000;

G.arcs[3][4].adj=G.arcs[4][3].adj=34;

G.arcs[3][6].adj=G.arcs[6][3].adj=10;

G.arcs[4][6].adj=G.arcs[6][4].adj=19;

G.arcs[5][6].adj=G.arcs[6][5].adj=25;

G.arcs[5][7].adj=G.arcs[7][5].adj=500;

G.arcs[7][8].adj=G.arcs[8][7].adj=51;

G.arcs[7][9].adj=G.arcs[9][7].adj=200;

G.arcs[8][9].adj=G.arcs[9][8].adj=100;

}

voidShortestPath(intnum)//最短路径

{

intv,w,i,t;

intfinal[NUM];//辅助数组

intmin;

for(v=0;v

{

final[v]=0;

D[v]=G.arcs[num][v].adj;//将num到其余顶点的路径长度初始化为权值

for(w=0;w

P[v][w]=0;

if(D[v]<20000)

{

P[v][num]=1;

}

}

D[num]=0;

for(i=0;i

{

min=Max;

for(w=0;w

if(!

final[w])//求下一条最短路径

if(D[w]

{

v=w;

min=D[w];

}

for(w=0;w

if(!

final[w]&&((min+G.arcs[v][w].adj)

{

D[w]=min+G.arcs[v][w].adj;

for(t=0;t

P[w][t]=P[v][t];

}

}

}

 

voidoutput(intsight1,intsight2)//输出界面

{

inta,b,c,d,q=0;

a=sight2;

if(a!

=sight1)

{

printf("从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);

printf("(最短距离为%dm.",D[a]);

printf("%s",G.vex[sight1].sight);

d=sight1;

for(c=0;c

{

gate:

;

P[a][sight1]=0;

for(b=0;b

{

if(G.arcs[d][b].adj<20000&&P[a][b])

{

printf("-->%s",G.vex[b].sight);

q=q+1;

P[a][b]=0;

d=b;

if(q%8==0)printf("\n");

gotogate;

}

}

}

}

}

 

voidHaMiTonian(intm)//用来求推荐路线

{

if(m>9)return;

L:

NextValue(m);

if(x[m]==0)

return;

if(m==7&&G.arcs[0][x[9]-1].adj!

=20000)

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

当前位置:首页 > 医药卫生

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

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