国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C語言雙向鏈表實現(xiàn)根據(jù)使用頻率安排元素位置的功能實例代碼

2020-05-23 13:49:03
字體:
供稿:網(wǎng)友

C語言雙向鏈表應用

前言:

平時使用音樂播放器時,播放列表中的歌曲可以很方便地進行增添,刪除,去重等操作。但其本質(zhì)都可以抽象成一個雙向鏈表。為了更方便用戶的使用,我認為還可以增加一個將最常播放的音樂放在播放列表的頭部的功能,那么如何實現(xiàn)呢?

請看代碼:

#include<stdio.h>#include<stdlib.h>#include<time.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef 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;  /*這一步很關(guān)鍵*/   (*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;} /*尾插法創(chuàng)建鏈表*/ 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不是直接的前驅(qū)后繼關(guān)系      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("未經(jīng)過排序的鏈表為/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);}

要實現(xiàn)這一功能,最重要的函數(shù)是locateorder(),其實現(xiàn)思路是:如果某個元素的使用頻率不為0,則定義一個向鏈表頭移動的游標,尋找一個比該元素使用頻率高的元素,將該元素插到找到的元素之后即可。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 太保市| 昌都县| 揭阳市| 武强县| 台中市| 旬阳县| 定结县| 杭锦后旗| 贞丰县| 石景山区| 霞浦县| 赤壁市| 乐昌市| 辽宁省| 山西省| 株洲县| 西丰县| 南宫市| 江孜县| 磴口县| 福海县| 通城县| 建水县| 道真| 长春市| 晋江市| 新宁县| 永川市| 房产| 玉田县| 吉林省| 仪征市| 绥化市| 遂昌县| 土默特右旗| 仁化县| 贵州省| 民乐县| 同德县| 穆棱市| 霍林郭勒市|