1 
2、(1)×(2)×(3)√
3、(1)A(2)C(3)C
5、计算下列程序中x=x+1得语句频度
  for(i=1;i<=n;i++)
for(j=1;j〈=i;j++)
  for(k=1;k〈=j;k++)
    x=x+1;
【解答】x=x+1得语句频度为:
T(n)=1+(1+2)+(1+2+3+……+(1+2+……+n=n(n+1)(n+2)/6
6、编写算法,求 一元多项式pn(x)=a+a1x+a2x2+……、+anxn得值pn(x0),并确定算法中每一语句得执行次数与整个算法得时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数.注意:本题中得输入为ai(i=0,1,…n)xn,输出为n(x0 算法得输入与输出采用下列方法
1)通过参数表中得参数显式传递
2)通过全局变量隐式传递。讨论两种方法得优缺点,并在算法中以您认为较好得一种实现输入输出.
【解答】
1)通过参数表中得参数显式传递
     优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用性强,移置性强。
    缺点:形参须与实参对应,且返回值数量有限。
()通过全局变量隐式传递
优点:减少实参与形参得个数,从而减少内存空间以及传递数据时得时间消耗
 缺点:函数通用性降低,移植性差
算法如下:通过全局变量隐式传递参数
PolyValue()
{ int i,n;
float x,a[],p;
  printf(“\nn=”);
  scanf(“%f”,&n);
  printf(“\nx=”);
  scanf(“%f”,&x);
for(i=0;i<n;i++)
  scanf(“%f ",&a[i]);    /*执行次数:n */
      p=a[0];
      for(i=1;i<=n;i++)
{  p=p+a[i]*x;          /*执行次数:n*/
     x=x*x;}
printf(“%f”,p);
  }
算法得时间复杂度:T(n)=O(n)
通过参数表中得参数显式传递
float  PolyValue(float  a[ ],  float  x,  int  n)
 {
float p,s;
int i;
p=x; 
s=a[0];
for(i=1;i<=n;i++)
{s=s+a[i]*p;            /*执行次数:n*/ 
p=p*x;}
return(p);
}
算法得时间复杂度:T(n)=O(n)
2 线性表
 
1、填空:
(1)在顺序表中插入或删除一个元素,需要平均移动一半元素,具体移动得元素个数与插入或删除得位置有关。
(2)线性表有顺序与链式两种存储结构.在顺序表中,线性表得长度在数组定义时就已经确定,就是静态保存,在链式表中,整个链表由“头指针”来表示,单链表得长度就是动态保存。
(3)在顺序表中,逻辑上相邻得元素,其物理位置_一定_____相邻.在单链表中,逻辑上相邻得元素,其物理位置不一定相邻。
(4)在带头结点得非空单链表中,头结点得存储位置由头指针指示,首元素结点得存储位置由头结点指示,除首元素结点外,其它任一元素结点得存储位置由其直接前趋得next指示.
2、选择题
(1) A
(2) 已知L就是无表头结点得单链表,且P结点既不就是首元素结点,也不就是尾元素结点。按要求从下列语句中选择合适得语句序列.
a、 P结点后插入S结点得语句序列就是:E、A
b、 结点前插入S结点得语句序列就是:H、L、I、E、A
c、 在表首插入S结点得语句序列就是:F、M
d、 在表尾插入S结点得语句序列就是:L、J、A、G
供选择得语句有:
A P—>next=S;
B P->next= P—〉next->next;
P->next= S—〉next;
D S—〉next= P->next;
S->next= L;
F S->next= NULL;
G Q= P;
H while (P-〉next!=Q) P=P->next;
I while (P->next!=NULL) P=P—〉next;
J P= Q;
K P= L;
L= S;
M L= P;
(3) D
(4) D
(5) D
(6) A
7试分别以不同得存储结构实现单线表得就地逆置算法,即在原表得存储空间将线性表(a1,a2,…,an)逆置为(an,an—1,…,a1
【解答】(1)用一维数组作为存储结构
    void  invert(SeqList  *L,  int  *num)
  int  j;
  ElemType  tmp;
for(j=0;j<=(*num-1)/2;j++)
{ tmp=L[j];
L[j]=L[*num-j-1];
L[*num—j—1]=tmp;}
()用单链表作为存储结构
  void  invert(LinkList  L)
  {
Node  *p, *q, *r;
    if(L-〉next ==NULL)  return;          /*链表为空*/
    p=L->next;   
    q=p—>next;               
p—>next=NULL;              /* 摘下第一个结点,生成初始逆置表 */
while(q!=NULL)            /* 从第二个结点起依次头插入当前逆置表 */
  {
r=q-〉next;
q->next=L-〉next;
L-〉next=q;
q=r;
  }
11将线性表A=(a1,a2,……am), B=(b1,b2,……bn)合并成线性表C, C=(a1,b1,……am,bm,bm+1,……、bn)  m〈=n时,或数据结构与算法第二版课后题答案 C=(a1,b1, ……an,bn,an+1,……am)m>n,线性表ABC以单链表作为存储结构,且C表利用A表与表中得结点空间构成.注意:单链表得长度值mn均未显式存储.
【解答】算法如下:
LinkList  merge(LinkList  A,  LinkList B,  LinkList  C)
{ Node  *pa, *qa, *pb, *qb, *p;
  pa=A—〉next;                    /*pa表示A得当前结点*/
  pb=B->next; 
p=A;  / *利用p来指向新连接得表得表尾,初始值指向表A得头结点*/
                 
  while(pa!=NULL  &&  pb!=NULL)  /*利用尾插法建立连接之后得链表*/
{  qa=pa->next;
qb=qb—>next;
  p->next=pa;   /*交替选择表与表中得结点连接到新链表中;*/
p=pa;
p—>next=pb;
p=pb;                       
pa=qa;
pb=qb;
if(pa!=NULL)  p—>next=pa;      /*A得长度大于B得长度*/ 
if(pb!=NULL)  p-〉next=pb;      /*B得长度大于得长度*/
C=A;   
Return(C);
实习题 
约瑟夫环问题
约瑟夫问题得一种描述为:编号1,2,…,nn个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个报数上限值m,从第一个人开始顺时针自1开始顺序报数,报到时停止报数.报m得人出列,将她得密码作为新得m值,从她在顺时针方向上得下一个人开始重新从1报数,如此下去,直至所有得人全部出列为止。试设计一个程序,求出出列顺序。利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人得编号。
例如m得初值为20n=77个人得密码依次就是:3,1,7,2,4,8,4,出列顺序为6,1,4,7,2,3,5.
【解答】算法如下:
 
typedef struct Node
int password;
int num;
struct Node *next;
}  Node,*Linklist;
 
void Josephus()
{
  Linklist L;
  Node *p,*r,*q;
  int m,n,C,j;
  L=(Node*)malloc(sizeof(Node));  /*初始化单向循环链表*/
  if(L==NULL) { printf(”\n链表申请不到空间!”);return;}
  L-〉next=NULL;
  r=L;     
  printf("请输入数据n得值(n〉0):”);
  scanf(”%d",&n);
  for(j=1;j〈=n;j++)                              /*建立链表*/
  {
        p=(Node*)malloc(sizeof(Node));
      if(p!=NULL)
        {
                printf("请输入第%d个人得密码:",j);
          scanf("%d",&C);
          p—>password=C;
          p->num=j;
          r—>next=p;
        r=p;
    }
   }
  r-〉next=L-〉next;
printf("请输入第一个报数上限值m(m〉0):”);
  scanf(”%d”,&m);
  printf("*****************************************\n");
  printf(”出列得顺序为:\n");
  q=L;
  p=L—>next;
  while(n!=1)                        /*计算出列得顺序*/
  {
          j=1;
      while(j〈m)                    /*计算当前出列得人选p*/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。