数据结构实验2.docx
- 文档编号:9494659
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:16
- 大小:48.71KB
数据结构实验2.docx
《数据结构实验2.docx》由会员分享,可在线阅读,更多相关《数据结构实验2.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构实验2
数据结构实验
1.已知线性表La和Lb的元素按值非递减排列。
归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列。
分别采用顺序存储结构和链式结构来实现。
代码:
#include
usingnamespacestd;
#include
typedefintElemType;
//节点定义
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
//手动方式创建链表
LinkListManual_Create_LinkList(intn)
{cout<<"采用手动方式创建链表:
"< LinkList_LinkList=newLNode(); if(_LinkList) {_LinkList->next=NULL;} for(inti=0;i {LinkListp=newLNode(); cout<<"输入第"<<(i+1)<<"个元素: "; cin>>p->data; p->next=_LinkList->next; _LinkList->next=p; }return_LinkList;} //自动方式创建链表 LinkListAuto_Create_LinkList(intn) {cout<<"采用自动随机数方式创建链表: "< LinkList_LinkList=newLNode(); if(_LinkList) {_LinkList->next=NULL;} srand(time(0));//seed for(inti=n;i>0;i--) { LinkListp=newLNode(); p->data=rand()%100+1; p->next=_LinkList->next; _LinkList->next=p; } return_LinkList; } /*插入非递减有序单向链表*/ voidInsert_Sort_LinkList(LinkList&_LinkList,ElemType_Var) { LinkList_LinkList1,_LinkList2; _LinkList1=newLNode(); _LinkList1->data=_Var; _LinkList2=_LinkList; while(_LinkList2->next&&_LinkList2->next->data<=_Var) {_LinkList2=_LinkList2->next;} _LinkList1->next=_LinkList2->next; _LinkList2->next=_LinkList1; } //建立非递减有序单向链表 LinkListManual_Create_Ordered_LinkList(int_int) { cout<<"采用手动方式建立非递减有序单向链表: "< LinkList_LinkList=newLNode(); if(_LinkList) {_LinkList->next=NULL;} inti=0;intj=0;intk=0;ElemType_Var; for(i=0;i<_int;i++) { cout<<"输入第"<<(i+1)<<"个元素: "; cin>>_Var; Insert_Sort_LinkList(_LinkList,_Var); } return_LinkList; } //销毁链表 voidDestroy_LinkList(LinkList*myLinkList) { LinkList_LinkList1,_LinkList2; if(! (*myLinkList)) {cout<<"链表不存在! "< _LinkList1=*myLinkList; while(_LinkList1! =NULL) { _LinkList2=_LinkList1; _LinkList1=_LinkList1->next; delete(_LinkList2); } *myLinkList=NULL; } //遍历链表 voidTraveral_LinkList(LinkListmyLinkList) { cout<<"------------------------------"< cout<<"遍历链表中的元素: "< inti=0; /*第一种遍历方式*/ LinkList_LinkList=myLinkList->next; while(_LinkList) { cout<<"输出第"<<(i+1)<<"个元素: "<<_LinkList->data< _LinkList=_LinkList->next; i++; } /*第二种遍历方式*/ /* LinkList_LinkList; for(_LinkList=myLinkList->next;_LinkList;_LinkList=_LinkList->next) { cout<<"输出第"< "<<_LinkList->data< i++; } */ cout<<"------------------------------"< } //查找元素 LinkListLocate_LinkList(LinkListmyLinkList,ElemTypex) {while(myLinkList&&myLinkList->data! =x) { myLinkList=myLinkList->next; } returnmyLinkList; }//反转链表 voidReverse_LinkList(LinkList&myLinkList) { LinkListTempLinkList=NULL; LinkList_LinkList=myLinkList->next;//指向第一个元素 myLinkList->next=NULL;//指向最后一个元素 while(_LinkList) { TempLinkList=_LinkList; _LinkList=_LinkList->next;//下移 TempLinkList->next=myLinkList->next; myLinkList->next=TempLinkList; } } /*删除指定元素*/ voidDelete_LinkList(LinkListmyLinkList,ElemTypex) { inti=0; if(! myLinkList) {cout<<"链表不存在! "< /*[Begin]第一种方法*/ /* LinkList_LinkList1=myLinkList; LinkList_LinkList2=myLinkList->next; while(_LinkList2&&_LinkList2->data! =x) {_LinkList1=_LinkList2; _LinkList2=_LinkList2->next; }if(! _LinkList2) {cout<<"值没有找到! "< else {_LinkList1->next=_LinkList2->next; delete(_LinkList2); } */ /*[End]第一种方法*/ /*[Begin]第二种方法*/ /**/ LinkList_LinkList=myLinkList; //循环条件: 下个结点不为NULL,并且下个结点不为x while(_LinkList->next! =NULL&&_LinkList->next->data! =x) {_LinkList=_LinkList->next;} //判断是否已经循环到最后一个结点 if(_LinkList->next==NULL) {cout<<"值没有找到! "< LinkListTempLinkList=_LinkList->next; _LinkList->next=TempLinkList->next; delete(TempLinkList); /*[End]第二种方法*/ } voidmain() {LinkListmyLinkList; inti=0;intnum=0; /*[Begin]手动创建链表--------------------*/ cout<<"使用手动输入创建链表,输入要创建的链表的元素个数: "; cin>>num; myLinkList=Manual_Create_LinkList(num); Traveral_LinkList(myLinkList);//遍历链表 /*[End]手动创建链表---------------------*/ /*[Begin]删除元素值---------------------*/ cout<<"输入要删除的元素值: "; cin>>num; Delete_LinkList(myLinkList,num); Traveral_LinkList(myLinkList);//遍历链表 /*[End]删除元素值----------------------*/ Destroy_LinkList(&myLinkList);//销毁链表 /*[Begin]随机数创建链表---------------------*/ num=0; cout<<"使用随机数创建链表,输入要创建的链表的元素个数: "; cin>>num; myLinkList=Auto_Create_LinkList(num); Traveral_LinkList(myLinkList);//遍历链表 /*[End]随机数创建链表----------------------*/ /*[Begin]链表元素反转---------------------*/ cout<<"将随机数创建的链表元素反转: "; Reverse_LinkList(myLinkList); Traveral_LinkList(myLinkList);//遍历链表 /*[End]链表元素反转----------------------*/ Destroy_LinkList(&myLinkList);//销毁链表 /*[Begin]建立非递减有序单向链表---------------------*/ cout<<"使用手动输入建立非递减有序单向链表,输入要创建的链表的元素个数: "; cin>>num; myLinkList=Manual_Create_Ordered_LinkList(num); Traveral_LinkList(myLinkList);//遍历链表 /*[End]建立非递减有序单向链表----------------------*/ } 2.鞍点计算: 若矩阵A中的某个元素A[I,j]是第I行中最小的,而又是第j列中的最大的值,称A[I,j]为矩阵A中的一个鞍点,请写出确定此鞍点位置(假如有)的算法。 d #include voidmain(void) {inta[11][11],i,j,k; intm;//二维数组的行数 intn;//二维数组的列数 intflag_row=0;//如果每行中有鞍点,此值为1,否则为0 intflag=0;//如果整个数组中有一个鞍点或多个鞍点,此值为1,否则为0 intmax; intcol[11];//每一行可能有多个最大值,用它来存储行中的最大值所在有列 intl,p;//每一行中最大值的下标 do {printf("请你输入行数: (2--10): "); scanf("%d",&m); } while(m<2||m>10); do {printf("请你输入列数: (2--10): "); scanf("%d",&n); } while(n<2||n>10); printf("\n请你输入数组中的各元素\n"); for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { printf("a[%d][%d]=",i,j); scanf("%d",&a[i][j]); } } //输出数组 printf("\n"); for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { printf("%6d",a[i][j]); } printf("\n"); } printf("\n"); //求鞍点 for(i=1;i<=m;i++) { l=1; //先找行中的最大值 max=a[i][1];//假设每行第一个元素为最大值 col[l]=1;//存储最大值所在的列 for(j=2;j<=n;j++) { if(max { max=a[i][j]; col[l]=j; printf("col=%d\n",col); } } //找其它最大值 for(k=col[1];k<=n;k++) { if(max==a[i][k]) col[l++]=k; } l=l-1; //此时每行中的最大值为a[i][col] //再在col列中与其它元素进行比较,看是否最小,如果最小则有鞍点 //即flag_row=1,且flag=1; //先假设是最小值即flag_row=1,再比较,如果有比a[i][col]小的值,则假设不成立,令其值为0 for(p=1;p<=l;p++) { flag_row=1; for(k=1;k<=m;k++) { if(a[i][col[l]]>a[k][col[l]]) { flag_row=0; } } if(flag_row==1) { flag=1; printf("第%2d行有鞍点,它在第%2d列,它的值为%5d\n",i,col[l],a[i][col[l]]); } } } if(flag==0) { printf("无鞍点\n");//输出鞍点的值及所在的行和列 } } 3.采用队列,编写程序打印出杨辉三角形。 1 11 121 1331 14641 15101051 答案: 代码: #include #defineN10 intmain() { inti; intj; inta[N][N]; for(i=0;i { a[i][0]=1; a[i][i]=1; } for(i=2;i for(j=1;j a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i { for(j=0;j<=i;j++) printf("%-5d",a[i][j]); printf("\n"); } return0; } 4.利用顺序栈或链栈实现数十进制数向八进制数的转换。 测试数据: (1097)10=(2111)8 代码: #include usingnamespacestd; #definestacksize100 typedefintDataType; typedefstruct { DataTypedata[stacksize]; inttop; }Stack; voidInitial(Stack*s) { s->top=-1; } intIsempty(Stack*s) { returns->top==-1; } intIsFull(Stack*s) { returns->top==stacksize-1; } voidPush(Stack*s,DataTypex) { if(IsFull(s)) { cout<<"栈上溢"; exit (1); } s->data[++s->top]=x; } DataTypePop(Stack*s) { if(Isempty(s)) { cout<<"栈为空"; exit (1); } returns->data[s->top--]; } //进制转换函数 voidConversion(inti,intj) { intk; Stacks; Initial(&s); while(i) { Push(&s,i%j); i=i/j; } while(! Isempty(&s)) { k=Pop(&s); cout< } cout< } DataTypetop(Stack*s) { if(Isempty(s)) { cout<<"栈为空"; exit (1); } returns->data[s->top]; } intmain(void) { intm,n; cin>>m>>n; Conversion(m,n); system("pause"); return0; } (或;#include usingnamespacestd; voidconversion(inta) { if(! a)return; conversion(a/8); cout< } intmain(void) { inta; cout<<"输入你要转换的数"< cin>>a; conversion(a); cout< system("pause"); return0; })
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)