数据结构作业答案大连理工大学.docx
- 文档编号:9928955
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:37
- 大小:116.23KB
数据结构作业答案大连理工大学.docx
《数据结构作业答案大连理工大学.docx》由会员分享,可在线阅读,更多相关《数据结构作业答案大连理工大学.docx(37页珍藏版)》请在冰豆网上搜索。
数据结构作业答案大连理工大学
作业1.线性表
编程作业:
1.将顺序表逆置,要求用最少的附加空间。
参考答案
#include
#include
#include
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
typedefintElemType;
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;
}
//顺序表在第i个元素之前插入e
Statussxbcr(SqList&L,inti,ElemTypee)
{
ElemType*p,*q;
if((i<1)||(i>L.length+1))
return(ERROR);
else
{q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
return(OK);
}
}
//顺序表显示
voidxsList(SqListL)
{
inti=L.length,k;
for(k=0;k
printf("%d",L.elem[k]);
printf("\n");
}
//顺序表逆置
voidnizhi(SqList&L)
{
inti=0,j=L.length-1;
ElemTypetemp;
for(;i { temp=L.elem[i]; L.elem[i]=L.elem[j]; L.elem[j]=temp; } } main() { SqListL; charflag1='y',flag2='n'; inti; ElemTypek; if(InitList_Sq(L)) { printf("建立空顺序表成功! \n"); do{ printf("当前线性表长度为: %d\n",L.length); printf("请输入要插入元素的位置: "); scanf("%d",&i); printf("请输入要插入的元素值: "); scanf("%d",&k); if(sxbcr(L,i,k)) { printf("插入成功,插入后顺序表长度为: %d\n",L.length); printf("插入后的顺序表为: "); xsList(L); } else printf("插入失败"); printf("\n继续插入元素? (y/n)"); fflush(stdin); scanf("%c",&flag1); }while(flag1=='y'); nizhi(L); printf("顺序表逆置后为: \n"); xsList(L); } } 2.从键盘读入n个整数(升序),请编写算法实现: (1)CreateList(): 建立带表头结点的单链表; (2)PrintList(): 显示单链表,(形如: H->10->20->30->40); (3)InsertList(): 在有序单链表中插入元素x; (4)ReverseList(): 单链表就地逆置; (5)DelList(): 在有序单链表中删除所有值大于mink且小于maxk的元素。 选作: 使用文本菜单完成功能选择及执行。 参考答案: #include #include #include #defineTRUE1 #defineFALSE0 #defineOK1 #defineERROR0 #defineINFEASIBLE-1 #defineOVERFLOW-2 typedefintStatus; typedefintElemType; typedefstructnode{ ElemTypedata; structnode*link; }Lnode,*LinkList; //头插法建立单链表 voidCreate_L1(LinkList&L,intn) { LinkListp; inti; L=(LinkList)malloc(sizeof(Lnode)); L->link=NULL; for(i=n;i>0;--i) { p=(LinkList)malloc(sizeof(Lnode)); scanf("%d",&p->data); p->link=L->link; L->link=p;} } //尾插法建立单链表 voidCreate_L2(LinkList&L,intn) { LinkLists,p; inti; L=(LinkList)malloc(sizeof(Lnode)); L->data=0; L->link=NULL; p=L; for(i=1;i<=n;i++) { s=(LinkList)malloc(sizeof(Lnode)); scanf("%d",&s->data); s->link=NULL; p->link=s; p=s;} } //查找是否存在结点e LinkListdlbcz(LinkListL,ElemTypee) { LinkListp=L->link; while(p! =NULL&&p->data! =e) p=p->link; return(p); } //在第i个元素之前插入结点e StatusListInsert_L(LinkListL,inti,ElemTypee) { LinkListp=L,s; intj=0; while(p&&j {p=p->link;++j;} if(! p||j>i-1) returnERROR; s=(LinkList)malloc(sizeof(Lnode)); s->data=e; s->link=p->link; p->link=s; returnOK; } //删除第i个结点 StatusListDelete_L(LinkListL,inti,ElemType&e) { LinkListp=L,q; intj=0; while(p->link&&j { p=p->link;++j;} if(! (p->link)||j>i-1) returnERROR; q=p->link; p->link=q->link; e=q->data; free(q); returnOK; } //求第i个元素值 StatusGetElem_L(LinkListL,inti,ElemType&e) { intj=1; LinkListp=L->link; while(p&&j {p=p->link;j++;} if(! p||j>i)returnERROR; e=p->data; returnOK; } //显示单链表中元素 voidxsList(LinkListL) { LinkListp=L->link; while(p) { printf("%d",p->data); p=p->link; } } //删除大于mink且小于maxk的元素 voidDelList(LinkList&L,ElemTypemink,ElemTypemaxk) { LinkListp=L,q; while(p->link&&p->link->data p=p->link; q=p; while(q&&q->data q=q->link; p->link=q; } //就地升序排序 voidsh_sort(LinkList&L) { LinkListp=L->link,pre=L,q=L->link->link,u; p->link=NULL; while(q) { p=L->link; pre=L; while(p&&p->data { pre=p; p=p->link; } u=q->link; pre->link=q; q->link=p; q=u; } } //就地逆置 voidnizhi(LinkList&L) { LinkListp=L->link,q=L->link->link,u; p->link=NULL; while(q) { u=q->link; q->link=L->link; L->link=q; q=u; } } //有序表插入 voidyxcharu(LinkList&L,ElemTypee) { LinkListpre,p,s; pre=L; p=L->link; while(p&&p->data { pre=p; p=p->link; } s=(LinkList)malloc(sizeof(Lnode)); s->data=e; s->link=p; pre->link=s; } main() { LinkListL; intn,i,mink,maxk; ElemTypee; charchoice='0'; while(choice! ='q') { printf("\n****************\n"); printf("1.建立单链表"); printf("2.取元素值"); printf("3.查找\n"); printf("4.插入"); printf("5.删除"); printf("6.显示\n"); printf("7.删除大于mink且小于maxk的元素值"); printf("8.就地升序排序\n"); printf("9.就地逆置"); printf("a.有序表插入"); printf("q.退出\n"); printf("\n请选择操作: "); fflush(stdin); scanf("%c",&choice); switch(choice) { case'1': printf("请输入单链表中结点个数: "); scanf("%d",&n); Create_L2(L,n); break; case'2': printf("请输入元素位序: "); scanf("%d",&i); GetElem_L(L,i,e); printf("元素值为: %d\n",e); break; case'3': printf("请输入要查找的元素: "); scanf("%d",&e); if(dlbcz(L,e)) printf("查找成功! "); else printf("查找失败。 "); break; case'4': printf("请输入插入位置: "); scanf("%d",&i); printf("请输入要插入的元素: "); scanf("%d",&e); if(ListInsert_L(L,i,e)) printf("插入成功! 单链表为: "); else printf("插入失败。 "); break; case'5': printf("请输入删除位置: "); scanf("%d",&i); if(ListDelete_L(L,i,e)) printf("删除成功! "); else printf("删除失败。 \n"); break; case'6': printf("\n单链表为: "); xsList(L); break; case'7': printf("请输入mink和maxk: "); scanf("%d,%d",&mink,&maxk); DelList(L,mink,maxk); break; case'8': sh_sort(L); break; case'9': nizhi(L); break; case'a': printf("请输入在有序表中插入的元素值: "); scanf("%d",&e); yxcharu(L,e); break; } } } 作业2.栈、队列、数组 非编程作业: 1.若进栈序列为ABCD,请写出全部可能的出栈序列和不可能的出栈序列。 参考答案: 可能的出栈序列: (14种) dcbacdbabacdcbdaadcbcbadbdcaacdbbcdaacbdbcadabdcbadcabcd 不可能的出栈序列: (10种) dbcadbacdabcdacbdcabcabdcdabbdaccadbadbc 2.简要说明循环队列如何判断队满和队空? 参考答案: 当牺牲一个存储结点,约定以“队列头指针在队列尾指针的下一位置(指环状的下一个位置)上”作为队列“满”状态的标志时,循环队列判断队满的条件为: (rear+1)%MaxQsize==front;判断队空的条件为: front==rear。 3.设A为n阶对称矩阵,采用压缩存储存放于一维数组F[n(n+1)/2]中(从F[0]开始存放),请分别给出存放上三角阵时任一矩阵元素aij(1≤i,j≤n)的地址计算公式和存放下三角阵时任一矩阵元素aij(1≤i,j≤n)的地址计算公式。 参考答案: 存放上三角阵时,任一矩阵元素aij(1≤i,j≤n)的地址计算公式为: 存放下三角阵时,任一矩阵元素aij(1≤i,j≤n)的地址计算公式为: 4.写出下面稀疏矩阵的三元组顺序表和十字链表表示。 参考答案: 编程作业 栈采用顺序栈存储,试设计算法实现将表达式转换成后缀表达式输出。 例如,输入表达式: a+b/c-(d*e+f)*g 输出其后缀表达式: abc/+de*f+g*- 参考答案: #include #include #include #defineOVERFLOW-2 #defineOK1 #defineERROR0 #defineSTACK_INIT_SIZE100 #defineSTACKINCREMENT10 typedefintStatus; typedefcharSElemType; typedefcharstring[80]; typedefstruct {SElemType*base; SElemType*top; intstacksize; }SqStack; StatusInitStack(SqStack&S) {S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(! S.base)exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return(OK); } StatusClearStack(SqStack&S) {S.base=(SElemType*)realloc(S.base,STACK_INIT_SIZE*sizeof(SElemType)); if(! S.base)exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return(OK); } voidDestroyStack(SqStack&S) {S.stacksize=0; if(S.base)free(S.base); S.base=S.top=NULL; } StatusStackEmpty(SqStackS) {if(S.top==S.base) returntrue; else returnfalse; } SElemTypeGetTop(SqStackS) {SElemTypee; if(S.top>S.base) e=*(S.top-1); returne; } StatusPush(SqStack&S,SElemTypee) { if(S.top-S.base>=S.stacksize)//栈满 {S.base=(SElemType*)realloc(S.base,(S.stacksize +STACKINCREMENT)*sizeof(SElemType)); if(! S.base)exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; returnOK; } StatusPop(SqStack&S,SElemType&e) {if(S.top==S.base)//栈空 returnERROR; e=*--S.top; returnOK; } StatusInOP(SElemTypec) { charOperators[]={'+','-','*','/','(',')','#','\0'}; intlen=strlen(Operators); for(inti=0;i if(c==Operators[i]) returntrue; returnfalse; } SElemTypePrecede(SElemTypecurtop,SElemTypeinput) {SElemTypeorder; switch(input){ case'+': case'-': switch(curtop){ case'+': case'-': case'*': case'/': case')': order='>';break; case'(': case'#': order='<';break; } break; case'*': case'/': switch(curtop){ case'+': case'-': case'(': case'#': order='<';break; case'*': case'/': case')': order='>';break; } break; case'(': switch(curtop){ case'+': order='<';break; case'-': order='<';break; case'*': order='<';break; case'/': order='<';break; case'(': order='<';break; case'#': order='<';break; } break; case')': switch(curtop){ case'+': order='>';break; case'-': order='>';break; case'*': order='>';break; case'/': order='>';break; case'(': order='=';break; case')': order='>';break; } break; case'#': switch(curtop){ case'+': order='>';break; case'-': order='>';break; case'*': order='>';break; case'/': order='>';break; case')': order='>';break; case'#': order='=';break; } break; } returnorder; } voidPass(stringSuffix,SElemTypech) {*Suffix=ch; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 作业 答案 大连理工大学