数据结构教材勘误表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构(c语言版)清华大学出版社秦锋主编

勘误(红色字体为修改后的内容)

1.教材30页

算法描述如下(假定顺序表A和B的存储空间足够):

void Inter_sec (PSeqList A, PSeqList B )

{ /*求集合A和B的交集,入口参数:指向顺序表的指针,返回值:无,结果存放在顺序表A中*/ int i=0;

while(ilength)

{

if(!Location_Seqlist(B,A->data[i]))/*B中无A->data[i]*/

Delete_SeqList(A,i+1);

else i++;/*考察下一个元素*/

}

}

2.教材43页

算法如下:(考虑m=1的特殊情况)

int josephus_ LinkList (LinkList josephus_Link, int s, int m)

{ /*求约瑟夫问题的出列元素序列,入口参数:已经存放数据的链表头指针,起始位置s,从1报数到m,出口参数:1表示成功,0表示表中没有元素*/

LinkList p,pre;/*p指向当前结点,pre指向其前驱结点*/

int count;

if ( ! josephus_Link)

{ printf(“表中无元素”);

return (0);

}

/*找第s个元素*/

p= josephus_Link;

for(count=1;countnext;

printf(“输出约瑟夫序列:”);

while ( p!=p->next) /*输出n-1个结点*/

{ pre=p->next;

while(pre->next!=p)pre=pre->next;/*pre指针初始化,pre是p的前驱指针*/ for(count=1;count

{ pre=p;

p=p->next;

} /*for*/

printf(“%d\t”, p->data);

pre->next=p->next;

free(p);

p=pre->next;

}/*while*/

printf(“%d\t”,p->data); /*输出最后一个结点*/

free(p);

return 1;

}

算法2.17

该算法时间复杂度是O(n*m)。

3.教材45页

算法如下:

void Add_Polynomial(P_Polynomial P1, P_Polynomial P2)

{/*两个一元多项式P1,P2求和,求和的结果保存到P1中*/

P_Polynomial Pre_Item,Cur_Item1, Cur_Item2;/*分别保存扫描过程中的P1的前一分量,当前分量及P2的当前分量*/

Pre_Item=P1; Cur_Item1=P1->next; Cur_Item2=P2->next;

while(Cur_Item1&&Cur_Item2) /*多项式P1,P2没有扫描完*/

{

if(Cur_Item1->e == Cur_Item2->e)

{

Cur_Item1->p= Cur_Item1->p+ Cur_Item2->p;

if(Cur_Item1->p == 0)

{

Pre_Item->next= Cur_Item1->next;

free(Cur_Item1);

Cur_Item1=Pre_Item->next;/*合并后系数为零,释放当前分量*/

Cur_Item2= Cur_Item1->next;

}

else

{

Pre_Item=Cur_Item1;

Cur_Item1=Cur_Item1->next;

Cur_Item2=Cur_Item2->next;/*同时扫描下一项*/

}

}/*第一种情形,P1和P2当前项的指数相等*/

else

if(Cur_Item1->e < Cur_Item2->e)

{

Pre_Item=Cur_Item1;

Cur_Item1=Cur_Item1->next;

} /*第二种情形,P1当前项的指数小于P2的当前项指数*/

else /* 第三种情形:Cur_Item1->e > Cur_Item2->e 时将多项式P2的当前分量加入到P1中*/

{

P_Polynomial temp;

if(! (temp=( P_Polynomial)malloc(sizeof(Polynomial))))

{

printf(“内存不足!\n”);

exit(0);

}

temp->p=Cur_Item2->p;

temp->e=Cur_Item2->e; /*复制P2当前分量*/

temp->next=Cur_Item1;

Pre_Item->next=temp;

Pre_Item=Pre_Item->next; /*复制的当前分量插入P1中*/

Cur_Item2=Cur_Item2->next;

}/*end else*/

} /*end while*/

while(Cur_Item2) /*如果P2没有扫描完*/

{

P_Polynomial temp;

if(!( temp=( P_Polynomial)malloc(sizeof(Polynomial)))) {

printf(“内存不足!\n”);

exit(0);

}

temp->p=Cur_Item2->p;

temp->e=Cur_Item2->e;

temp->next=NULL;

Pre_Item->next=temp; /*将复制的当前分量加到P1的尾部*/

Pre_Item=Pre_Item->next;

Cur_Item2=Cur_Item2->next;

}

} /*end Add_Polynomial */

算法2.18

4.教材197页

算法如下:

#define m 6 /* 迷宫的实际行 */

#define n 8 /* 迷宫的实际列 */

int path(int maze[m+2][m+2],item *move)

{ /* maze 迷宫数组,move指向坐标增量数组的指针,item见【例3.2】(m,n)为迷宫出口点*/

sqtype sq[NUM+1];

int front,rear;

int x,y,i,j,v;

front=rear=0;

sq[0].x=1; sq[0].y=1; sq[0].pre=-1; rear++; /*入口点入队*/

maze[1][1]=-1; /*走过的位置做标记*/

while (front

{

x=sq[front].x ; y=sq[front ].y ; /*取队头元素,但不出队列*/ for (v=0;v<4;v++) /*向四个方向探测*/

{

i=x+move[v].x;

j=y+move[v].y;

if (maze[i][j]==0) /*判断当前方向能走通?*/

{ /*能走通,将新的点进队列*/

sq[rear].x=i;

相关文档
最新文档