第二章线性表(参考答案)
在以下习题解答中,假定使用如下类型定义:
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,则可能的出栈序列数为C2n n=(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(“链表不是中心对称”);
} // 算法结束