1.试写一算法,对单链表实现就地逆置
Status LinkCovert(LinkList &h)
{
//假设有有头结点,h为指向头结点的指针,只需将头结点后结点依次加入新链,加入总是放在新链的首元素位置上
p = h->next;h->next = NULL;
while(p){q = p; p = p->next; q->next = h ->next;
h-> next = q ;}
return OK;}//Linkconvert
}
把q插入到h->next实现逆序
2.设有一个双向循环链表,,每个结点当中除了有prior,data,next之外,还有一个访问频度freq,在依次LOCATE操作之后,freq就加1,同时调整链表中结点的顺序,使其按照访问频次非递增的顺序排列,试编写符合上述要求的locate操作算法:
分析:
----定义数据结构
typedef struct DuLNode{
ElemType data;
int freq;
struct DuLNode *prior;
striuct DuLNode *next;
}DuLNode,*DuLinkList;
--访问值为x的结点,并使freq++
--调整顺序:找到第一个频度比x结点大的结点
Status Locate(&L,x)
{
P = L->next;
While(p!=L && p->data<>x)p=p->next; //p不是最后一个结点而且p得data不是x,就往后移动,找x
if(p=L) error;
p->freq++;//访问的频率+1
if(p->prior !=L) && (p->prior->freq<p->freq)//如果prior不是L,而且prior-freq比freq小
{
q = p->prior;
q->next = p->next;
p->next->prior =q //将p结点从链表中断开
While((q<>L)&&(q->freq<p->freq)) q = q->prior;//找到p结点应该链接的位置,往前
//将p结点插入到q结点的后面,两句话是把p插入到q之后
p->next = q->next;p->prior = q;
q->next->prior=p;q->next=p;
}
}