- 4
- 0
- 约2.8千字
- 约 5页
- 2023-01-06 发布于上海
- 举报
第一章 绪论习题解答
1.3 (1)~(5) O(n) O(n) O(n) O( ) O(1)
1.5
第二章 线性表习题解答
2.3设线性表存于A[arrsize]的前elenum个分量中,且递增有序。请设计一个算法,将x插入到线性表的适
当位置上,以保持线性表的有序性,并且分析算法的时间复杂度。
[题目分析] 在递增有序的顺序表中插入一个元素x ,首先应查找待插入元素的位置。查到插入位置后,如
果插入位置ielenum-1 ,则需要从此位置直到线性表尾依次向后移动一个元素位置,如果插入位置
i=elenum,则不需要后移,直接将元素x插入即可。
方法一,直接利用题目已知条件编写程序。不进行线性表的结构体定义。(不推荐)
void Insert(ElemType A[], int n, ElemType x)
/* A是有n个元素空间目前仅有elenum (elenumn)个元素的线性表。本算法将元素x插入到线性表中,
并保持线性表的有序性。*/
{int i,j;
if(elenu²耀=n) printf(error!);
else
{
i=0;
while(A[i]x) i++;
/*跳出循环后,i为待插入的位置。A[i]~A[elenum-1]都要后移一个位置,如果ielenum则不用后移,for循
环自动跳过*/
for(j=elenum-1;j=i;j--)
A[j+1]=A[j];
A[i]=x;
elenum++;
}
}
查找插入点时需要平均比较次数与移动元素的平均比较次数的时间复杂度都是O(n).所以整个算法的时间
复杂度为O(n).
方法二:按照书上顺序表结构体的定义来做。
typedef int elemtype;
typedef struct
{ elemtype A[arrsize];
int elenum;
}sequenlist;
void insertlist(L,x)
sequenlist *L;
elemtype x;
{
int i,j;
if(L-elenum arrsize) printf(error!); return;
for(i=0;i=L-elenum-1;i++)
if(xL-A[i]) break;
for(j=L-elenum-1;j=i;j--)
L-A[j+1]=L-A[j];
L-A[i]=x;
L-elenum++;
}
2.6.设有一个线性表L=(a1,a2, ….an)。试设计一个算法,将线性表逆置,即使元素次序颠倒,成为L′=(
an,an-1,…. a2,a1)。要求不重新开辟存储空间,并且用顺序表、单链表两种方法存储表示。
(1)逆置顺序表
基本思想:当顺序表的长度n为偶数时,以表的中线为对称轴,进行镜像交换,可以达到逆置的目的。
当顺序表的长度n为奇数时,以最中间的数据元素为轴做镜像交换即可实现就地逆置,最中间的数据元
素不做交换。综合两种情况,只需镜像交换表中的第一个元素到第 个元素。
typedef struct /*顺序表的结构体定义*/
{elemtype vec[MAXSIZE];
int last; /*顺序表中最后一个元素在数组中的下标*/
}sequenlist;
void diverse(sequenlist *L)
{int i,mid,temp;
mid=((*L).last+1)/2; /*注意这里的mid为整型,相当于mid */
for(i=0;ij;i++)
{temp=(*L).vec[i];
(*L).vec[i]=(*L).vec[(*L).last-i];
(*L).vec[(*L).last-i]=temp;
}
}
(2)逆置单链表
方法一:基本思想:该算法的核心思想就是修改每个结点的指针域。a1做为最后一个结点,其后继要置
为空。a2…an结点的后继指针全部修改,指向其前驱。在修改指针的过程中,要注意:
逆置后会使得原来指向后继结点的指针被破坏,扫描进行不下去,为此修改指针前要保留该结点的后
继结点的地址。
逆置须将结点p的前驱结点的地址填入结点p的指针域,因此要保存P的前驱结点的地址。
全部逆置后,头结点的指针域要指向原表的终端结点。
单链表逆置前后指针域变化情况如下:
void diverse(linklist *L)
{linklist *p,
原创力文档

文档评论(0)