39-20

发布时间 2023-10-08 22:13:40作者: 正确选项

设头指针为L的带头结点的双向非循环链表,结点类型定义如下,count指被访问次数。

typedef struct node{
    int data;
    int count;
    struct node *pre,*next;
}LNode,*LinkList;

Locate(L,x)函数,x为结点值,每访问一次访问次数加一,该函数返回值为结点指针类型。

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int data;
    int count;
    struct node *pre,*next;
}LNode,*LinkList;

void CreateList(LinkList &L)
{
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    L->pre=NULL;
    LNode *p=L;
    int x;
    scanf("%d",&x);
    while(x!=999)
    {
        LNode *node=(LNode*)malloc(sizeof(LNode));
        node->count=0;
        node->data=x;
        node->next=NULL;
        node->pre=p;
        p->next=node;
        p=node;
        scanf("%d",&x);
    }
}

void displayList(LinkList L)
{
    LNode *p=L->next;
    while(p)
    {
        printf("%d  count:%d\t",p->data,p->count);
        p=p->next;
    }
}

LNode* Locate(LinkList L,int x)
{
    LNode *p=L->next;
    while(p)
    {
        if(p->data==x)
            return p;
        else
            p=p->next;
    }
}

void Sort(LinkList &L)
{
    LNode *p=L->next,*r,*prior;
    L->next=NULL;
    while(p)
    {
        r=p->next;
        prior=L;
        while(prior->next!=NULL&&prior->next->count>p->count)
            prior=prior->next;
        p->next=prior->next;
        prior->next=p;
        p->pre=prior;
        p=r;
    }
}

void Count(LinkList &L)
{
    int y;
    LNode *node;
    scanf("%d",&y);
    while(y!=999)
    {
        node=Locate(L,y);
        node->count++;
        Sort(L);
        displayList(L);
        printf("\n");
        scanf("%d",&y);
    }
}

int main()
{
    LinkList L;
    CreateList(L);
    displayList(L);
    printf("\n");
    Count(L);    
    return 0;
}