最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
C语言双向链表实现根据使用频率安排元素位置的功能实例代码
时间:2022-06-25 04:36:19 编辑:袖梨 来源:一聚教程网
C语言双向链表应用
前言:
平时使用音乐播放器时,播放列表中的歌曲可以很方便地进行增添,删除,去重等操作。但其本质都可以抽象成一个双向链表。为了更方便用户的使用,我认为还可以增加一个将最常播放的音乐放在播放列表的头部的功能,那么如何实现呢?
请看代码:
代码如下 | 复制代码 |
#include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedefintstatus; typedefintelemtype; typedefstructnode{ elemtype data; intfreq; structnode * next; structnode * prior; }node; typedefstructnode* 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)) returnERROR; /*这一步很关键*/ (*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) returnTRUE; else returnFALSE; }
/*尾插法创建链表*/ status createdlinklist(dlinklist head,dlinklist tail,elemtype data){ dlinklist pmove=head,qmove=tail,pinsert; pinsert=(dlinklist)malloc(sizeof(node)); if(!pinsert) returnERROR; 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; returnOK; }
/*按使用频次排序*/ 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"); returnERROR; } else{ pmove->freq++; qmove=pmove->prior; while(qmove!=head&&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之后 } } }
intmain(void){ dlinklist head,tail,pmove=head; inti=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(inti=0;i<3;i++){ locateorder(head,tail,6); } traverselist(head,tail); printf("各元素使用频率为n"); traverselist2(head,tail); } |
相关文章
- 《尼尔:机械纪元》武器黑之倨傲属性及特殊能力介绍 11-15
- 《尼尔:机械纪元》机械生命体的枪获得方法介绍 11-15
- 《尼尔:机械纪元》武器机械生命体的枪属性及特殊能力介绍 11-15
- 《尼尔:机械纪元》天使之圣翼获得方法介绍 11-15
- 《尼尔:机械纪元》武器天使之圣翼属性及特殊能力介绍 11-15
- 《尼尔:机械纪元》武器恶魔之秽牙属性及特殊能力介绍 11-15