1. 程式人生 > >雙向連結串列Locate( L , x )運算

雙向連結串列Locate( L , x )運算

#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 );
}