2024年1月5日发(作者:)
第二章 线性表(参考答案)
在以下习题解答中,假定使用如下类型定义:
2.1 头指针:指向链表的指针。因为对链表的所有操均需从头指针开始,即头指针具有标识链表的作用,所以链表的名字往往用头指针来标识。如:链表的头指针是la,往往简称为“链表la”。
头结点:为了链表操作统一,在链表第一元素结点(称为首元结点,或首结点)之前增加的一个结点,该结点称为头结点,其数据域不无实际意义(当然,也可以存储链表长度,这只是副产品),其指针域指向头结点。这样在插入和删除中头结点不变。
开始结点:即上面所讲第一个元素的结点。
2·5
void insert(linklist *L,ElemType x)
// 带头结点的单链表L递增有序,本算法将x插入到链表中,并保持链表L的递增有序。
{ linklist *p=L->next, *pre=L,*s;
// p为工作指针,指向当前元素,pre为前驱指针,指向当前元素的前驱
s=(linklist *)malloc(sizeof(linklist));//申请空间,不判断溢出
s->data=x;
while (p && p->data<=x) {pre=p; p=p->next;} // 查找插入位置
pre->next=s; s->next=p; // 插入元素
} // 算法结束
2·9
void deleteprior(linklist *L)
// 长度大于1的单循环链表,既无头结点,也无头指针,本算法删除*s 的前驱结点
{ linklist *p=s->next,*pre=s; // p为工作指针,指向当前元素,
// pre为前驱指针,指向当前元素*p的前驱
while (p->next!=s) {pre=p; p=p->next;} // 查找*s的前驱
pre->next=s;
free(p); // 删除元素
} // 算法结束
第三章 栈和队列(参考答案)
3.1 1234四辆车进栈,写出出战顺序?
1 2 3 4 2 1 3 4 3 2 1 4 4 3 2 1
1 2 4 3 2 1 4 3 3 2 4 1
1 3 2 4 2 3 1 4 3 4 2 1
1 3 4 2 2 3 4 1
1 4 3 2 2 4 3 1
设入栈序列元素数为n,则可能的出栈序列数为C2nn=(1/n+1)*(2n!/(n!)2)
3.3 void sympthy(linklist *head, stack *s)
//判断长为n的字符串是否中心对称
{ int i=1; linklist *p=head->next;
while (i<=n/2) // 前一半字符进栈
{ push(s,p->data); p=p->next; }
if (n % 2 !==0) p=p->next;// 奇数个结点时跳过中心结点
while (p && p->data==pop(s)) p=p->next;
if (p==null) printf(“链表中心对称”);
else printf(“链表不是中心对称”);
} // 算法结束
3.4
int match()
//从键盘读入算术表达式,本算法判断圆括号是否正确配对
(init s;//初始化栈s
scanf(“%c”,&ch);
while (ch!=’#’) //’#’是表达式输入结束符号
switch (ch)
{ case ’(’: push(s,ch); break;
case ’)’: if (empty(s)) {printf(“括号不配对”); exit(0);}
pop(s);
}
if (!empty(s)) printf(“括号不配对”);
else printf(“括号配对”);
} // 算法结束
第四章 串 (参考答案)
4.4 将S=“(xyz)*”转为T=“(x+z)*y”
S=concat(S, substr(S,3,1)) // ”(xyz)*y”
S=replace(S,3,1,”+”) // ”(x+z)*y”
第五章 多维数组和广义表(参考答案)
5.1 按行优先顺序列出A[2][3][2][3]所有元素在内存中的存储次序
A[2][3][2][3]
A0000 , A0001 , A0002
A0010 , A0011 , A0012
A0100 , A0101 , A0102
A0110 , A0111 , A0112
A0200 , A0201 , A0202
A0210 , A0211 , A0212
将第一维的0变为1后,可列出另外18个元素。以行序为主(即行优先)时,先改变右边的下标,从右到左进行。
5.2 求三维数组按行优先顺序存储的地址计算公式?
设各维上下号为c1„d1,c2„d2,c3„d3,每个元素占l个单元。
LOC(aijk)=LOC(ac1c2c3)+[(i-c1)*(d2-c2+1)*(d3-c3+1)+(j-c2)*(d3-c3+1)+(k-c3)]*l
推广到n维数组!!(下界和上界)为(ci,di),其中1<=i<=n.则:其数据元素的存储位置为:
LOC(aj1j2….jn)=LOC(ac1c2…cn)+[(d2-c2+1) „(dn-cn+1)(j1-c1)+(d3-c3+1) „(dn-cn+1)
n
(j2-c2)+„+(dn-cn+1)(jn-1-cn-1)+(jn-cn)]*l=LOC(ac1c2c3)+ ∑αi(ji-ci)
n
i=1
其中αi∏(dk-ck+1)(1<=i<=n)
k=i+1
若从c开始,c数组下标从0开始,各维长度为bi(1<=i<=n)则:
LOC(aj1j2…jn)=LOC(a00…0)+(b2* b3*„* bn*j1+ b3* „* bn*+ j2„+ bn* jn-1+ jn)*l
n
=LOC(a00…0)+ ∑αiji 其中:αi=l,α
5.3 (1) k=2*i+j ( 0<=k<3n-2 )
(2) i=(k+1)/3 ( 0<=k<3n-2 )
j=k-2*i
5.4
void saddlepoint(int a[m][n]);
// a是m行n列的二维数组,本算法求所有马鞍点
// b是一维数组,存放一行中可能的马鞍点的列值,k记相等值个数
// c是一维数组,存放某列可能马鞍点的行值,kk记相等值个数
解法3: 设定两个数组: -1] 记各列的最大值所在行号
-1] 记各行的最小值所在列号
第j 列的最大值为A[max[j]][j],第i行的最小值是A[i][min[i]]
void saddlepoint(int a[m][n]);
// a是m行n列的二维数组,本算法求所有马鞍点
发布者:admin,转转请注明出处:http://www.yc00.com/news/1704410631a1349119.html
评论列表(0条)