最新大连理工大学数据结构一上机作业答案张老师.docx
- 文档编号:28253530
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:20
- 大小:24.42KB
最新大连理工大学数据结构一上机作业答案张老师.docx
《最新大连理工大学数据结构一上机作业答案张老师.docx》由会员分享,可在线阅读,更多相关《最新大连理工大学数据结构一上机作业答案张老师.docx(20页珍藏版)》请在冰豆网上搜索。
最新大连理工大学数据结构一上机作业答案张老师
1.将顺序表逆置,要求用最少的附加空间。
参考答案
#include
#include
#include
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintElemType;
typedefintStatus;
#defineLIST_INIT_SIZE100
#defineLISTTINCREMENT10
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
//创建空顺序表
StatusInitList_Sq(SqList&L){
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
returnOK;
}
//创建顺序表,插入元素
voidListInput_Sq(SqList&L){
intn,i;
printf("inputthelengthofSqlist:
");
scanf("%d",&n);
L.length=n;
for(i=0;i { printf("inputelem: "); scanf("%d",&L.elem[i]); } } //输出顺序表中的元素 voidListOutput_Sq(SqListL){ inti,n; n=L.length; for(i=0;i printf("%2d",L.elem[i]); } //顺序表逆置 voidReverseList_Sq(SqList&L){ inti,n; ElemTypep; n=L.length; for(i=0;i { p=L.elem[i]; L.elem[i]=L.elem[n-i-1]; L.elem[n-i-1]=p; } } voidmain(){ SqListL; InitList_Sq(L); ListInput_Sq(L); ListOutput_Sq(L); ReverseList_Sq(L); printf("\n"); printf("输出结果为: "); ListOutput_Sq(L); printf("\n"); } 2.从键盘读入n个整数(升序),请编写算法实现: (1)CreateList(): 建立带表头结点的单链表; (2)PrintList(): 显示单链表,(形如: H->10->20->30->40); (3)InsertList(): 在有序单链表中插入元素x; (4)ReverseList(): 单链表就地逆置; (5)DelList(): 在有序单链表中删除所有值大于mink且小于maxk的元素。 选作: 使用文本菜单完成功能选择及执行。 参考答案: #include #include #include #defineOK1 #defineERROR0 typedefintElemType; typedefintStatus; typedefstructLNode{ ElemTypedata; structLNode*next; }LNode,*LinkList; voidCreateList(LinkList&L,intn){ inti; LNode*p,*q; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; q=L; printf("请输入所要建立的单链表所包含的元素: "); for(i=0;i p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next=NULL; q->next=p; q=p; } } voidPrintList(LinkListL){ LNode*p; p=L->next; while(p){ printf("%d",p->data); p=p->next; } printf("\n"); } voidInsertList(LinkListL,ElemTypem){ LNode*p,*q,*s; p=L; q=L->next; while(q&&q->data p=q; q=q->next; } if(q){ s=(LinkList)malloc(sizeof(LNode)); s->data=m; s->next=q; p->next=s; } else{ s=(LinkList)malloc(sizeof(LNode)); s->data=m; s->next=NULL; p->next=s; } } voidReverseList(LinkList&L){ LNode*p,*q; if(L->next&&L->next->next){ p=L->next; q=p->next; p->next=NULL; while(q){ p=q; q=q->next; p->next=L->next; L->next=p; } } } voidDeleteList(LinkList&L,ElemTypemink,ElemTypemaxk){ LNode*p=L,*q; while(p->next&&p->next->data<=mink) p=p->next; q=p; while(q&&q->data q=q->next; p->next=q; } voidmain(){ LinkListL; intn,number; ElemTypee,mink,maxk; do{ printf("*********************************\n"); printf("建立单链表请按1.\n"); printf("显示单链表请按2.\n"); printf("有序插入新元素请按3.\n"); printf("单链表就地逆置请按4.\n"); printf("删除大于mink且小于maxk的所有元素请按5.\n"); printf("退出请按0.\n"); printf("*********************************\n"); printf("\n请选择操作: \n"); scanf("%d",&number); switch(number){ case1: printf("请输入单链表中的节点个数: "); scanf("%d",&n); CreateList(L,n); break; case2: printf("要执行本操作请先建立单链表,请输入单链表中的节点个数: "); scanf("%d",&n); CreateList(L,n); printf("单链表为: "); PrintList(L); break; case3: printf("要执行本操作请先建立单链表,请输入单链表中的节点个数: "); scanf("%d",&n); CreateList(L,n); printf("请输入有序表中插入的值: "); scanf("%d",&e); InsertList(L,e); PrintList(L); break; case4: printf("要执行本操作请先建立单链表,请输入单链表中的节点个数: "); scanf("%d",&n); CreateList(L,n); printf("单链表逆置: "); ReverseList(L); PrintList(L); break; case5: printf("要执行本操作请先建立单链表,请输入单链表中的节点个数: "); scanf("%d",&n); CreateList(L,n); printf("请输入mink和maxk: "); scanf("%d%d",&mink,&maxk); DeleteList(L,mink,maxk); PrintList(L); break; } }while(number! =0);} 第二次作业 栈采用顺序栈存储,试设计算法实现将表达式转换成后缀表达式输出。 例如,输入表达式: a+b/c-(d*e+f)*g 输出其后缀表达式: abc/+de*f+g*- 参考答案: #include #include #include #include #defineOVER-2 #defineOK1 #defineERROR0 #defineture1 #definefalse0 #defineSTACK_INIT_SIZE100 #defineSTACKINCREMENT10 typedefcharSElemType; typedefcharElemType; typedefstruct{ SElemType*base; SElemType*top; intstacksize; }SqStack;//定义结构 intInitStack(SqStack&S){ S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(! S.base)exit(OVER); S.top=S.base; S.stacksize=STACK_INIT_SIZE; returnOK; }//建栈 intPush(SqStack&S,SElemTypee){ if(S.top-S.base>=S.stacksize) {S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType)); if(! S.base)exit(OVER); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; returnOK; }//插入 intGetTop(SqStack&S,SElemType&e){ if(S.top==S.base)returnERROR; e=*(S.top-1); returnOK; }//获取栈顶元素 intPop(SqStack&S,SElemType&e){ if(S.top==S.base)returnERROR; e=*--S.top; returnOK; }//删除栈顶并用e返回值 intStackEmpty(SqStackS){ if(S.top==S.base) returnture; else returnfalse; } intPass(charsuffix[],SElemTypech) { char*p; p=suffix; while(*p! ='\0') p++; *p=ch; *(p+1)='\0'; return0; }//把操作数ch传进数组suffix voidadd(charexp[]) { char*p; p=exp; while(*p! ='\0') ++p; *p='#'; *(p+1)='\0'; }//在表达式结尾加结束符 voiddel(charsuffix[]) { char*p; p=suffix; while(*p! ='#') p++; *p='\0'; }//将字符串结尾附成\0 intPrecede(charc) { if(c=='*'||c=='/') return2; if(c=='+'||c=='-') return1; if(c=='('||c==')') return-1; else return-2; }//优先级比较 voidtransform(charsuffix[],charexp[]) { char*p,ch,c; p=exp; ch=*p; SqStackS; InitStack(S); Push(S,'#'); while(! StackEmpty(S)) { if(ch>='a'&&ch<='z') { Pass(suffix,ch); } else { switch(ch) { case'(': Push(S,ch); break; case')': Pop(S,c); while(c! ='(') { Pass(suffix,c); Pop(S,c); } break; default: if(ch=='#') while(! StackEmpty(S)) { Pop(S,c); Pass(suffix,c); } else { GetTop(S,c); while(Precede(c)>=Precede(ch)) { Pop(S,c); Pass(suffix,c); GetTop(S,c); } Push(S,ch); } break; } } if(ch! ='#') ch=*++p; } }//后缀表达式转化 intmain() { charsuffix[100]; suffix[0]='\0'; charexp[100]; printf("请输入一个表达式: \n"); gets(exp); add(exp); transform(suffix,exp); del(suffix); printf("后缀表达式为: %s\n",suffix); return0; } 第三次作业 二叉树采用二叉链表存储,试设计算法实现: 1.CreateBT(BiTree&T): 从键盘输入二叉树的先序遍历序列字符串(以”#”代表空结点),建立其二叉链表; 如输入: AB#D##CE#F###则建立如下图所示二叉树的二叉链表 2.ExchangeBT(BiTreeT): 设计递归算法实现二叉树中所有结点的左右孩子交换; 3.CountLeaf(BiTreeT,TElemTypex,int&count): 统计以值为x的结点为根的子树中叶子结点的数目; 4.DispBiTree(BiTreeT,intlevel): 按树状打印二叉树。 打印得到: #C ###F ##E A ##D #B 提示: 对于根为T,层次为level的子树: 1打印其下一层(level+1层)右子树; 2打印根结点; 3打印其下一层(level+1层)左子树; *结点左边的’#’个数为其层次数* 参考答案: #include #include typedefstructBiTNode{ chardata; structBiTNode*lchild,*rchild; }BiTNode,*BiTree; //输入先序序列,创建二叉树的二叉链表 voidCreateBT(BiTree&T){ charch; scanf("%c",&ch); if(ch=='#') T=NULL; else{ T=(BiTNode*)malloc(sizeof(BiTNode)); T->data=ch; CreateBT(T->lchild); CreateBT(T->rchild); } } //交换二叉树中结点的左右孩子 voidExchangeBT(BiTree&T){ BiTreetemp; if(T){ temp=T->lchild; T->lchild=T->rchild; T->lchild=temp; ExchangeBT(T->lchild); ExchangeBT(T->rchild); } } //查找值为x的结点 BiTreeSearchTree(BiTreeT,charx){ BiTreeNTree; if(T){ if(T->data==x) returnT; NTree=SearchTree(T->lchild,x); if(NTree==NULL) NTree=SearchTree(T->rchild,x); returnNTree; } returnNULL; } //统计一x为根的子树中叶子结点的个数 voidLeafCount(BiTreeT,int&count){ if(T){ if((T->lchild==NULL)&&(T->rchild==NULL)) count++; LeafCount(T->lchild,count); LeafCount(T->rchild,count); } } //按树状打印输出二叉树的元素,level表示结点的层次 voidPrintBiTree(BiTreeT,intlevel){ inti; (一)大学生的消费购买能力分析if(T){ PrintBiTree(T->lchild,level+1); 1、DIY手工艺市场状况分析for(i=0;i printf("#"); printf("%c\n",T->data); PrintBiTree(T->rchild,level+1); 为了解目前大学生对DIY手工艺品制作的消费情况,我们于己于人2004年3月22日下午利用下课时间在校园内进行了一次快速抽样调查。 据调查本次调查人数共50人,并收回有效问卷50份。 调查分析如下: } 在现代文化影响下,当今大学生对新鲜事物是最为敏感的群体,他们最渴望为社会主流承认又最喜欢标新立异,他们追随时尚,同时也在制造时尚。 “DIY自制饰品”已成为一种时尚的生活方式和态度。 在“DIY自制饰品”过程中实现自己的个性化追求,这在年轻的学生一代中尤为突出。 “DIY自制饰品”的形式多种多样,对于动手能力强的学生来说更受欢迎。 } (二)上海的人口环境对饰品消费的影响voidmain(){ BiTreeT,SecT; charSecch; “漂亮女生”号称全国连锁店,相信他们有统一的进货渠道。 店内到处贴着“10元以下任选”,价格便宜到令人心动。 但是转念一想,发夹2.8元,发圈4.8元,皮夹子9.8元,好像和平日讨价还价杀来的心理价位也差不多,只不过把一只20元的发夹还到5元实在辛苦,现在明码标价倒也省心省力。 intcount=0; 虽然调查显示我们的创意计划有很大的发展空间,但是各种如“漂亮女生”和“碧芝”等连锁饰品店在不久的将来将对我们的创意小屋会产生很大的威胁。 printf("输入先序序列建立二叉树: \n"); 体现市民生活质量状况的指标---恩格尔系数,上海也从1995年的53.4%下降到了2003年的37.2%,虽然与恩格尔系数多在20%以下的发达国家相比仍有差距,但按照联合国粮农组织的划分,表明上海消费已开始进入富裕状态(联合国粮农组织曾依据恩格尔系数,将恩格尔系数在40%-50%定为小康水平的消费,20%-40%定为富裕状态的消费)。 CreateBT(T); printf("二叉树为: \n"); PrintBiTree(T,0); printf("交换结点的左右孩子\n"); ExchangeBT(T); 在我们学校大约有4000多名学生,其中女生约占90%以上。 按每十人一件饰品计算,大概需要360多件。 这对于开设饰品市场是很有利的。 女生成为消费人群的主体。 printf("\n此时二叉树为: \n"); 世界上的每一个国家和民族都有自己的饰品文化,将这些饰品汇集到一起再进行新的组合,便可以无穷繁衍下去,满足每一个人不同的个性需求。 PrintBiTree(T,0); printf("输入要统计叶子结点个数的子树的根: "); fflush(stdin);//清理缓存 scanf("%c",&Secch); SecT=SearchTree(T,Secch); LeafCount(SecT,count); printf("叶子结点数为: %d\n",count); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 大连理工大学 数据结构 上机 作业 答案 老师