List-DuLinkedList-双向循环链表-Locate(L,x)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
List-DuLinkedList-双向循环链表-Locate(L,x)
2.38 设有一个双向循环链表,每个结点中除了有prior、data和next三个域外,还增设了一个访问频度域freq。在链表被启用之前,频度域freq的值均初始化为零,而每当对链表进行一次Locate(L, x)的操作后,被访问的结点(即元素值等于x的结点)中的频度域freq的值便增加1,同时调整链表中结点之间的次序,使其按访问频度非递增的次序顺序排列,以便始终保持被频繁访问的结点总是靠近表头结点。试编写符合上述要求的Locate操作的算法。#include
typedef struct LinkNode { //双向循环链表
char data;
struct LinkNode *prior;
struct LinkNode *next;
int freq;
} DuLNode, *DuLinkedList;
void createLinkedList(DuLinkedList &L, int n) { //创建双向循环链表
int i; DuLinkedList p;
L = (DuLinkedList)malloc(sizeof(DuLNode));
L->next = L->prior = L; L->freq = 0;
for(i=n; i>0; i--) {
p = (DuLinkedList)malloc(sizeof(DuLNode));
scanf("%c",&(p->data));
p->freq = 0; p->prior = L; p->next = L->next;
L->next->prior = p; L->next = p;
}
}
void printList(DuLinkedList L) { //打印双向循环链表
DuLinkedList p = L->next;
while(p != L) {
printf("节点值%c,使用频率为%d。\n", p->data, p->freq); p = p->next;
}
}
void locate(DuLinkedList &L, char x) { //查找位置,并变换位置
DuLinkedList q , p = L->next;
while(p != L && p->data != x) p = p->next;
if(p == L) return ;
p->freq += 1; q = p->prior;
while(q->freq < p->freq && q != L) {
p->prior = q->prior; q->next = p->next; q->prior->next = p; p->next->prior = q;
q->prior = p; p->next = q; q = p->prior;
}
}
void main() {
DuLinkedList L; int n;
printf("请输入节点的个数:"); scanf("%d", &n);
printf("请输入%d个节点的值:\n", n);
char c = getchar(); //目的:消除上一次的回车符
createLinkedList(L,n);
printf("-----------------------\n"); printList(L); locate(L, 'c');
printf("\n查找一次c以后,结果按使用频率有序排列:\n\n"); printList(L); }