C语言双向链表实现根据使用频率安排元素位置的功能实例代码
2017-03-20 08:51
996 查看
C语言双向链表应用
前言:
平时使用音乐播放器时,播放列表中的歌曲可以很方便地进行增添,删除,去重等操作。但其本质都可以抽象成一个双向链表。为了更方便用户的使用,我认为还可以增加一个将最常播放的音乐放在播放列表的头部的功能,那么如何实现呢?
请看代码:
#include<stdio.h> #include<stdlib.h> #include<time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int status; typedef int elemtype; typedef struct node{ elemtype data; int freq; struct node * next; struct node * prior; }node; typedef struct node* dlinklist; status visit(elemtype c){ printf("%d ",c); } /*双向链表初始化*/ status initdlinklist(dlinklist * head,dlinklist * tail){ (*head)=(dlinklist)malloc(sizeof(node)); (*tail)=(dlinklist)malloc(sizeof(node)); if(!(*head)||!(*tail)) return ERROR; /*这一步很关键*/ (*head)->prior=NULL; (*tail)->next=NULL; (*head)->freq=0; (*tail)->freq=0; /*链表为空时让头指向尾*/ (*head)->next=(*tail); (*tail)->prior=(*head); } /*判定是否为空*/ status emptylinklist(dlinklist head,dlinklist tail){ if(head->next==tail) return TRUE; else return FALSE; } /*尾插法创建链表*/ status createdlinklist(dlinklist head,dlinklist tail,elemtype data){ dlinklist pmove=head,qmove=tail,pinsert; pinsert=(dlinklist)malloc(sizeof(node)); if(!pinsert) return ERROR; else{ pinsert->data=data; pinsert->prior=pmove; pinsert->next=pmove->next; pmove->next->prior=pinsert; pmove->next=pinsert; } } /*正序打印链表*/ status traverselist(dlinklist head,dlinklist tail){ dlinklist pmove=head->next; while(pmove!=tail){ visit(pmove->data); pmove=pmove->next; } printf("\n"); } status traverselist2(dlinklist head,dlinklist tail){ dlinklist pmove=head->next; while(pmove!=tail){ visit(pmove->freq); pmove=pmove->next; } printf("\n"); } /*在链表头插入元素*/ status inserthead(dlinklist head,dlinklist tail,elemtype data){ dlinklist pinsert; pinsert=(dlinklist)malloc(sizeof(node)); pinsert->data=data; pinsert->next=NULL; pinsert->prior=NULL; tail->prior->next=pinsert; pinsert->prior=tail->prior; pinsert->next=tail; tail->prior=pinsert; return OK; } /*按使用频次排序*/ status locateorder(dlinklist head,dlinklist tail,elemtype data){ dlinklist pmove=head->next,qmove; while(pmove!=tail&&pmove->data!=data) pmove=pmove->next; if(pmove==tail){ printf("未找到\n"); return ERROR; } else{ pmove->freq++; qmove=pmove->prior; while(qmove!=head&&qmove->freq<pmove->freq)//向前寻找比pmove->freq大的qmove->freq qmove=qmove->prior; if(qmove->next!=pmove){//如果找到的qmove和pmove不是直接的前驱后继关系 pmove->next->prior=pmove->prior; pmove->prior->next=pmove->next;//将pmove取下 pmove->prior=qmove; pmove->next=qmove->next; qmove->next->prior=pmove; qmove->next=pmove;//插到qmove之后 } } } int main(void){ dlinklist head,tail,pmove=head; int i=0; initdlinklist(&head,&tail); for(i=0;i<10;i++) inserthead(head,tail,i); printf("未经过排序的链表为\n"); traverselist(head,tail); printf("在按使用频率排序后的链表为:\n"); locateorder(head,tail,5); for(int i=0;i<3;i++){ locateorder(head,tail,6); } traverselist(head,tail); printf("各元素使用频率为\n"); traverselist2(head,tail); }
要实现这一功能,最重要的函数是locateorder(),其实现思路是:如果某个元素的使用频率不为0,则定义一个向链表头移动的游标,寻找一个比该元素使用频率高的元素,将该元素插到找到的元素之后即可。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
相关文章推荐
- 双向链表的应用—实现根据使用频率安排元素位置的功能
- 使用jQuery实现两个div中按钮互换位置的实例代码
- C语言之双向链表详解及实例代码
- Android使用AudioRecord实现暂停录音功能实例代码
- iOS使用自带的UIViewController实现qq加号下拉菜单的功能(实例代码)
- Python使用sftp实现上传和下载功能(实例代码)
- <C语言>如何一步一步根据简单的代码联想到更多的功能?(实现输入一个整数,输出比它小包括它本身的所有素数。)
- C语言单向动态链表程序,实现链表的建立,合并,重新排序,链表元素的插入与删除,以及根据元素成员的值进行元素删除。
- 使用vue实现grid-layout功能实例代码
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 使用PHP+MySql实现微信投票功能实例代码
- C语言双向链表的表示与实现实例详解
- C 语言 实现双向链表 模拟ArrayList功能 可追加,插入,移除,得到指定index 的元素值
- 构造双向链表根据访问频度动态调整位置_C++实现
- [Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
- c语言双向循环链表实现-使用内核链表
- C语言实现链表之双向链表(九)在任意位置插入结点
- 如何使用c语言实现双向链表的插入删除操作
- 使用JavaWeb webSocket实现简易的点对点聊天功能实例代码