数据结构题集(C语言版)答案 - 严蔚敏编著 下载本文

q=p;

p=p->next;

q->next=pt3->next; pt3->next=q; pt3=pt3->next; } } q=L; free(q); return OK; }

在2.34至2.36题中

\异或指针双向链表\类型XorLinkedList和指针异或函数XorP定义为: typedef struct XorNode { char data;

struct XorNode *LRPtr; } XorNode *XorPointer;

typede struct { //无头结点的异或指针双向链表 XorPointer Left

Right; //分别指向链表的左侧和右端 } XorLinkedList;

XorPointer XorP(XorPointer p XorPointer q);

// 指针异或函数XorP返回指针p和q的异或值 2.34 假设在算法描述语言中引入指针的二元运算\异或\若a和b为指针

则a⊕b的运算结果仍为原指针类型 且

a⊕(a⊕b)=(a⊕a)⊕b=b (a⊕b)⊕b=a⊕(b⊕b)=a

则可利用一个指针域来实现双向链表L

链表L中的每个结点只含两个域:data域和LRPtr域

其中LRPtr域存放该结点的左邻与右邻结点指针(不存在时为NULL)的异或 若设指针L.Left指向链表中的最左结点 L.Right指向链表中的最右结点

则可实现从左向右或从右向左遍历此双向链表的操作 试写一算法按任一方向依次输出链表中各元素的值

解:

Status TraversingLinkList(XorLinkedList &L char d) {

XorPointer p

left right;

if(d=='l'||d=='L'){ p=L.Left; left=NULL;

while(p!=NULL){

VisitingData(p->data); left=p; p=XorP(left p->LRPtr); } } else

if(d=='r'||d=='R'){ p=L.Right; right=NULL; while(p!=NULL){

VisitingData(p->data); right=p;

p=XorP(p->LRPtr right);

} }

else return ERROR; return OK; }

2.35 采用2.34题所述的存储结构

写出在第i个结点之前插入一个结点的算法

2.36 采用2.34题所述的存储结构 写出删除第i个结点的算法

2.37 设以带头结点的双向循环链表表示的线性表 试写一时间复杂度O(n)的算法 将L改造为

解:

// 将双向链表L=(a1 a2 ...

an)改造为(a1 a3 ... an

... a2)

Status ListChange_DuL(DuLinkList &L) {

int i;

DuLinkList p q r;

p=L->next; r=L->pre; i=1;

while(p!=r){ if(i%2==0){ q=p;

p=p->next; // 删除结点

q->pre->next=q->next; q->next->pre=q->pre; // 插入到头结点的左面 q->pre=r->next->pre; r->next->pre=q; q->next=r->next; r->next=q; }

else p=p->next; i++; }

return OK; }

2.38 设有一个双向循环链表 每个结点中除有pre data和next三个域外

还增设了一个访问频度域freq 在链表被起用之前

频度域freq的值均初始化为零 而每当对链表进行一次Locate(L x)的操作后

被访问的结点(即元素值等于x的结点)中的频度域freq的值便增1 同时调整链表中结点之间的次序

使其按访问频度非递增的次序顺序排列

以便始终保持被频繁访问的结点总是靠近表头结点 试编写符合上述要求的Locate操作的算法

解:

DuLinkList ListLocate_DuL(DuLinkList &L ElemType e) {

DuLinkList p q;

p=L->next;

while(p!=L && p->data!=e) p=p->next; if(p==L) return NULL; else{

p->freq++; // 删除结点

p->pre->next=p->next; p->next->pre=p->pre; // 插入到合适的位置 q=L->next;

while(q!=L && q->freq>p->freq) q=q->next; if(q==L){

p->next=q->next; q->next=p; p->pre=q->pre; q->pre=p; } else{

// 在q之前插入

p->next=q->pre->next; q->pre->next=p; p->pre=q->pre; q->pre=p; }

return p; } }

在2.39至2.40题中

稀疏多项式采用的顺序存储结构SqPoly定义为 typedef struct { int coef; int exp; } PolyTerm;

typedef struct { //多项式的顺序存储结构 PolyTerm *data; int last; } SqPoly;

2.39 已知稀疏多项式 其中