顺序表的应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2、数据结构的定义为(D,S),其中D是( )的 集合。
A 算法 B 数据元素 C 数据操作 D 逻辑结构
3、下面程序段的时间复杂度为( B )
int f(int n) {
if(n= =0 || n= =1) return 1;
else return n*f(n-1);
编写算法实现顺序表的就地逆置。
答案
void converse( Seqlist *L ){
int mid=L->size/2,i;
datatype x;
for(i=0;i<mid;i++){
x=L->list[i];
L->list[i]=L->list[L->size-1-i];
a=b=c=0;
for(a=0;a<La.size;a++)
if(La.list[a]>=0)
Lb->list[b++]=La.list[a];
else Lc->list[c++]=La.list[a];
Lb->size=b;
Lc->size=c; }
课外题目2
已知,顺序表的元素类型为整型,编写将该顺 序表分成两个顺序表的算法,一个存放所的奇 数元素,另一个存放所的偶数元素。
答案
void hebing(Seqlist La, Seqlist Lb, Seqlist *Lc) {
int a=0,b=0,c=0;
while(a<La.size&&b<Lb.size){
Fra Baidu bibliotekif(La.list[a]>Lb.list[b])
Lc->list[c++]=Lb.list[b++];
顺序表的应用
课后习题+算法设计题
填空题
顺序存储的长度为n的线性表,在任何位置上 插入和删除操作的时间复杂度基本上都一样, 都是( )。插入一个元素大约移动表中的 ( )个元素,删除一个元素时大约移动表中 的( )个元素。
选择题
1、在数据结构的讨论中把数据结构从逻辑上 分为 ( )
A 内部结构与外部结构 B 静态结构与动态结构 C 线性结构与非线性结构 D 紧凑结构与非紧凑结构
L->list[L->size-1-i]=x; }
}
2-24
设计一个非递减的有序顺序表,要求: (1)编写算法,实现操作集合:初始化、求
元素个数、插入、删除、取元素; (2)设计一个测试主函数实际验证所设计的
顺序表的正确性。
设计思路
对比顺序表,分析各个算法的异同。 根据各个算法,编写功能函数,保存在头文件
约瑟夫问题 (猴子选大王描述)
一堆猴子都有编号,编号是1,2,3 ...m ,这群 猴子(m个)按照1-m的顺序围坐一圈,从第1 开始数,每数到第N个,该猴子就要离开此圈, 这样依次下来,直到圈中只剩下最后一只猴子, 则该猴子为大王。
基本要求
(1) 输入数据:输入m,n m,n 为整数,n<m (2)中文提示按照m个猴子,数n 个数的方法,输
}
A O(1)
B O(n)
C O(n2)
D O(n !)
2-14
编写一个算法,逐个输出顺序表中的所有元素, 设元素的数据类型为int。
答案
void DispList(SeqList L) { int i; for(i=0;i< L.size;i++) printf("%d,", L.list[i]); }
课外题目3
将两个递增有序的顺序表A、B,进行合并成一个 递增有序的顺序表C,并要求同样的数据元素在 新表中只出现一次。
三种思路
1.合并两个有序表,然后再排序。 2.将有序表A存放到C中,然后将B中的元素一
个一个地插入到C中,在插入的过程中注意如何 优化比较次数。
3.分别从两个有序表中取出一个元素比较大小, 并将较小的元素放入到C中。当一个有序表为 空时,将另一个有序表的剩余元素直接放到C 的后面。
“orderlist.h”中。 编写主函数,调用各个功能函数。
特别操作
插入 删除分为指定位置删除操作和指定元素删除操
作。
课外题目1
已知,顺序表的元素类型为整型,编写将该顺 序表分成两个顺序表的算法,一个存放所的大 于或等于0的数据元素,另一个存放所的小于0 的数据元素。
答案
void Separate(Seqlist La, Seqlist *Lb, Seqlist *Lc){
i++;
if (i>=L.size)
return -1;
else
return i;
}
答案—方法2(课后答案)
int Listfind(SeqList L,datatype x){
int i;
for(i=0;i<L.size;i++){
if(L.list[i]==x) return i;
答案
void del(ListSq *L) { int i=0; while (i<L->size-1) { int j=i+1; while (j<L->size) if (L.list[i]= =L.list[j]){ for (int k=j+1;k<L.size;k++) L.list[k-1]=L.list[k]; L.size--;} else j++; i++;} }
printf(“顺序表已满,无法插入!”);
return 0;}
for( i=L->size-1; i>=0&&x<L->list[i]; i-- )
L->list[i+1]=L->list[i];
L->list[i+1]=x;
L->size++;
return 1;
}
2-18
答案
void fenSq(ListSq L, ListSq *a, ListSq *Lb ) { int j=0,k=0; for (int i=0;i<L.size;i++) if (L.list[i]%2= =0) { Lb->list[j]=L->list[i]; j++; } else { La->list[k]=L.list[i]; k++; } La.size=k; Lb.size=j; }
算法分析
两个顺序表按递增方式排列,在进行合并时,依 次比较,哪个线性表中的元素值小就先将这个元 素复制到新的线性表中,若两个元素相等,则复 制一个即可,一直到其中的一个线性表中的元素 全部复制到新表后,将另一个表中剩余的元素复 制到新表中即可。
算法的时间性能是O(m+n),其中m是A的表 长,n是B的表长。
else continue; }
return -1;
}
2-17
设顺序表递增有序,编写一个算法,将数据元 素x插入表中合适位置之后,顺序表仍然保持 有序。
答案
int Orderinsert( Seqlist *L, datatype x ){
int i;
if(L->size>=maxsize){
2-16
编写一个算法,实现顺序表的定位操作:查找 在顺序表中是否存在数据元素x,若存在,则 返回表中第一个与x值相等的元素下标;若不 存在,返回-1。
答案—方法1
int Locate(SeqList L, dataype x) {
int i=0;
while(i<L.size && L.list[i]!= x)
if(La.list[a]<Lb.list[b])
Lc->list[c++]=La.list[a++];
if(La.list[a]==Lb.list[b]) {
Lc->list[c++]=La.list[a++]; b++}
}
续
If(a<La.size-1)
for(k=i;k<La.size;k++)
Lc->list[c++]=La.list[k];
If(b<Lb.size-1)
for(k=i;k<Lb.size;k++)
Lc->list[c++]=Lb.list[k];
Lc->size=k;
}
作业
利用第二种算法实现两个有序表的合并。
课外题目4
编写一个算法,实现删除顺序表中多余的值相 同的元素。
出为大王的猴子是几号 ,建立一个函数来实 现此功能.
答案
课外习题5
求两个集合的交集、并集、差集运算。