数据结构作业线性表参考答案.docx
- 文档编号:23450642
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:15
- 大小:17.99KB
数据结构作业线性表参考答案.docx
《数据结构作业线性表参考答案.docx》由会员分享,可在线阅读,更多相关《数据结构作业线性表参考答案.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构作业线性表参考答案
作业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)NizhiList(): 单链表就地逆置; (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; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 作业 线性 参考答案