c实现按访问频度非递增有序的带头节点的双向链表检索关键字
2014-04-03 22:01
579 查看
问题描述:按访问频度非递增有序的带头节点的双向链表检索关键字为x的节点。对该访问频度计数,并维护该链表有序。若为找到,则插入该节点。所有节点频度初值在建表时都为零。
代码如下:
代码如下:
#include <stdio.h> #include <stdlib.h> typedef struct doublenode { char key; int freq; struct doublenode *pre,*next; } DoubleLinkNode,*DoubleLinkList; DoubleLinkList loc(DoubleLinkList head, char x) { DoubleLinkList p,q; p = head->next; head->key = x; while(p->key != head->key) p = p->next; if(p == head) //找不到关键字的节点 。新建个节点插在头结点前面 { q = (DoubleLinkList)malloc(sizeof(DoubleLinkNode)); q->key = x; q->freq = 0; q->next = p; q->pre = p->pre ; p->pre->next = q; p->pre = q; } else { q = p; q->freq++; head->freq = q->freq;// head指针的频度要修改,否则下面的while跳不出去 while(q->freq > p->pre->freq) p = p->pre;//找到当前q应该存放在的位置。p始终指向链表中比当前q频度小的最前面指针 if(p != q) { //先断开q q->pre->next = q->next; q->next->pre = q->pre; //再把q挂到p前面 q->next = p; q->pre = p->pre; p->pre->next = q; p->pre = q; } } printf("\nfinally:"); p = head->next; while(p != head) { printf("(%c,%d)",p->key,p->freq); p = p->next; } return head; } DoubleLinkList createdoublelinklist(char c[],int r[],int n) { DoubleLinkList head,p,q; int i; head = (DoubleLinkList)malloc(sizeof(DoubleLinkNode)); head->next = head; head->pre = head; p = head->next; if(n>0) { for(i = 0; i < n; i++) { while(p->next != head) p = p->next; q = (DoubleLinkList)malloc(sizeof(DoubleLinkNode)); q->key = c[i]; q->freq = r[i]; q->pre = p; q->next = p->next; p->next->pre = q; p->next = q; } } printf("original:"); p = head->next; while(p != head) { printf("(%c,%d)",p->key,p->freq); p = p->next; } return head; } int main() { DoubleLinkList head; char x,c[5]={'a','b','c','d','e'}; int r[5] = {5,3,3,2,1}; head = createdoublelinklist(c,r,5); loc(head,'a'); loc(head,'f'); loc(head,'c'); return 0; }
相关文章推荐
- 数据结构之双向带头节点带环链表的实现
- C实现带头节点带环双向链表的操作
- 构造双向链表根据访问频度动态调整位置_C++实现
- C语言实现双向非循环链表(带头结点尾结点)的节点插入
- 【C++】模板实现带头节点的双向循环链表
- 将两个递增有序的带头结点的单链表A、B合并成为一个递增有序的带头结点的单链表
- 双向循环带头节点链表
- 笔试题四:带头节点head两个链表合并,并且有序
- 将两个非递减的有序链表合并为一个非递增的有序链表(C语言编程实现)
- 【c++版数据结构】之用带头节点的单链表实现一元多项式(C语言版)
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- !-- 带头结点带环的双向链表的相关操作实现 --!
- 程序一:带头结点双向链表的简单实现
- 10实现有序双向循环链表的插入操作
- 单链表编写递增有序并集(c语言实现)
- 合并有序链表,实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。
- 带头节点的单链表的实现
- 单向链表之有序插入节点(C语言实现)
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 用模板实现顺序表和带头结点的双向循环链表