稳压二极管怎么接线:数据结构中双向循环链表的ADT表示

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/03 00:27:32
设有一个双向循环链表,每个结点除有pre,data和next三个域外,还增设了一个访问频度域freq.在链表被起用之前,频度域frep的值均为初始化为零,而每当对链表进行一次LOCATE(L,x)的操作后,被访问的结点(即元素值等于x的结点)中的频度域frep的值便增1,同时调整链表中结点之间的次序,使其按访问频度非递增的次序顺序排列,以便始终保持被频繁访问的结点总是靠近表头结点.试编写符合上述要求的LOCATE操作的算法.

现在只要给出解决问题所用到的主要数据结构的ADT表示

参考算法如下
首先在链表中查找元素值为X的结点,若找到则让freq域的值增1;然后
依次和它的前趋的freq域值比较,若比前freq域值大,和前趋结点位置交换,直到比
前趋结点的freq域值小为止。分析:
Typedef struct dfnode *dfpointer;
Struct dfnode
{datatype data;
int freq;
dfpointer prior,next;
}
typedef dfpointer dflklist;
设该双链表含头结点。
Int LOCATE_dflklist(dflklist L,datatype X)
{/*定位值等于X的结点*/
p=L->next; I=1;
while ((p!=null)&&(p->data!=X))
{o=p->next; I++;}
if ((p->data!=X||(p= = null)) error("不存在值为X的结点 ");
else { p->freq++; /*令元素值为X的结点中freq域的值增1*/
q=p->prior;
while((q!= L)&&(q->freq<p->freq))
{I=I-1;
p->prior->next=p->next; /*摘除p*/
p->next->prior=p->prior;
q->prior-<next=p /*在q前插入p*/
p->prior=q->prior;
p->next=q;
q->prior=p;
q=p->prior; /*q重新指向p的前趋*/
}
return(i);
}