北科大大数据结构上机题代码.docx

上传人:b****2 文档编号:23050273 上传时间:2023-04-30 格式:DOCX 页数:48 大小:22.97KB
下载 相关 举报
北科大大数据结构上机题代码.docx_第1页
第1页 / 共48页
北科大大数据结构上机题代码.docx_第2页
第2页 / 共48页
北科大大数据结构上机题代码.docx_第3页
第3页 / 共48页
北科大大数据结构上机题代码.docx_第4页
第4页 / 共48页
北科大大数据结构上机题代码.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

北科大大数据结构上机题代码.docx

《北科大大数据结构上机题代码.docx》由会员分享,可在线阅读,更多相关《北科大大数据结构上机题代码.docx(48页珍藏版)》请在冰豆网上搜索。

北科大大数据结构上机题代码.docx

北科大大数据结构上机题代码

《数据结构》上机题(C语言程序)

1.输入数据(设为整型)建立单链表,并求相邻两节点data值之和为最大的第一节点。

例如输入:

264730(0为结束符),建立:

 

 

所求结果=4

程序结构:

类型说明;

建表函数:

Creatlist(L);求值函数:

Adjmax(L);

main()

{变量说明;

调用Creatlist(L)建表;调用Adjmax(L)求值;

打印数据;释放链表空间;

Y继续?

N

停止}

 

上机题1:

#include

#include

typedefintdatatype;//设当前数据元素为整型

typedefstructnode//节点类型

{

datatypedata;//节点的数据域

structnode*next;//节点的后继指针域

}Linknode,*Link;//linknode为节点说明符,link为节点指针说明符

LinkCreatelist()//创建单链表的算法

