List-DuLinkedList-双向循环链表-Locate(L,x)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 #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); }

相关文档
最新文档