数据结构经典易错习题.docx
- 文档编号:4376346
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:28
- 大小:24.62KB
数据结构经典易错习题.docx
《数据结构经典易错习题.docx》由会员分享,可在线阅读,更多相关《数据结构经典易错习题.docx(28页珍藏版)》请在冰豆网上搜索。
数据结构经典易错习题
【例2.5】假设有n(n>1)个线性表顺序地存放在顺序表S[1..m]中,令F[i]和R[i]指
示第i个(1≤i≤n)表的第1个元素和最后1个元素在S中的位置,并设定R[i] F[n+1]=m+1,如图2.2所示。 试写出实现下列要求的算法: (1)在第i个表中的第j项后面插入1个元素,仅当整个[1..m]空间填满时,不允许进行 插入操作。 (2)删除第i个表中的第j个元素,要求在删除第j个元素后,该表仍为顺序存储的线性 表。 【解】本题实质上是将n个线性表(长度可能不相同)放在一个连续空间(长度为m), 来解决这些线性表的插入和删除问题。 (1)的算法如下: voidins(i,j,x) { intp,k; if(R[n]==m) cout<<"上溢"< else { for(p=n;p>=i+1;p--)//将i+1到n的线性表后移一个元素 { for(k=R[p];k>=F[p];k--)//将第p个线性表后移一个元素 S[k+1]=S[k]; R[p]++;F[p]++;//第p个线性表的首尾元素位置均增1 } for(p=R[i];p>=j+1;p--) //将第i个线性表中的第j个位置起的元素均后移 S[p+1]=S[p]; S[p]=x;//在第i个线性表的第j个位置处存放x R[p]++;//第p个线性表的R[p]增1 } } (2)的算法如下: voiddel(i,j) { for(p=F[i]+j-1;p<=m;p++)//元素前移覆盖要删除的元素 S[p]=S[p+1]; for(p=i;p<=n;p++)//第i个及以后的线性表的R[i]值减1 R[p]--; for(p=i+1;p<=n;p++)//第i+1个及以后的线性表的F[i]值减1 F[p]--; } 【例2.6】设A=(a1,a2,⋯,am)和B=(b1,b2,⋯,bn)均为顺序表。 若n=m且ai=bi(i=1,⋯,n),则称A=B;若ai=bi(i=1,⋯,j)且aj+1 AB。 试编写一个比较A和B的算法,当AB时分别 输出-1、0或1。 【解】算法comp()的思想是先找出A和B中前面对应位置相同值的节点,i和j分别为A 和B中比较不相同元素的下标,然后根据i和j的情况得到A和B的比较结果。 实现本题功能的 程序如下: #include #include #defineMaxLen50 typedefintElemType; typedefElemTypesqlist[MaxLen]; intcreate(sqlista) { intn,s; printf("pleaseinputthenumberofthelist\n"); scanf("%d",&n); for(inti=0;i { printf("pleaseinputthe%delement\n",i+1); scanf("%d",&s); getchar(); a[i]=s; } returnn; } intcomp(sqlistA,intna,sqlistB,intnb) { inti=0,j=0; while(A[i]==B[j]&&i { i++; j++; printf("hello\n"); } if(i==na&&j==nb) return0; elseif(i==0&&j==0) return1; elseif(A[i] return-1; elsereturn1; } voidmain() { sqlistA,B; inti,j,n; i=create(A); j=create(B); n=comp(A,i,B,j); switch(n) { case0: printf("A=B\n");break; case1: printf("A>B\n");break; case-1: printf("A } } 设A和B是两个顺序表,其元素按从小到大的顺序排列。 编写一个将A和B中所有元素组成一个新的从小到大的有序顺序表C的算法,要求删除重复的元素。 intNewComine_1(sqlista,intna,sqlistb,intnb)//将两个按照由小到大顺序进行排列的链表进行合并,并将其中的相同元素删除 { intm=na; intn=nb; inti=0; intj=0; intk=0; sqlistc; if(na==0&&nb==0) exit(0); if(na+nb>MaxLen) exit(0); while(i { if(a[i]>b[j]) { c[k]=b[j]; k++; j++; }else if(a[i] { c[k]=a[i]; k++; i++; }else if(a[i]==b[j]) { c[k]=a[i]; k++; i++; j++; } } if(i { for(;i { c[k]=a[i]; k++; } } if(j { for(;j { c[k]=b[j]; k++; } } print(c,k); returnna+nb; } 【题8】己知在一维数组A[1: m+n]中依次存放着两个顺序表(a1,a2,⋯,am)和(b1, b2,⋯,bn),编写一个函数,将两个顺序表的位置互换,即把(b1,b2,⋯,bn)放到(a1,a2,⋯, am)的前面。 本题的算法思想是: 由于顺序表的插入与删除操作需要大量的元素移动,所 用时间多,这里采用先将: A: (a1,a2,⋯,am,b1,b2,⋯,bn) 的所有元素逆置,即使之变成: A: (bn,⋯,b2,b1,am,⋯,a2,a1) 然后将(bn,⋯,b2,b1)逆置为(b1,b2,⋯,bn),将(am,⋯,a2,a1)逆置为(a1,a2,⋯, am),这样便得到最终结果: A: (b1,b2,⋯,bn,a1,a2,⋯,am) 实现本题功能的程序如下: #include"sq.cpp" voidinvert(sqlistA,intlow,inthigh) { intm=(high-low+1)/2,i;//m为长度的一半 elemtypetemp; for(i=0;i { temp=A[low+i];A[low+i]=A[high-i];A[high-i]=temp; } } voidmain() { sqlistA; intna,n; na=create(A); disp(A,na); cout<<"输入n: "; cin>>n; invert(A,0,na-1); disp(A,na); invert(A,0,n-1); disp(A,na); invert(A,n,na-1); disp(A,na); } 本程序的一次执行结果如下(其中n指定第2组数序的长度): 创建一个顺序表 输入元素个数: 7 输入第1个元素值: 1 输入第2个元素值: 2 输入第3个元素值: 3 输入第4个元素值: 5 输入第5个元素值: 6 输入第6个元素值: 7 输入第7个元素值: 8 输出一个顺序表 1235678 输入n: 4l 输出一个顺序表 8765321 输出一个顺序表 5678321 输出一个顺序表 5678123 【题9】设有大小不等的n个数据组(n个数据组中数据的总数为m),顺序存放在空 间D内,每个数据占一个存储单元,数据组的首地址由数组S给出,如图2.3所示。 试编写将 新数据x插入到第i个数据组的末尾且属于第i个数据组的算法,插入后,空间区D和数组S的 相互关系仍保持正确。 图2.3数据组存储方式 voidins(i,x) { int*p,j; if(i==n)//若i=n,则将x插入到最后 D[m+1]=x; else { for(p=D+m+1;p>=S[n];p--) //S[n]的元素均后移,D+m表示D[m]的地址 *p=*(p-1); S[n]++;//将前一个位置的值放入后一个位置上 for(j=n-1;j>i;j--)//S[i+1]到S[n-1]的所有元素后移 { for(p=S[j+1]-1;p>=S[j];p--)*p=*(p-1); S[j]++; } *(S[i+1]-1)=x; //将x放在S[i+1]前一个位置上,即S[i]的最后位置 } } 【题11】设某机器表示的整数不超过5位十进制数字。 试设计一种表示任意长的整数 的数据结构,并利用你设计的数据结构,写出计算任意给定的两个整数之和的算法 将用户输入的正整数按各位数字存放在一个顺序表中,这样就变成了两个 顺序表中的数字相加。 实现本题功能的程序如下: #include"sq.cpp" intinput(sqlistA) { inti;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 经典 习题
![提示](https://static.bdocx.com/images/bang_tan.gif)