数组 #include <stdarg. h> #include like h #define maX array dim 8 typedef int ElemType typedef struct t ElemType base int dim: int *bounds int *constants B Array Status InitArray (array **A, int dim i int elemtotal, i va list ap if(dim<l dim>MAX ARRAY DIM)return ERROR A->dimdim: A->bounds=(int *)malloc(dim*sizeof (int)) elemtotal=l va start(ap, dim) for(i=0; i<dim: ++i) A->bounds [i]=va arg (ap, int) elemtotal *=A->bounds [il va end (ap) A->base=(ElemType *)malloc(elemtotal*sizeof (Elem Type)) A->constants=(int *)malloc(dim*sizeof (int)) A->constants [dim1]=l for(i=dim-2:i>=0:i) A->constants [i]=A-bounds [i+1]*A->constants[i+1 return OK Status DestroyArray(array *A) i if(!A->base)return ERROR free(A->base) A->base=NULL free(A->bounds) A->boundS=NULL free(A->constants): A->constants=NULL return OK Status Locate (array A, va list ap, int soff) I int i, ind; *off=0 for(i=0; i<A dim; ++i) I ind=va arg(ap, int) if(ind<ol l ind>=A bounds [i])return OVERFLOW
数组 #include <stdarg.h> #include "likec.h" #define MAX_ARRAY_DIM 8 typedef int ElemType; typedef struct { ElemType *base; int dim; int *bounds; int *constants; }Array; Status InitArray(Array *A,int dim,...) { int elemtotal,i; va_list ap; if(dim<1||dim>MAX_ARRAY_DIM)return ERROR; A->dim=dim; A->bounds=(int *)malloc(dim*sizeof(int)); elemtotal=1; va_start(ap,dim); for(i=0;i<dim;++i) { A->bounds[i]=va_arg(ap,int); elemtotal *=A->bounds[i]; } va_end(ap); A->base=(ElemType *)malloc(elemtotal*sizeof(ElemType)); A->constants=(int *)malloc(dim*sizeof(int)); A->constants[dim-1]=1; for(i=dim-2;i>=0;--i) A->constants[i]=A->bounds[i+1]*A->constants[i+1]; return OK; } Status DestroyArray(Array *A) { if(!A->base)return ERROR; free(A->base); A->base=NULL; free(A->bounds); A->bounds=NULL; free(A->constants); A->constants=NULL; return OK; } Status Locate(Array A,va_list ap,int *off) { int i,ind; *off=0; for(i=0;i<A.dim;++i) { ind=va_arg(ap,int); if(ind<0||ind>=A.bounds[i])return OVERFLOW;
off+=A constants [i]ind return OK Status Value (array A, ElemType *e i va list int result, off va start(ap, A dim) if((result=Locate(A, ap, &off))<=0)return result *e=*(A. basetoff) va enda return OK Status Assign (array A, ElemType e,.. i va list ap int result, off if((result=Locate(A, ap, &off))<=0)return result *(A va end (ap) return OK main 哈夫曼树 #includestdio. h> #define n 100 #define max 9999 typedef struct node f union char data int Ival struct node **lchild struct node *archil d: INODE NODE *creat huffman tree(char dat[, int w[, int n I NODE *TIN, *p; int nl, n2, 1, j, v, minl, min2 [TLi]=(NODE *)malloc(sizeof (NODE)) T[i]->val w=w[i] T[i]->lchild=NULL
*off+=A.constants[i]*ind; } return OK; } Status Value(Array A,ElemType *e,...) { va_list ap; int result,off; va_start(ap,A.dim); if((result=Locate(A,ap,&off))<=0)return result; *e=*(A.base+off); va_end(ap); return OK; } Status Assign(Array A,ElemType e,...) { va_list ap; int result,off; va_start(ap,A.dim); if((result=Locate(A,ap,&off))<=0)return result; *(A.base+off)=e; va_end(ap); return OK; } main() { } 哈夫曼树 #include<stdio.h> #define N 100 #define MAX 9999 typedef struct node{ union{ char data; int w; }val; struct node *lchild; struct node *rchild; }NODE; NODE *creat_huffman_tree(char dat[],int w[],int n) { NODE *T[N],*p; int n1,n2,i,j,v,min1,min2; for(i=0;i<n;i++) { T[i]=(NODE *)malloc(sizeof(NODE)); T[i]->val.w=w[i]; T[i]->lchild=NULL;
T[i]->rchild=NULL for (i=0; i<n-1; i++) minl=mAX n2=-1 min2=MAX for(j=0; j<n: j++) i if(tlj]!=NULL) I V=TLj]->valw if(v<min1) min2=minl n2=nl minl=v else if(v<min2) I min2=v p=(NODE *)malloc(sizeof (NODE)) p->val W=T[n1]->val w+T[n2]->valw p->lchild=T[nl] p->rchild=T[n2] if(T[n1]->lchild==NULL)T[n1]->val data=dat [n1 else T[n1]->val data='s' f(T[n2]->lchild==NULL)T[n2]->val data=dat [n2 else T[n2]->val data=*k T[n1 T[n2]=NULL val.data=’*2 return(p) prn BT(NODE *b) I if(b!=NULL) i printf("%c", b->val data) if(b->lchild!=NULL I printf("(") prn BT(b->lchild) prn BT(b->rchild
T[i]->rchild=NULL; } for(i=0;i<n-1;i++) { n1=-1; min1=MAX; n2=-1; min2=MAX; for(j=0;j<n;j++) { if(T[j]!=NULL) { v=T[j]->val.w; if(v<min1) { min2=min1; n2=n1; min1=v; n1=j; } else if(v<min2) { min2=v; n2=j; } } } p=(NODE *)malloc(sizeof(NODE)); p->val.w=T[n1]->val.w+T[n2]->val.w; p->lchild=T[n1]; p->rchild=T[n2]; if(T[n1]->lchild==NULL)T[n1]->val.data=dat[n1]; else T[n1]->val.data='*'; if(T[n2]->lchild==NULL)T[n2]->val.data=dat[n2]; else T[n2]->val.data='*'; T[n1]=p; T[n2]=NULL; } p->val.data='*'; return(p); } prn_BT(NODE *b) { if(b!=NULL) { printf("%c",b->val.data); if(b->lchild!=NULL) { printf("("); prn_BT(b->lchild); printf(","); prn_BT(b->rchild);
printf(")") I NODE *h hard[N]={'a’,’b intw[N]={1,3,2,4} h=creat huffman tree(d, w, 4) printf(" \n") prn BT(h) 线性表的顺序存储与实现 #"likes. h #define lIst INit size 100 #define listIncrement 10 typedef int ElemType typedef struct ElemType elem int length int listsize: sLiSt Status InitList Sq(sqList *L)I L->elem=(ElemType *)malloc(LIST INIT SIZE*sizeof (ElemType)) if(! L->elem)exit(OVERFLOW) L-length=O L->listsize=LIST INIT SIze return OK void DestroyList Sq(sqList *L)( if(→>elem){ L-length=0 L->listsize=o void ClearList Sq(sqList *L)I if(L-elem)I L->elem=(ElemType srealloc(L->elem, L->listsize*sizeof(ElemType)) L-length=0;
printf(")"); } } } main() { NODE *h; char d[N]={'a','b','c','d'}; int w[N]={1,3,2,4}; h=creat_huffman_tree(d,w,4); printf("\n"); prn_BT(h); } 线性表的顺序存储与实现 #include "likec.h" #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int ElemType; typedef struct{ ElemType *elem; int length; int listsize; }SqList; Status InitList_Sq(SqList *L){ L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L->elem)exit(OVERFLOW); L->length=0; L->listsize=LIST_INIT_SIZE; return OK; } void DestroyList_Sq(SqList *L){ if(L->elem){ free(L->elem); L->length=0; L->listsize=0; } } void ClearList_Sq(SqList *L){ if(L->elem){ L->elem=(ElemType *)realloc(L->elem,L->listsize*sizeof(ElemType)); L->length=0; } }
Status ListEmpty Sq(sqList L)( if(L. length==O)return TRUE else return False: int ListLength Sq(sqlist L)( return L length Status GetElem Sq(sqlist L, int i, ElemType *e)I if(i<ol li>=L. length)return ERROR *e=L elem[il return int LocateElem Sq(sglist L, elemType e)i int 1=0; while(i<L. length)i if(. elem[i]==e)return(i) lt return (-1) Status PriorElem Sq(SqList L, ElemType cur e, ElemType *pre e)i int 1 i=LocateElem Sq (l, cur e) if(i=-1lli==0)return FALSE *pre e=L elem[ i-1] return OK Status NextElem Sq(sqList L, ElemType cur e, ElemType *next e)i int 1 i=LocateElem Sq (l, cur e) if(i=-1lli==L length-1)return FALSE *next e=L elem[i+1 return OK Status ListInsert Sq (sqList L, int i, ElemType e)( Int J if(io i>L->length)return ERROR if(L-length==L->listsize)I L->elem=(ElemType *)realloc( L->elem,(L->listsize+LISTINCREMENT)*sizeof (Elem Type))
Status ListEmpty_Sq(SqList L){ if(L.length==0)return TRUE; else return FALSE; } int ListLength_Sq(SqList L){ return L.length; } Status GetElem_Sq(SqList L,int i,ElemType *e){ if(i<0||i>=L.length)return ERROR; *e=L.elem[i]; return OK; } int LocateElem_Sq(SqList L,ElemType e){ int i=0; while(i<L.length){ if(L.elem[i]==e)return(i); i++; } return(-1); } Status PriorElem_Sq(SqList L,ElemType cur_e,ElemType *pre_e){ int i; i=LocateElem_Sq(L,cur_e); if(i==-1||i==0)return FALSE; else{ *pre_e=L.elem[i-1]; return OK; } } Status NextElem_Sq(SqList L,ElemType cur_e,ElemType *next_e){ int i; i=LocateElem_Sq(L,cur_e); if(i==-1||i==L.length-1)return FALSE; else{ *next_e=L.elem[i+1]; return OK; } } Status ListInsert_Sq(SqList *L,int i,ElemType e){ int j; if(i<0||i>L->length)return ERROR; if(L->length==L->listsize){ L->elem=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));