北科大数据结构上机题代码资料.docx
- 文档编号:3731657
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:41
- 大小:23KB
北科大数据结构上机题代码资料.docx
《北科大数据结构上机题代码资料.docx》由会员分享,可在线阅读,更多相关《北科大数据结构上机题代码资料.docx(41页珍藏版)》请在冰豆网上搜索。
北科大数据结构上机题代码资料
《数据结构》上机题(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() {变量说明; 输入字符集D及频率F; 调用Huf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北科大 数据结构 上机 代码 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)