雙向連結串列Locate( L , x )運算
阿新 • • 發佈:2019-01-07
#include <stdio.h> #include <stdlib.h> typedef struct DNode{ int data ; int freq; struct DNode *next, *prior ; }DNode , *DinkList; DinkList Createlist( DinkList L){ int num ; DNode *p , *r = L ; printf("請輸入資料:\n"); scanf("%d",&num) ; while( num!=-1 ){ p = (DNode *)malloc(sizeof(DNode)); p->data = num ; p->freq =0; r->next = p ; p ->prior = r ; r = p ; scanf("%d",&num) ; } r->next = L ; //將尾指標指向頭結點,頭指標指向尾結點 L->prior = r; return L ; } void ViewLinklist( DinkList L ){ DNode *p = (DNode *)malloc(sizeof(DNode)); p = L->next ; printf("迴圈雙鏈表為:"); while( p->next!=L ){ printf("%d ->",p->data); p = p->next ; } printf("%d",p->data); } DinkList Locate( DinkList L , int x){ DNode *p = L->next ,*q ; while(p!=NULL&&p->data!=x) p=p->next; if(!p) printf("該節點不存在"); else{ p->freq++; p->next->prior = p->prior ; //將節點p摘下 p->prior->next = p->next ; q=p->prior ; while(q!=L&&q->freq<=p->freq) //插入到同頻度的第一個 q = q->prior ; p->next = q->next ; q->next->prior = p ; p->prior = q ; q->next = p ; } return p; } int main() { int data ; DinkList L = (DinkList )malloc(sizeof(DNode)); Createlist( L ) ; ViewLinklist(L ); printf("\n"); printf("請輸入查詢資料:"); scanf("%d",&data); Locate(L,data); ViewLinklist(L ); }