当前位置:文档之家› 北科大数据结构上机题代码

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

北科大数据结构上机题代码《数据结构》上机题1、输入数据建立单链表,并求相邻两节点data值之和为最大的第一节点。

例如输入:26473 0,建立:所求结果=4 程序结构:类型说明;建表函数:Creatlist(L); 求值函数:Adjmax(L);main( ){ 变量说明;调用Creatlist(L)建表;调用Adjmax(L)求值;打印数据;释放链表空间;Y继续?N停止 } 上机题1:#include #include typedef int datatype;//设当前数据元素为整型 typedef struct node//节点类型 { datatype data;//节点的数据域struct node *next;//节点的后继指针域 }Linknode,*Link;//linknode为节点说明符,link为节点指针说明符 Link Createlist()//创建单链表的算法 { int a,c;float b; Link H,P,r;//H,P,r分别为表头,新节点和表尾节点指针H=(Link)malloc(sizeof(Linknode)); //建立头节点 r=H; do{ c=(fflush(stdin),scanf(\ //判断输入的是否是整数a=(int)b; if(c!=1||a!=b||a>-2^16||a-2^16||adata=a;//存入数据 r->next=P;//新节点链入表尾r=P; do { c=(fflush(stdin),scanf(\ //判断输入的是否是整数 a=(int)b; if(c!=1||a!=b||a>-2^16||a-2^16||anext=NULL;//将尾节点的指针域置空 return(H);//返回已创建的头节点 } Link Adjmax(Link H)//求链表中相邻两节点data值之和为最大的第一节点的指针的算法 { Link p,p1,q; int i,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); } void main()//主函数 { Link A,B,p,q; int a,b; do { printf(\请输入一组整数(以0为结束符,数之间回车):\\n\ p=A=Createlist();//创建新链表 B=Adjmax(A);//求链表中相邻两节点data值之和为最大的第一节点的指针a=(int)(B->data);//取第一节点的data值printf(\第一节点的data值为:%d\\n\ while(p->next)//释放链表空间{q=p;p=p->next;free(q);} free(p); printf(\是否继续输入下一组整数:是:1,否:0\\n\scanf(\}while(b); } 上机题2、实现算术表达式求值程序。

设操作数:0,1,2,,8,9;运算符:+,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 typedef struct node { char data; struct node *next; }snode,*slink; typedef structnode1 { int data; struct node1 *next; }snode1,*slink1;void Clearstack(slink s)//置栈空 { s=NULL; } int Emptystack(slink s)//判断栈是否为空 { if(s==NULL)return(1); //栈空返回1 else return(0);//栈非空返回0 } char Getstop(slink s)//取栈顶元素 { if(s!=NULL)return (s->data);return (0);} void Push(slink*s,char x)//元素x进栈 { slink p;p=(slink)malloc(sizeof(snode)); //生成进栈p节点 p->data=x;//存入新元素 p->next=*s;//p节点作为新的栈顶链入 *s=p; } char Pop(slink*s)//出栈 { char x; slink p; if(Emptystack(*s))return (-1); //栈空,返回-1 else { x=(*s)->data; p=*s; *s=(*s)->next; free(p); return (x);//成功 } } void Push1(slink1*s,int x)//元素x进栈 { slink1 p;p=(slink1)malloc(sizeof(snode1)); //生成进栈p节点 p->data=x;//存入新元素 p->next=*s;//p节点作为新的栈顶链入 *s=p; } int Pop1(slink1*s)//出栈 { int x; slink1 p; if(Emptystack1(*s))return (-1); //栈空,返回-1 else { x=(*s)->data; p=*s; *s=(*s)->next; free(p); return (x);//成功 } } int Emptystack1(slink1 s)//判断栈是否为空 { if(s==NULL)return(1); //栈空返回1 else return(0);//栈非空返回0 } void Clearstack1(slink1 s)//置栈空 { s=NULL; } int Getstop1(slink1 s)//取栈顶元素 { if(s!=NULL)return (s->data);return (0);} int Precede(char x,char y){ int a,b; switch(x){ case #://case (: case (:a=0;break; case +:case:b=1;break; case *: case /:b=2;break;//case 与x比较{E[j++]= ;E[j++]=Pop(&s);}//E[j++]= ;Push(&s,x);//Q1 int Ecount(char E)//后缀表达式求值 { int i=0,g=0,k=0,d=0,d1,g1; char x; int z,a,b; slink1 s=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;caseb;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); } int pd(char B) { int i=0,c,j,k;c=strlen(B); while(B[i]!=#){switch(B[i]){case :break;case 0:case1:case2:case3:case4:case5:case6:case7:case8:case9:{ j=i+1;if(B[j]== ){while(B[j]== )j++;switch(B[j]){case 0:case1:case2:case3:case4:case5: case6:case7:case8: case9:printf(\非法输入!请重新输入!\\n\ }}}break;case +:case1;while(B[j]== )j--;switch(B[j]){case +:case:case *:case /:case ):case #:printf(\非法输入!请重新输入!\\n\ }}break;case (:{j=i-1;while(B[j]== )j--;switch(B[j]){case 0:case1:case2: case3:case4:case5:case6:case7:case8:case #:case ):printf(\非法输入!请重新输入!\\n\ }k=i+1;while(B[k]== )k++;switch(B[k]){case +:case1;while(B[j]== )j--;switch(B[j]){case (:printf(\非法输入!请重新输入!\\n\ }k=i+1;while(B[k]== )k++;switch(B[k]){case1:case2:case3:case4:case5:case6:case7:case8: case9:printf(\非法输入!请重新输入!\\n\} }break; case \\0:break; default:printf(\非法输入!请重新输入!\\n\} i++; } if(B[0]==#){ printf(\表达式为空!请重新输入!\\n\} else if (B[c-1]!=#){ printf(\非法输入!请重新输入!\\n\ } } void main(){ int a,b,c,d; char B[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(\a=Ecount(E);printf(\结果=%d\\n\printf(\是否继续?是:1否:0\\n\scanf(\}while(c==1); } 上机题3、实现链式队列运算程序。

相关主题