3.15自调整表:所有的插入都在表头进行,查找某元素时只需将某元素移到表头。
a、写出自调整表的数组实现
#include <stdio.h> #include <stdlib.h> #define MAX 10 typedef struct node { int* A; int length; int Max; }*List,List1;//qnode,*pnode; void init(List L) { L->A=(int*)malloc(MAX*sizeof(int)); L->Max=MAX; L->length=0; for(int i=0;i<L->Max;i++) L->A[i]=-1; } void Insert(List L,int x) { int i; if(L->Max<=L->length) printf("out of space!"); else { if(L->A[0]==-1) { L->A[0]=x; L->length++; } else { for(i=L->length-1;i>=0;i--)//把所有数字往后移动一个位置 L->A[i+1]=L->A[i]; L->A[0]=x; L->length++; } } } void PrintList(List L) { for(int i=0;i<L->length;i++) printf("%d",L->A[i]); } void Find(List L,int x) { int i=0; while(L->A[i]!=x&&L->A[i]!=-1) i++; if(L->A[i]==x) { for(int j=i;j>=0;j--) L->A[j]=L->A[j-1]; L->A[0]=x; } else{ printf("out of space!");} } int main() { List1 L; init(&L); Insert(&L,1); Insert(&L,2); Insert(&L,3); Insert(&L,4); Insert(&L,5); Insert(&L,6); Find(&L,2); Find(&L,7); PrintList(&L); return 0; }
b、写出自调整表的链表实现
#include <stdio.h> #include <stdlib.h> typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; struct Node { int Element; Position next; }; List init() { List L; L=(List)malloc(sizeof(struct Node)); L->next=NULL; return L; } void Insert(List L,int x) { Position pos,head; head=L; pos=(List)malloc(sizeof(struct Node)); pos->Element=x; if(head->next==NULL) { head->next=pos; pos->next=NULL; } else { pos->next=head->next; head->next=pos; } } void PrintList(List L) { Position pos=L->next; while(pos!=NULL) { printf("%d",pos->Element); pos=pos->next; } } Position FindPrevious(List L,int x) { Position pos; pos=L; while(pos->next!=NULL&&pos->next->Element!=x) pos=pos->next; return pos; } Position Find(List L,int x) { Position pos,head,previous; head=L; previous=FindPrevious(L,x); if(previous->next!=NULL) { pos=previous->next; previous->next=pos->next; pos->next=head->next; head->next=pos; return pos; } else return NULL; } int main() { List L; L=init(); Insert(L,1); Insert(L,2); Insert(L,3); Insert(L,4); Insert(L,5); Insert(L,6); L=Find(L,2); L=Find(L,6); PrintList(L); return 0; }