{

inta,c;floatb;

LinkH,P,r;//H,P,r分别为表头,新节点和表尾节点指针

H=(Link)malloc(sizeof(Linknode));//建立头节点

r=H;

do

{

c=(fflush(stdin),scanf("%f",&b));//判断输入的是否是整数

a=(int)b;

if(c!

=1||a!

=b||a>-2^16||a<2^16-1)printf("非法输入!

请重新输入!

\n");

}while(c!

=1||a!

=b||a>-2^16||a<2^16-1);

while(a!

=0)

{

P=(Link)malloc(sizeof(Linknode));//申请新节点

P->data=a;//存入数据

r->next=P;//新节点链入表尾

r=P;

do

{

c=(fflush(stdin),scanf("%f",&b));//判断输入的是否是整数

a=(int)b;

if(c!

=1||a!

=b||a>-2^16||a<2^16-1)printf("非法输入!

请重新输入!

\n");

}while(c!

=1||a!

=b||a>-2^16||a<2^16-1);

}

r->next=NULL;//将尾节点的指针域置空

return(H);//返回已创建的头节点

}

LinkAdjmax(LinkH)//求链表中相邻两节点data值之和为最大的第一节点的指针的算法

{

Linkp,p1,q;

inti,j;

p=p1=H->next;

if(p1==NULL)return(p1);//表空返回

q=p->next;

if(q==NULL)return(p1);//表长=1时返回

i=p->data+q->data;//相邻两节点data值之和

while(q->next)

{

p=q;q=q->next;//取下一对相邻节点的指针

j=p->data+q->data;

if(j>i)

{

p1=p;

i=j;//取和为最大的第一节点指针

}

}

return(p1);

}

voidmain()//主函数

{

LinkA,B,p,q;

inta,b;

do

{

printf("请输入一组整数(以0为结束符,数之间回车):

\n");

p=A=Createlist();//创建新链表

B=Adjmax(A);//求链表中相邻两节点data值之和为最大的第一节点的指针

a=(int)(B->data);//取第一节点的data值

printf("第一节点的data值为:

%d\n",a);

while(p->next)//释放链表空间

{

q=p;

p=p->next;

free(q);

}

free(p);

printf("是否继续输入下一组整数:

是:

1,否:

0\n");

scanf("%d",&b);

}while(b);

}

 

上机题2.实现算术表达式求值程序(栈的运用)。

设操作数:

0,1,2,……,8,9(可扩充);

运算符:

+,—,*,/,(,),#(#号为结束)。

输入中缀表达式,如:

5+(4—2)*3#,将其转换成后缀表达式:

542—3*+#,

然后计算,本例结果为11。

程序结构:

类型说明;

两套:

Clearstack(S)、Emptystack(S)、Getstop(S)、Push(S)、Pop(S);

中缀到后缀转换的函数:

Mid-post(E[n],B[n]);

后缀表达式求值的函数:

Postcount(B[n]);

main()

{变量说明;

输入中缀表达式,存入E[n];

调用Mid-post(E,B);

调用Postcount(B);

打印表达式结果;

Y继续?

N

停止}

 

上机题2:

#include

#include

#include

typedefstructnode

{

chardata;

structnode*next;

}snode,*slink;

typedefstructnode1

{

intdata;

structnode1*next;

}snode1,*slink1;

voidClearstack(slinks)//置栈空

{

s=NULL;

}

intEmptystack(slinks)//判断栈是否为空

{

if(s==NULL)return

(1);//栈空返回1

elsereturn(0);//栈非空返回0

}

charGetstop(slinks)//取栈顶元素

{

if(s!

=NULL)return(s->data);

return(0);

}

voidPush(slink*s,charx)//元素x进栈

{

slinkp;

p=(slink)malloc(sizeof(snode));//生成进栈p节点

p->data=x;//存入新元素

p->next=*s;//p节点作为新的栈顶链入

*s=p;

}

charPop(slink*s)//出栈

{

charx;

slinkp;

if(Emptystack(*s))return(-1);//栈空,返回-1

else

{

x=(*s)->data;

p=*s;

*s=(*s)->next;

free(p);

return(x);//成功

}

}

voidPush1(slink1*s,intx)//元素x进栈

{

slink1p;

p=(slink1)malloc(sizeof(snode1));//生成进栈p节点

p->data=x;//存入新元素

p->next=*s;//p节点作为新的栈顶链入

*s=p;

}

intPop1(slink1*s)//出栈

{

intx;

slink1p;

if(Emptystack1(*s))return(-1);//栈空,返回-1

else

{

x=(*s)->data;

p=*s;

*s=(*s)->next;

free(p);

return(x);//成功

}

}

intEmptystack1(slink1s)//判断栈是否为空

{

if(s==NULL)return

(1);//栈空返回1

elsereturn(0);//栈非空返回0

}

voidClearstack1(slink1s)//置栈空

{

s=NULL;

}

intGetstop1(slink1s)//取栈顶元素

{

if(s!

=NULL)return(s->data);

return(0);

}

intPrecede(charx,chary)

{

inta,b;

switch(x)

{

case'#':

//case'(':

case'(':

a=0;break;

case'+':

case'-':

a=1;break;

case'*':

case'/':

a=2;break;

}

switch(y)

{

case'+':

case'-':

b=1;break;

case'*':

case'/':

b=2;break;

//case'(':

case'(':

b=3;break;

}

if(a>=b)return

(1);

elsereturn(0);

}

voidMid_post(charE[],charB[])//中缀表达式B到后缀表达式E的转换

{

inti=0,j=0;

charx;inta;

slinks=NULL;//置空栈

Clearstack(s);

Push(&s,'#');//结束符入栈

do

{

x=B[i++];//扫描当前表达式分量x

switch(x)

{

case'':

break;

case'#':

{

while(!

Emptystack(s))

{

E[j++]='';//栈非空时

E[j++]=Pop(&s);

}

}break;

case')':

{

while(Getstop(s)!

='(')

{

E[j++]='';

E[j++]=Pop(&s);

}//反复出栈直到遇到'('

Pop(&s);//退掉'('

}break;

case'+':

case'-':

case'*':

case'/':

case'(':

{

while(Precede(Getstop(s),x))//栈顶运算符(Q1)与x比较

{

E[j++]='';

E[j++]=Pop(&s);

}

//E[j++]='';

Push(&s,x);//Q1

E[j++]='';

}break;

default:

E[j++]=x;

}

}while(x!

='#');

E[j]='\0';

Clearstack(s);

}

intEcount(charE[])//后缀表达式求值

{

inti=0,g=0,k=0,d=0,d1,g1;

charx;

intz,a,b;

slink1s=NULL;

while(E[i]!

='#')

{

x=E[i];

switch(x)

{

case'':

break;

case'+':

b=Pop1(&s);a=Pop1(&s);z=a+b;Push1(&s,z);break;

case'-':

b=Pop1(&s);a=Pop1(&s);z=a-b;Push1(&s,z);break;

case'*':

b=Pop1(&s);a=Pop1(&s);z=a*b;Push1(&s,z);break;

case'/':

b=Pop1(&s);a=Pop1(&s);z=a/b;Push1(&s,z);break;

default:

{

g=0;g1=0;

while(E[i]!

='')

{

g1=E[i]-'0';

g=g*10+g1;

i++;

}

Push1(&s,g);

}

}

i++;

}

if(!

Emptystack1(s))return(Getstop1(s));

Clearstack1(s);

}

intpd(charB[])

{inti=0,c,j,k;

c=strlen(B);

while(B[i]!

='#')

{

switch(B[i])

{

case'':

break;

case'0':

case'1':

case'2':

case'3':

case'4':

case'5':

case'6':

case'7':

case'8':

case'9':

{j=i+1;

if(B[j]=='')

{

while(B[j]=='')j++;

switch(B[j])

{

case'0':

case'1':

case'2':

case'3':

case'4':

case'5':

case'6':

case'7':

case'8':

case'9':

printf("1非法输入!

请重新输入!

\n");return(0);break;

}

}

}break;

case'+':

case'-':

case'*':

case'/':

{

j=i-1;

while(B[j]=='')j--;

switch(B[j])

{

case'+':

case'-':

case'*':

case'/':

case'(':

case'#':

printf("2非法输入!

请重新输入!

\n");return(0);break;

}

k=i+1;

while(B[k]=='')k++;

switch(B[k])

{

case'+':

case'-':

case'*':

case'/':

case')':

case'#':

printf("3非法输入!

请重新输入!

\n");return(0);break;

}

}break;

case'(':

{

j=i-1;

while(B[j]=='')j--;

switch(B[j])

{

case'0':

case'1':

case'2':

case'3':

case'4':

case'5':

case'6':

case'7':

case'8':

case'9':

case'#':

case')':

printf("4非法输入!

请重新输入!

\n");return(0);break;

}

k=i+1;

while(B[k]=='')k++;

switch(B[k])

{

case'+':

case'-':

case'*':

case'/':

case'#':

printf("5非法输入!

请重新输入!

\n");return(0);break;

}

}break;

case')':

{

j=i-1;

while(B[j]=='')j--;

switch(B[j])

{

case'(':

printf("6非法输入!

请重新输入!

\n");return(0);break;

}

k=i+1;

while(B[k]=='')k++;

switch(B[k])

{

case'0':

case'1':

case'2':

case'3':

case'4':

case'5':

case'6':

case'7':

case'8':

case'9':

printf("7非法输入!

请重新输入!

\n");return(0);break;

}

}break;

case'\0':

break;

default:

printf("8非法输入!

请重新输入!

\n");return(0);

}

i++;

}

if(B[0]=='#')

{

printf("表达式为空!

请重新输入!

\n");return(0);

}

elseif(B[c-1]!

='#')

{

printf("9非法输入!

请重新输入!

\n");return(0);

}

}

voidmain()

{

inta,b,c,d;

charB[100],E[100];

do

{

do

{

printf("请输入中缀表达式:

\n");

B[100]=fflush(stdin);

gets(B);

while(B[0]=='\0')

{

B[100]=fflush(stdin);

gets(B);

}

b=pd(B);

}while(b==0);

Mid_post(E,B);

printf("后缀表达式为:

\n");

printf("%s\n",E);

a=Ecount(E);

printf("结果=%d\n",a);

printf("是否继续?

是:

1否:

0\n");

scanf("%d",&c);

}while(c==1);

}

 

上机题3.实现链式队列运算程序(队列的运用)。

程序结构:

类型说明;

Clearqueue(q)、Emptyqueue(q)、Enqueue(q)、Dequeue(q);

main()

{变量说明;

 

 

 

 

}

上机题3:

#include

#include

#include

typedefstructnode

{

chardata;

structnode*next;

}Qnode,*Qlink;

typedefstruct

{

Qnode*front,*rear;

}linkqueue;

voidClearqueue(linkqueue*q)//清空队列

{

q->front->next=NULL;

q->rear=q->front;

}

voidCreatqueue(linkqueue*q)//创建队列

{

q->front=(Qlink)malloc(sizeof(Qnode));

q->front->next=NULL;

q->rear=q->front;

}

intEmptyqueue(linkqueue*q)//判断队列是否为空

{

if(q->front==q->rear)return

(1);

elsereturn(0);

}

voidEnqueue(linkqueue*q,chare)//元素进队

{

Qlinkp;

p=(Qlink)malloc(sizeof(Qnode));

p->data=e;

p->next=NULL;

q->rear->next=p;

q->rear=p;

}

charDequeue(linkqueue*q)//元素出队

{

Qlinkp;

if(Emptyqueue(q))return(NULL);

else

{

p=q->front;

q->front=p->next;

free(p);

return(q->front->data);

}

}

voidmain()

{

chara,b;intc;

linkqueueq;

Creatqueue(&q);

do{

a=getchar();

switch(a)

{

case'0':

{

if(Emptyqueue(&q))

{

printf("队列为空!

\n");

printf("请继续输入!

\n");c=1;

}

else

{

b=Dequeue(&q);

printf("%c出队\n",b);

printf("请继续输入!

\n");

}

}break;

case'@':

{

if(Emptyqueue(&q))

{printf("队列为空!

\n");return;}

else

{

printf("全部元素出队:

\n");

while(Emptyqueue(&q)!

=1)

{

b=Dequeue(&q);

printf("%c",b);

}

printf("\n");

return;

}

}break;

case'\n':

break;

default:

{Enqueue(&q,a);c=1;}break;

}

}while(c);

}

 

上机题4.设电文字符集D及各字符出现的概率F如下:

D={a,b,c,d,e,f,g,h}(字符数n=8)

F={5,29,7,8,14,23,3,11}(%)

编写完成下列功能的程序:

①构造关于F的Huffman树;

②求出并打印D总各字符的Huffman编码。

程序结构:

类型说明;

构造Huffman树的函数:

Huffman_tree(H[m+1]);

求Huffman编码的函数:

Huffman_code(code[n+1]);

main()

{变量说明;

输入字符

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

当前位置:首页 > 外语学习 > 韩语学习

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

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