设头指针为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; }