数 据 结 构 东北大学 信息学院软件所 李景银 版权所有 侵权必究 二 00...

Click here to load reader

Upload: kaida

Post on 13-Jan-2016

129 views

Category:

Documents


0 download

DESCRIPTION

数 据 结 构 东北大学 信息学院软件所 李景银 版权所有 侵权必究 二 00 二年二月. 书山有路勤为径 学海无涯苦作舟. 第一章 绪论 本章概要 本章的主要内容是介绍和数据结构相关的一些初始概念、术语以及算法的描述和对其性能的评价。通过学习应当掌握: * 数据、数据元素、数据对象、数据类型、数据结构与存储结构; * 四种基本的数据结构与两种存储结构; * 用 C 语言描述算法的基本格式; * 对算法性能的评价标准; - PowerPoint PPT Presentation

TRANSCRIPT

  • 00

  • * * * C * *

    3

  • . 1(data) * 109 2 3 4

  • 2 (information)

  • 3(data element) 12026 1,C:Structxs{ Int:xh; Char:xm[10]; Char:xb[]; Int:nl; Char:jg[10]; }; Structxs xhxmxbnljg

    5

    1

    202619

  • 4data objectN={012}5 (data type) 12 6(data structure) : D ata-Structure = (D,S) DSD

  • : (logical structure)7(storage structure) (physical structure)5

  • 097421506830123456789

  • **12 7

    8

    013245678912053764981-1

  • 8 (Abstract Data Type, ADT) DSPDSDP D

  • 11 1 1 2 3 4

    1 234

  • 2 1 2 . 3 4 3 * * * * B-B+);

    10

  • 1 9 2 3 4 (algorithm) 1 1 2 3 4 5 11

  • 21.2.3.CC++3 .

  • (1) time complexity , n fn() T (n) = O(f(n))nfn fn, frequency count) (a){++x;s=0} ;(b)for(i=1;i
  • 2space complexity) SP S (n)=O(f(n))N 1 ,. 17

  • 1-2 2 18

  • 1 523456 Tav=0. 6n ; Tav = 2n ; Sax = 1.1n ; Sax = 1.5n ;

    19

  • *******C

    20

  • (Linear-list)nn0a ,a,a,,an) nn=0ai(1in),a1a2a3an-1an,a1a2,a1. a2a3 an a1 a2a1ana1an

    a1,a2 ,a3,an) Linear List =( D,R )D ={aiai D0,i= 1,2,3n,n 0 }R ={N},N ={ai-1,ai D0, i = 2,3,,n} D0

  • 1INITATE(L) L 2 LENGTH(L)L 3 GET(L,i)LI 4 PRIOR(L,elm).elm 5 NEXT(L,elm)elm 6 LOCATE(L,x)Lx 7 INSERT(L,i,b) bLi 8 DELET(L,i) Li 9 EMPTY (L) Ltrue.,false.10 CLEAR(L) L

  • Sequential storage Mapping)1 a1 a2 a3 a4 4(1)(2)242AB 0 1 2 3 4 m-1

    2- 1 a1 a2 a3 a4 ..

    2- 2 A B

    lLOC(a1)i ai LOC(ai) = LOC(a1) + (i 1) * l l>=1ii ai

  • 2 C define LIST_INIT_SIZE 100 // define LISTINCREAENT 10 // Typeset struct { ElemType *elem; // int length; // int listsize; //}SqList; = *()

  • 3 Status InitList-Sq(SqList &L) L.elem = (ElemType*)malloc(LIST-INIT-SIZE*sizeof(ElemType)); if(! L.elem)exit(OVERFLOW); // L.length = 0; // 0 L.Listsize =LIST_INIT_SIZE; // return OK; L.Listsize }

    0 1 2 3 . 99 100 101 102 L.elem

  • 4 Sq-ListLa1ai-1,ai,an) ei e1e2 0 1 i-1 i n-1 a1 a2 ai ai+1 an-1 ana1 a2 e ai+1 an an+12-4e2-3 e0 1 i-1 i n-1 n

  • Void Insertlist(seqlist *L,datatype x,int i) int j ;if (i L->length+1) Error(position error);if(L->length+1 >=Llistsize) Error( overflow);For ( j =L->length-1 ;j>= i 1;j- -) L->data[j+1] = L->data[j] ;L->data[ i-1]= xL->length+ +;

  • piin n+1 Eis = Pi(n i +1) i=1 Pi =

    1 Eis = (n i +1)=

    n+112nn+11

  • 5 15 54e. 0 1 2 3 4 (p) 5 6 7 8(q)

    a b c d f g h i1 2 a b c d e f g h i0 1 2 3 4 5 6 7 8

  • Status ListDelete-Sq(SqList &L, int i,j){if (( i L->length)) return ERROR; // for ( j = i; jlength-1; j++) L->data[j-1] = L->data[j] ; // L->length - -; // 1 return OK;N-1ON

  • qi`iNn E di= qi ( n i ) qi =

    Edi = (n i) = On

    n+11n+112ni=1ni=1n

  • 123451M 2 ----- 3 ---4 ---- ---- 5 ____

  • 6a1 a2 a3an 7 a1 a2 a3an XX.8 a1 a2 a3an 9 a1 a2 a3an X

  • 1(singly linked lists) 1(node) p C typedef struct Lnode { ElemType data; struct Lnode * next; }Lnode, *LinkList; PLinkListP->data: p ->next:

    datanext

  • 2

    P

    0 1 2 3 4 5 6 7P P 6143 1 4 3

    A4B

    3D1E

  • 3 .12

    H H=NULL .

    L

    .a b c d ea b c d e2- 5 2 -6

    . L->next=NULL L

  • 15 eat hat cat bat mat fat head11 12 13 14 15 16 17 18 19 20

    hat14

    cat20Eat11

    mat19

    fat0bat17

  • 41 *I *X*Y.

  • 1 Link List CreatListF(void) { char ch; LinkList head; // List Node * s ; //Head = NULL; // Ch= getchar(); // While ( ch!= \n) { s = (ListNode *)malloc ( size(ListNode )); // s->data = ch; // s->next =head; // head = s; ch =getchar(); {Return head;{a b c d e b c d eheadshead

  • (1)Link List CreatList R(void) { char ch; LinkList head; // Head = NULL; // P= Head; While(p->next!= NULL ) P= p->next ; s = (ListNode *)malloc ( size(ListNode )); // Ch= getchar(); // s->data = ch; // s->next= NULL ; s->next= p->next // p ->next = s;Return head;{

    b c d ehead b c d e fhead

  • (2)Link List CreatList R(void) { char ch; LinkList head; // List Node * s,*r ; // Head = NULL; r = NULL; // Ch= getchar(); // While((ch= getchar();!= \n) ){ s = (ListNode *)malloc ( size(ListNode )); // s->data = ch; s->next= NULL ; // if ( head =NULL) // head = s; else r -> next = s; r = s; {Return head;{

  • Lci i=3L d

    L 2-7 c Lbdeabcdea2-8i-1 ic

  • I-1 status ListInsert_L(LinkList &L, int i, ElemType c) { P =L; j = 0; while ( P && j< i -1) { P = P->next; ++j; } if (!P j> i-1) return ERROR; S =(LinkList) malloc (sizeof( Lnode)); S-> data = c; S->next = P->next; P->next = S; return OK; }

  • LLinkListcd

    L

    abdeabcdeL2-102-11

  • status ListInsert_L(LinkList &L ,intc ElemTyped){ p =L; q = p->next;(p while (q ->data != d && q->next != NULL) { p = q ; q = q->next ;} if (! q->data) return ERROR; s = (LinkList) malloc ( sizeof (Lnode)); s->data = c; s->next = p->next; p->next = s; Return OK; }ON

  • 5*I *X*Y

  • status ListDlete_L(LINKlIST &l,int I,ElemYype &e) { P = L; (p q =p->next; while (q->next!=NULL) { p =q;q = q->next;} p->next = q->next; e = q->data; free(q); return OK; } aabd b c d ec

  • (1)Lie status ListDlete_L(LINKlIST &l,int I,ElemYype &e) { P = L; j = 0; while ( p->next && jnext; ++ j; } if (! (p->next)j >i 1) return ERROR; q = p->next; p->next = q->next; e = q->data; free(q); return OK; } aabdei = 32-9 b c d e

  • (2)LXestatus Listdelet_L(LinkList &L ,intc ElemTyped){ p =L;( )q = p->next; (p while (q ->data != X&& q->next != NULL) { p = q ; q = q->next ;} if (! q->data) return ERROR; else c = q->data; p->next = q->next; Free(q); Return OK; }aabde b c d eLX = c

  • malloc freep qLINKLIST p= (Linklist)malloc(sizeof(Lnode)LNodePfreeqPASCALnewsdisposeq = :12345

  • 1 La,Lbmn Void UnionList_L(LinkList &La, LinkList &Lb , linklist &Lc ){ if ( m < n ) { p = La->next; Lc = La;q = Lb } else { p = Lb->next; Lc = Lb; q = La } while (! P->next) {p = p->next;} p->next = q->next; free( q); return (Lc);}

  • 2 LYstatus Listbreak_L(LinkList &L ,int y ElemTyped){ p =L;( ) q = p->next; (p while (q ->next != y && q->next != NULL) { p = q ; q = q->next ;} if (! q->next) return ERROR; else p->next = NULL; s = (LinkList) malloc ( sizeof (Lnode)); l1 = S;Return OK; }a b c d eyA byC d eLL1

  • 3 L12

    L

    L

    status ListReverse_L(LinkList &L) { P =L->next; L->next = NULL; While ( p){ s = p->next; p->next =L->next; L->next = p; p =s;} return OK;}

    abdeedba2-12

  • 1L LII 2XY 3L XY 4L 5L X6C

  • (Circular Linked List)1 Lc

    2-16 Lc->next= Lc1 (p-> next = Lc) 2qq.( p-> next = q)2 1* ** 2** *

    abde/ / /

  • 3 LCxStatus ListID_Lc(LinkList & Lc,LinkList & Lc1,ElemType x){ p = Lc; q = Lc->next;PQ while ( q->data!=x && q->next! = Lc){ p = q; q = q->next; PQ } if ( q->data != x) return ERROR; else { P ->NEXT = Lc; Lc1=(LinkList) malloc( sizeof(Lnode)); Lc1->next = q; while( q -> next != Lc) q =q->next; q ->next = Lc1; LC1 }

    }

  • (Double Linked List) 1 prioudatanexta b c dCTypedet struct DuLNode{ElemType data; Struct DuLNode *priou;Struct DuLNode *next; } DuLNode,*DuLinkList;

    P->priou: Pp->next:P2-17

  • 2Circular DuLinked List)

    LD A B C DLDPp->priou->next =p->next->priou = p.2-18 Ld->priou = Ld; Ld->next = Ld;

  • 3 PCXPLDsA b c d PP

    2-19 X

    2-20 Xpa b c dx

  • 3 Statuc ListInsert_DuL(DulinkList & Ld, p,ElemType x ) { if ( ! P ) return ERROR; if(!( s =(DuLinkList) malloc(sizeof( DuLNode))) return ERROR; s ->data = x; s->priou = p->priou; s->next = p ; p->priou->next = s; p->priou = s; p->priou = s; p->priou->next = s; return OK; } ListInsert_DuL

  • 4 Status ListDelet_DuL(DuLonkList &Ld,q,ElemType x) { if (!q ) return ERROR; q->priou->next = q-> next; q->next-> priou = q->priou; x = q->data; ferr( q ); return OK; }

    LDA b c d LDA b d

  • AB A = x +2x 4x + 3x B = 2 + 3x + 4x - x 1

  • 1 Px= p + p x + p x ++p n x P = p p p . p n N+ 1 A = ( 0, 1, 2, - 4, 3); B = (2, 3, 0,4, 0, -1 ) C = 1 + 3 X C = ( 1, 0, 0, 0..3) 1001 2 Q x = q + q x + q x +..+ q n x Q = ((q , 0),( q ,1),(q ,2).(q n ,n)) A = ((1,1),(2,2),(-4,3),(3,4)) ;B = ((2,0),(3,1) ,(4,3),(-1,5)); C = ((1,0),( 3,1000));

  • 2AB A = ((1,1),(2,2),(- 4,3),(3,4)) ; B = ((2,0),(3,1) ,(4,3),(-1,5)); Typedef sturct { float coef; coef exp next int exp;;}ElemType; 3

  • A = ((1,1),(2,2),(- 4,3),(3,4)) ; B = ((2,0),(3,1) ,(4,3),(-1,5));

    4 3Lb1 12 2-4 33 43 1-1 52 0 LaH p q3 1 2La

  • Void Addpolyn (polynomil & La,polynomil & L b) { P= La; PLa h = p; h q = L b; P =p->next; A q = q-> next; B while (!p && !q) { a =p->exp; b = q->exp; switch (* comp( a, b )) { case -1: pq h =p; p= p->Next; break; case 0: pq sum =p->coef +q-> coef; if ( sum!= 0.0){B p->coef = sum; h =p;

  • else{h->next = p->next); free (p);}0 u= q->next; free (q); q =u (case 0 p= h->next; break; case 1: pqqA u= q->next; h->next = q; h =q; q =u; break; } switch } while if (! Empty(p)) h->next= q;qA Free (Lb); } Addpolyn

  • 1L2Y3LYY4PP5P

  • 6L 7L1 8LAVLAVL

    AV

  • AB CD A B C D

  • * * * * * * *C

  • (STACK) FILOLIFOADT Stack { :D = { ai ai ElemSet, i=1,2n,n 0} R1= { ai-1,ai D,i = 2,,n}

  • topC #define STACK_INIT_SIZE 100; #define STACKINCREMENT 10; typedef struct { SElemType *bot: SElemType *top;int stacksize;} SqStack ; 3-1 a,b,c,d)

    3 2 1 0 a b c d10boottop

  • 2 mS Status InitStack(SqStack &s) { S.bot = (SElemType * ) malloc(STACK_INIT_SIZE*sizeof(SElemType)) if (!S.bot) exit( OVERFLOW); S.top = S.bot; S.stacksize = STACK_ INIT_ SIZE; return OK; } M

  • 3 ( PUSH ) 1CStatus Push (SqStack &, SElemType e) {(S if (S.top S.bot>=S.stacksize) { S.bot =( SElemType*)realloc(S.bot, (S.stacksize +STACKINCREMENT)*sizeof(SElemType)); if (!S.bot) exit (OVERFLOW); S.top =S.bot +S.stacksize; S.stacksize + =STACKINCREMENT: } *s.top ++ = e; TOP1 return OK; }

    3 2 1 0 a b c10boottop

  • 4 (pop) C Status pop (SqStack & S,SElemType & e) if (S.top == S.bot) return ERROR; e = *--S.top;1 return OK; }a b c d bcad; cadbcdba;bdac; cbda;bcad;

    10 topboot9.4 3 2 1 0D b c a

  • 5 1 ND N =N div d )* d+ N mod d(div;mod (1348) =(2504) N Ndiv 8 Nmod 8 1348 168 4 168 21 0 21 2 5 2 0 2

    2 5 0 4

  • 2 * * *( operand operator (delimiter) OP ,OPTR OPND

  • (1)OPTR#(2)OPNDOPTROPTR#3*7-2 OPTR OPND 1 # 3*7-2# PUSHOPND3 2 # 3 *7-2# PUSHOPTR* 3 # * 3 7-2# PUSHOPTR 4 # * 3 7-2# PUSHOPND7 5 # * 3 7 -2# PUSHOPTR- 6 # * - 3 7 2# PUSHOPTR2 7 # * - 3 7 2 # OPREATE7-2 8 # * 3 5 # POPOPTR 9 # * 3 5 # OPREATE3*5 10 # 15 # RETURN(GETTOP(OPND)

  • OperandType EvaluateExpression() {InitStack(OPTR);Push(OPTR,#); OPTR#InitStack(OPND); c =getchar(): While (c!=# GetTop(OPTR)!= # ) {OPTR# if (!In( c,op)) {Push((OPNDE,c) ;c =getchar();} cOPND else switch( Precede(GetTop(optr),c)) { C case :Pop(OPTR, theta);c Pop(OPND,b); Pop(OPND,a); ab Push(OPND,Operate(a,theta, b));OPND break; } switch } while return GetTop(OPND);}P543-1

  • 3

  • 6mm

    3-2

    top1 top20 1 2 3 4 m-1

  • 7 mNnm

    1 m/n FOR (i=1 ,i

  • iiii-1 if (topi ! = boti+1) ()if (topi = boti+1) ()

  • 2) *jjj+1 *i+1jii *i+1j

  • 8a b c d e a c

    edcba3-4 bot

  • 123C 4

    A c b b c3-5 ABCcca

  • 5abcd6abcde,cdbea PQPQ

  • queue)1 rear front ,q = (a1,a2,a3..an)

    a1 a2 a3 .. an 3-6 frontrear

  • 2ADT Queue {D ={ aiaiElemSet,i= 1,2,3.n,n0}R1 = {ai-1,ai D ,i =2,3,n} EnQueue(&Q,e) QeQ DeQueue(&Q,&e) QQ

  • 3 frontrearCfront=rear=011.

    a b c d ee0 1 2 3 4 5 0 1 2 3 4 5

    c d eQ. front Q. rear Q.front Q.rear 0 1 2 3 4 5 0 1 2 3 4 5 Q. frontQ. frontQ.rearQ.rear3-13

  • 64 1* Q.rear Q.rear = 0 23

    Q.fronte fe fa e f a b c d e f20 1 2 3 4 5Q.rear

    Q.rearQ. frontQ. frontQ.rearQ.rearQ.frontQ.rear

  • *1 Q.rear = Q.front 1 Q.front= Q.rear=0 Q.front Q.rearQ.front= Q.rear65Q.front Q.rear Q.front

    Q.rear A B C E D

  • 2 # define MAXQSIZE 100 typedef struct { QElemType *base; int front; int rear ; }SqQueue3 Status InitQueue(SqQueue &Q) { Q.base=(QElemType *) malloc(MXAQSIZE*sizeof(QElemType)); if (!Q.base) exit (OVERFLOW); Q.front =Q.rear = 0; return OK; }

  • 4) Status EnQueue(SqQueue &Q,QElemType e) { if((Q.rear + 1) % MXASIZE = =Q.front) return ERROR; Q.base[Q.rear] = e; Q.rear = (Q.rear+ 1)% MAXQSIZE; return OK; }

    Q.rear 0 1 0 1 0 1 7 2 7 2 7 2 6 3 6 3 6 3 5 4 5 4 5 4 A B A B D D E F E G3-14Q.frontQ.frontQ.frontQ.rearQ.rear

  • 5 Status DeQueue(SqQueue &Q,QElemType e){ if (Q.front = = Q.rear) return ERROR; e= Q.base[Q.front]; Q.front = (Q.front + 1) % MAXQSIZE; return OK; } Q.front Q.front

    G 1 2AB 3 - A B C C D G D F E F E3-15Q.frontQ.rearQ.rearQ.rear

  • 4DEQUEUE

    a1 a2 a3 .. an3-7

    0 1 2 N-1

  • 1 2 3-9 3-8

  • 521 Q .front

    CTypedef struct QNode{ QElemType data; struct Qnode *next;}Qnode, *QueuePtr;typeddef struct { QueuePtr front; QueuePtr rear : }LinkQueue;Q.rear3-12a b c dQ .frontQ.rear

  • 61 Status InitQueue (LinkQueue &Q ){ Q.front = Q.rear = (QueuePtr)malloc(sizeof(Qnode)); if( ! Qfront) exit ( OVERFLOW); Q.front->next = null; return OK;} Q.front

    Q.rear

  • 2 eQ.front

    Q.front 3-10

    Status EnQueue (LinkQueue &Q,QElemType e) { p = (QueuePtr) malloc (sizeof(Qnode)); if (! P) exit (OVERFLOW); P->Data = e; p->next = NULL; ( p->next = Q.rear->next;) Q.rear->next = p; Q.rear = p; return OK;

    epa b c da b c d

    Q.rear3-11Q.rear

  • 3)

    Status DeQueue (LinkQueue &Q, QElemType & e) { if (Q.front = = Q.rear) return ERROR; P = Q.front->next; e = p->data;P Q.front-> next = p -> next; P if(Q.rear = =p) Q.rear = Q.front;P free(p);P return OK;}

    a b c d3-12 Q.frontQ.rear

  • 7

    Typedef struct { char name[20]; char sex; F M}Typedef person datatype;person void dancepartners(person dancer[ ], int num){ int i ; person p; CreatqueueM, F;

  • LnitQueue(& Mdancers); LnitQueue(& Fdancers); for( i= 0; i < num;i + +){ p = dancer[i ]; if ( p.sex= = F) EnQueue(& Fdancers,P); else enQueue(& Mdancers, p); }Printf(The dancing partners are:\n\n);

  • while (!QueueEmpy(&F)&&!QueueEmpty(&M)){ p = Dequeue(&F); printf(%s ,p, name); p = Dequeue(&M); printf(%s \n ,p, name); } if (!QueueEmpy(&F)){ printf( ); p = Dequeue(&F); printf(%s ,p, name); } else if (!QueueEmpy(&M)){ printf( ); p = Dequeue(&M); printf(%s ,p, name);}

    }

  • 11223mm

    f C G D F E 0 1 7 2 6 3 5 421Q.rearQ.frontQ.frontQ.rear

  • (String * * * *

  • 1ZF ZF={ a bc}ZF 2 S= aabc S aabc 1 S4 2 X=0 3 Y = 1 4 aa,abc,aabS.

  • 5 1 # define MAXSTRLEN 255Typedef unsigned char Sstring[MAXSTRLEN+1] 0

  • 21 T Status StrAssign(Hstring&T,char * chars){ if(T.ch) free (T.ch); (T for (i=0,c =chars; c; ++i, ++c); if (!i) {T.ch = NULL; T.length = 0; } else { if ( !(T.ch = (char*)malloc(i* sizeof(char)))) exit (OVERFLOW); T T.ch[0.. iI-1] = chars[0.. i-1]; T T.length =i ; } return OK; }

  • 2Concat(&T,S1,S2) S1S2TSSTRNGTS1S2 S1[0] + S2[0]=MAXSTRLEN S1[0]MAXSTRLENS1[0] + S2[0] MAXSTRLENTS1S2 S1[0] = MAXSTRLEN T = S1 S1 T T

    1S1S2 2 S1S2 S1 S2 T 4-1 S1S2 3S2S2 S1 S2

  • Status Concat(Sstring&T,Sstring SI,S2){ if(S1[0] + S2[0]
  • 3SST Status StrInsret( Hstring &S,int pos, Hstring T) { if (posS.length+1) return ERROR; if (T.length){ if (!(S.ch = (char *) realloc(S,ch,(S.length+T.length) *sizeof(char)))) exit (OVERFLOW);T for (i=S.length-1; i>=pos-1; - -i) S.ch[i+T.length] = S.ch[i]; S.ch [pos-1..pos +T.length- 2] = T.ch[0..T.length-1];T S.length + = T.length; S } return ok; }ON

  • 4) Index(T,P,pos)(patten Matching) (String Matching)PPT-1PP T= t0t1t2tn-1 P =p0p1p2.pm-1 (0
  • Int NaiveStrMatch(seqString T,P){ int i,j,k; int m = p.length; P int n = t.length; T for( i= 0; i
  • int Index (Sstring S,Sstring T, int pos) { i = pos ; j =1 ; while (i
  • 5 Raplace(S, T, v) VSTSTSTS1TS2S1S2TSS = aabcabcabcaa; T = cab; V = AABB; S1 = SubString( S, 1,Index( S, T ) 1) ; S2 = SubString (S, Index (S,T)+Len( T), Len (S) - Index (S,T) -Len( T) +1)) S= Concat( S1, V, S2 ) 1Len( T ) = Len ( V ) 2) Len ( T ) Len ( V )

  • 3 #head

    head

    #define CHUNKSIZE 80 typedef struct Chunk { char ch[CHUNKSIZE]; struct Chunk *next; }

    A B C D E F G H I # # # A B C D

  • 5 1 main () { float a,b,max; scanf (%f,%f, &a,&b); if a>b max = a; else max = b; }

  • m a in ( ) { f l o a t a , b , m a x ; s c a n f ( % f , % f , &a , &b ) ; if a > b m a x = a ; e l s e m a x = b ; }

    100

  • 2 12STS TRS 3S=aabbbccaabccaabc, t =xxyy; m=ASSIGN( m,LEN(t)); i =INDEX( m,SUBSTR(S,6,LEN(t)));

  • 41234+-*/5678+-*/5SON6S=JIONX= FRANGSX7STS TRS 8SIHG=9NGJIAOTONG

  • * * * * *

  • 12 2-Array=(D, R)D={aij i=b1,b1+1, d1;j=b2,b2+1, d2 aijD}R={ROW,COL}ROW={b1id1,b2jd2-1;aijD, aij+1D}COL={b1id1-1,b2jd2;aijD, ai+1,jD}aij+1 aijai+1jaij

    ij

  • N N-Array=(D, R) D={ai1i2ij..in} j=bj,bj+1,dj;j=1,2,n,(n>0) R={R1,R2, Rn} ai1i2in D0,bj,dj bkikdkR= bjijdj-1 ai1ijin, D ai1ij+1in D

  • 2 A,aij(0i m-1)(0jn-1);

    a00 a01 a02 a0n-1 a10 a11 a12 a1n-1 A= am-10,am-11,am-12 , am-1n-1

    mn

  • 1row major order1,LOC(aij)= LO+ ((i-0)*n +(j-0))*1 LOCaij)=L0+ (i*n+j) *l (1) LOCaij)=L0+[(i-b1)*(d2-b2+1)+(j-b2)]*l(2) column major order 2LOCaij)=L0+ ((j-0)*m+(i-0 ))*l LOCaij)=L0+ (j*m+i) *l (3)LOCaij)=L0+[(j-b2)*(d1-b1+1)+(i-b1)]*l 5-1 2

    a00a10:am-10a01a11:am-11

    a00a01:a0n-1a10a11:a1n-1a20a21:a2n-11

  • 3Bb(ijk)ijk 0i1,0 j 2,0 k 5;b(000)L0b124 i

    5-2 LOC[b(124)]=L0 +[(1 0)*(2 0+1)*(5 0 +1) + (2 0)* ( 5 0 + 1) + ( 4 0) ] *1 =L0 +18 + 12 + 4= L 0 + 34LOC[ b(ijk)] = L0 +[(i- 0)*(2-0+1)*(5-0+1) +(j-0)*(5-0+1)+(k 0)]*l

    jkb000 b001 .. b003.. b005 b010 b015b020 b025 b100 b102 b105L0 b120 b121 b124 b125b110 b115

  • Bb(ijk) b1 i d1) (b2 j d2) (b3 k d3).LOCbijk)=L0+[i-b1)*(d2-b2+1)*(d3-b3+1) +(j-b2)*(d3-b3+1)+(k-b3)]*l (5)

  • 4 ANa(i1i2in) (b 1i1 d1) (b2 i2 d2), (bn in
  • 51 N NA aij = aji 1i,jn N N Nn*nnn+1/2 Sa[nn+1/2]nASa[K]aij i(i-1)/2+j -1 ij K= j(j-1)/2+i-1 i
  • ijSaaij.K = 0,12nn+1/2-1SA[K], Sa[nn+1/2]nA i(i-1)/2+j -1 ij

    a11 a21 a22 a31 an,1 an,nK=0 1 2 3 n(n-1)/2 n(n+1)/2-1 5-3 a11a21 a22a31 a32 a33an1 an2 an3.ann

  • CNNC2

  • * n*nA 1i=j. 2i=j+1. 3i=j-1 3*n-23*n-2 a[1 n,1 n]b[1 3*n-2] b[k]=a[ij]KijijK12 1)K=2*(j-1)+i a11 a12 a13 a14a21 a22 a23 a24a31 a32 a33 a34a41 a22 a43 a44 a11 a21 a12 a22 a32 a23 a33 a43 a34 a44 1 2 3 4 5 6 7 8 9 10

  • 1 A 0 0 0 0 1 0 0 0 1 0 0 3 0 0 2 0 0 0 0 0 0 A = 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 5 0 0 0 3 6*7742ijv

  • #define MAXSIZE 12500 typedef struct { int i, j; ElemType v; }Triple; typedef struct { Triple data[ MAXSIZE+1] Int mu, nu, tu; }TSM trix;

  • ijV7 a.data b.data

    5-4 ABb.dataa.data

    I j v I j v 1 5 1 2 2 1

    2 5 3 3 1 2 5 2 4 6 3 5 6 6 3 6 6 3 1 3 22 2 1 2 5 43 6 5 5 1 15 2 3

  • 2 MTMT TMT MT M ..T

  • Status TransposeMatrix M,TSMatrix & T){ (MT T.mu = M.nu; T.nu = M.mu; T.tu = M.tu; if(T.tu) { q = 1; T for(col =1;col
  • MT MTnumcpot Num[col]Mcol cpot[col]McolT cpot[1] = 1; cpot[col] = cpot[col-1]+ num[col-1] 2 col a.nuMnumcpot

    Col 1 2 3 4 5 6 7Cpot[col] 1 2 4 5 5 7 8Num[col] 1 2 1 0 2 1 0

  • Status FstTransposeSMatrix(TSMatrix M,TSMatrix &T){ T.mu =M.nu; T.nu =M.mu; T,tu =M.tu;if(T.tu) { for(col =1;col
  • 3 1

    rowcolvaldownright2

    row col val down right

  • Typedef struct OLNode{ int i, j; ElemType v; struct OLNode *right,*down; }OLNode; *Olink;Typedef struct { Olink *rhead,* chead; int mu,nu,tu; CreateSNatrix}CrossList;3M

  • Status CreateSMatrix_OL (CrossList &M){ if (M) free (M); (M scanf (&m,&n,&t); M.mu = m; M.nu = n; M.tu = t ; if(!(M.rhead =(Olink*)malloc((n+1)*sizeof(Olink))))exit(over) if (!(M. chead =(Olink*)malloc((m+1)*sizeof(Olink))))exit(over M.rhead[ ] = M.chead[ ] = null; for(scanf(&i,&j,&v);i! =0;scanf(&i,&j,&v)); if(!(p =(OLNode*)malloc(sizeof(OLNode))))exit(OVERFLOW) p->row = i ; p->col = j; p->val = v; if(Mrhead[i]= =null){ M.rhead[i] = p; p->right =null}

  • else { q = M.rhead[i];i if ( q->j > j ) { p->right = q; M.rhead[i] = p;} else{ for(q = M.rhead[i];(q->right )&& q->right->j < j;q =q->right); p->right = q->right ; q->right = p;} if(M.chead[j]= =null) { M.chead[j] = p; p->down =null} else{ q = M.chead[j]; if ( q->i >i ) {p->down = q; M.chead[j] = p;} else { for( q = M.chead[j];(q->down)&&q->down->idown;) p->down = q->down; q->down = p; } }}

  • A row col val A = M. chead[ ] down right 3 0 0 0 5 4 0 0 08 6 1 1 1 3 2 2 5 2 3 4 4 1 8 4 3 1M.rhead[ ] 4 2 6

  • M.rchead[ ] 1 1 3 2 2 5 2 3 4 4 1 8 4 3 1 4 2 60 00 00 00 04 30 11 22 33 0

  • 1 LISP LS = (a1,a2, a3. an) LS(a1,a2,a3..an)nai(1 i n) a1LShead a2,a3,an LStail

  • 1A = A 2B =e B1 (3) C = (a,( b,c,d,)) C2 (4) D = ( A,B,C) D3 = ( ( ),( e), ( a,( b,c,d))) (5) E = ( a,E ) E2 (6) F = (()) F1 1 2DABCD 3E

  • 2 1 GetHrad(B) = e; GetTail(B) = (). GetHrad(D )=A; GetTail(D) = (B, C); BC Get HeadBC = B; GetTailBC=C; Get Head((C)) = C.

  • AFAFC GetHead(C) = a; GetTail(C) =((b,c,d)) ; Get Head(GetTail(C)) = (b,c,d); GetHead((Get Head(GetTail(C))) = b; GetTail(Get Head(GetTail(C))) = ( c,d); GetHead(GetTail(Get Head(GetTail(C))) )= c; GetTail(GetTail(Get Head(GetTail(C)))) = (d); GetHead(GetTail(GetTail(Get Head(GetTail(C)))) = d.

  • 2) D

    3 5-5

    e a b c d A B CD

  • .

    tag=1 hp t p tag=0 atom

    PP->hp P->tp P ->atom Typedef enum{ATOM,LIST} ElemTag;Typedef struct GLNode { ElemTag tag; ( union { AtomType atom; struct {struct GLNode *hp,*tp;} } ; } *Glist;

  • A =NILB 1 C 1 1 0 e 0 a 1 1 1D 1 1 1

    E 1 10 a0 b 0 c 0 d1235-6

  • Typedef enum{ATOM,LIST} ElemTag;Typedef struct GLNode { ElemTag tag; ( union { AtomType atom; struct GLNode *hp,; } ; struct GLNode *tp } *Glist;P tag=1 hp tp tag=0 atom tp

  • A C B

    D

    E 5-7 1 1 1 1 1 11 0 e 0 a 1 0 b 0 c 0 d 1 0 a 1

  • 1AA[-1 2-2 3]9994A-1-12A49-15 -9-220A[60-5]3head(tail(head(((a,b),c,d))))tail(head(tail((a,(b,c,d)))))4A= ((((a))),b,(d,((f)),c),((e),g,((h)))),A5Ah

  • * * * * * * * *C

  • 1(Tree) nn>0 (Root)T1T2TnA BEF(CGHJKL M DIABCD

    J K L M6-1E F G H IA B C D

  • 2(Degree) A3B2G4EF HIJKLM6.14(Leaf)EF HIJKLMBCDG401234mm+1

    B C DE F G H IJ K L M A

  • 3(Child)(Parent) BCDAABCDBCD(Sibling) EFGHI ACGJKLMGH JKLMC

    A B C D E F G H I J K L M

  • 4(Level) . 4 0

    J K L M0 ..1 E F G H I. 32 ..3.. A1.. B C D ..2.. 4

  • 5Forest) m (m0) 6.26.1ABCD66.3

    6.3

    A A B C C B B C D E F G H I J K L M6.2

  • Tree=(root,F),Root;Fm(m>=0),F=(T1,T2,Tm),Ti=(ri,Fi)rooti;m0 RF ={| i= 1,2,m,m>0}BinaryTree)1

    6-4

  • 21 i2 i 1i=12 =2 =1j 1 j
  • 3 Tn02n2 n0=n2 +1 n11 n= n0+n1+n2 6-1BB=n-1B =n1+2n2 n-1=n1 +2n2 n= n1 +2n2+1 6-26-16-2 n0 =n2+1

  • K2-1 6.5 KN K1N6.6

    6.5 6.6

    8 9 10 11 12 13 14 15k 1 1 2 3 2 3 4 5 6 7 4 5 6 7 8 9 10 11 12

  • 11 6 4 n K2 2 - 1 < n 2 -1 2 n< 2K-1 log n K K K = log n +1K-1kK-1k 2 3 4 5 6 7 2 3 4 5 6 7 8 9

  • 5 n log n +1i1 i ni =1,i i>1,PARENT(i) i/ 2 2i>niLCHILDi2i32i +1>n i2i+1

    i i+1 2i 2i+1 2i+2 2i+3

    = i/2

  • 12N3K420 4056i2i+3

  • 1K6.7#define MAX_TREE_SIZE 100 Type TElemType SqBiTree[MAX _TREE_SIZE]0SqBiTree bt;

    6.7

    h i j k l 8 9 10 11 121 2 3 4 5 6 7 8 9 101112 13 1415 1 a2 b 3 ca b c d e f g h i j k l4 d 5 e 6 f 7 g

  • 6.86.

    2 b 3 c 10 e 11 f 2 B 3 C a b c d e fF 15 G

    5 d1 a1 A6 D 7 E

  • 6.869

    10 e 11 f1 A6D 7 E 14 F 15 G a b c 0 d 0 0 0 0 e f 0 0 0 0 1 2 3 4 5 6 7 8 9 10 1112131415 1 a2 b 3 c 5 d2 B 3 C

  • 26.106.11.

    6.10

    6.11

    lchild data rchild lchild data parent rchild A A E FdataL RAB C D E F B C D E F B C D

  • typedef struct node { ElemType data; struct node *lchild , *rchild; } BinTnode; Typedef BinTnode *BinTree;

  • 1 TraversingDLRDLRLDRLRDDRLRDLRLD R 2 1 (DLR) 1(D) 2(L) 3R abdfghce

    DL f g a b c d e h

  • 2(LDR) 1(L)2(D)3Rbfdhgaec.3) 6.12 1L 2R 3 D fhgdbeca

    A B C D E F G H

  • DLR: ABDFCEGLDR: BFDAEGCLRD: FDBGECADLR: - * a + c d / e f LDR: a*c + d e / fLRD: a c d + * e f / - A * (c + d) e / f - a + e f A B C D E F G c d * /

  • 3 1 2 3a*b/(c+d)-e/f*(g-h)/i , (N) 1

  • 1Status PreOrderTraverse ( BiTree T, Status(*Vist)(TELemType e)) {//Visit//Visit// Visit Status PrintElemnt (TELemType e) { prinrf ( e ); return OK; }if ( T) { if ( Visit ( T-> data)) if ( PreOrderTraverse( T-> Lchild, Visit)) if ( PreOrderTraverse( T->Rchild,Visit)) return OK; return ERROR; } else return OK ;}

  • 2Status INOrderTraverse ( BiTree T, Status(*Vist)(TELemType e)) {//Visit//Visit// VisitStatus PrintElemnt (TELemType e) { prinrf ( e ); return OK;} if (T) if (INOrderTraverse( T-> Lchild, Visit)) if ( Visit ( T-> data)) if (INOrderTraverse( T->Rchild,Visit)) return OK; return ERROR; } else return OK ;}

    ;

  • 3) Status PostOrderTraverse ( BiTree T, Status(*Visit)(TELemType e)) {//Visit//Visit// Visit Status PrintElemnt (TELemType e) { prinrf ( e ); return OK; }if ( T) { if ( PostOrderTraverse( T-> Lchild, Visit)) if ( PosyOrderTraverse( T->Rchild,Visit)) if ( Visit ( T-> data)) return OK ; return ERROR; } else return OK ;}

  • 2AAAAABBBABDABD

    A B D E F G I J C H (A) (B) (D)

  • DIGJBEAFHCABDDBA 6.13NVISIT

    A B C D E FG H I J

  • 1)1:Status InOrderTraverse(BiTree T,Status (*Visit)(TElemType e)){ IniStack(S); ( Push( S, P ); p = T ; PT while (! StackEmpty(s)) { S while (GetTop(s,p)&&p) Push( S, P ->Lchild ); Pop(s, p ) ; if (! StackEmpty(s)) Pop(s, p ) ; if (! Visit (P->data)) return ERROR; Push( S ,P-> rchild); }if } while return OK;}INorderTraverse

  • 2:Status InOrderTraverse(BiTree T,Status (*Visit)(TElemType e)){ IniStack(S); ( p = T ; PT while ( p ! StackEmpty(s)) { PS if (p) { Push( S, P ); P = P->Lchild;} else { P Pop(s, p ) ; if (! Visit (P->data)) return ERROR;P P = P-> rchild ; } } while return OK;

  • 2) (S)B

    ADR B A 0 A B C D E F G H I JD 0B 0

  • 01011016.14DD ADR B ADR B

    6.14D0D1D

    A 0 I 0 A B C D E F G H I JD 1G 0B 0A 0D 0B 0

  • Status PostOrderTraverse(BiTree T,Status (*Visit)(TElemType e)){ IniStack(S); ( p = T ; PT while ( p ! StackEmpty(s)) { PS if (p) { Push( S, P,B );(PP B =0) P = P->Lchild;} else { P Pop(s, p ,B) ; if( B==0) {Push( S, P,B ); ( B = 1) P = P-> rchild ;} () else { if (! Visit (P->data)) return ERROR;P P=null;} } } while return OK;} PostorderTraverse

  • 3ABC DE G F Status CreateBiTree(BiTree &T) { scanf (& ch); if (ch == ) T = NULL; else { if (!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data = ch; CreateBiTree( T-> lchild ); CreateBiTree( T->rchild ); } return OK;}

  • StatusChang (BiTree T,Status (*Visit)(TElemType e)){ IniStack(S); ( p = T ; PT while ( p ! StackEmpty(s)) { PS if (p) { Push( S, P ); P = P->Lchild;} else { P Pop(s, p ) ; q = p->Lchild; p->Lchild = p->Rchild ; p->Rchild = q; P = P->Lchild ; } } while return OK;}

  • StatusLeaf (BiTree T,Status (*Visit)(TElemType e)){ IniStack(S); ( p = T ; PT while ( p ! StackEmpty(s)) { PS if (p) { Push( S, P ); P = P->Lchild;} else { P Pop(s, p ) ; if ( p->Lchild =null&& p->Rchild =null); printf ( p->data) ; P = P-> Rchild; } } while return OK;}

  • 1T2T03TX4T5T6T7TABDFGHCEBFDHGAEC

  • 8N ---9K 10 12 13 14P 15 16PYP

  • 4NN+18961 2 6.15PP->lchild=nullPPPP->rchild=NULLP

    CD EF GH A B

  • 3 (ltag , rtag )

    ltag=

    rtag= 0 rchild 1 rchild

    Lchild L tag data Rtag Rchild0 lchild 1 lchild

  • Typedef enm {Link, Thread } PointerTag; Link=0, Thread =1Typedef struct BiThrNode { TelemType data ; struct BiThrNode *lchild, * rchild ; pointerTag Ltag, Rtag ; }BiThrNode, * BiThrTree;4pre.thrt6.15

  • - + * a * e f b - c d 0 1 0 - 0 1 b 1 0 - 0 1 c 1 1 d 1thrtnilbt6.15 1 a 1 0 * 0 1 e 1 1 f 1 0 + 0 0 * 0

  • 4Status InOrderThreading(BiThrTree & Thrt,BiThrTree T){ if(!(Thrt = ( BiThrTree)malloc(sizeof(BiThrNode))))exit(OVER) Thrt->Ltag = Link0; Thrt->Rtag=Thread 1; Thrt->rchild = Thrt; if (!T)Thrt->Lchild = Thrt; else { Thrt->Lchild = T; pre= ThrtT InThreading(T); pre->rchild = Thrt; pre->Rtag = Thread;) Thrt->rchild = pre; } return OK;}

  • Void InThreading(BiThrTree p) { if (P) { InThreading(p-> lchild); if (! P->lchild){p->Ltag= Thread; p->lchild= pre;} if (!pre->rchild){pre-Rtag=Thread;pre->rchild=p;} pre = p; InThreading( p-> rchild); } } InThreading5

  • Status InOrderTraverse_Thr(BiThrTree T,Status(*Visit) (TElemType e) { P = T-> Lchild ; while (P ! = T) { while ( p->Ltag == Link) P= P-> lchild; if (! Visit( P->data)) return ERROE; while (P->Rtag==Thread &&P->rchild ! = T) { p = p->rchild; Visit( p-> data); } p = p->rchild; } return OK;}

    616

    1 f 1 1 g 1 1 h 11 b 0 0 c 10 d 0 1 e 00 10 a 0T

  • 1 1 #define MAX_TREE_SIZE 100Typeset struct PTNode { TElemType data; int parent;} PTNode;Typedef struct { PTNode nodes[ MAX_TREE _SIZE ; int n;} Ptree; 6.17

    R A B C G H K0 R -1A 02 B 0 3 C 04 D 15 E 16 F 3 7 G 6 8 H 69 K 6 D E F

  • 2

    D DNKNK-1+16.17NN C

    data child1 child2 child3 childd data degree child1 child2 childd

  • Typedef struct CTNode { int child; struct CTNode *next;} *Childptr;Typedef struct { TelemType data; Childptr firstchild;}CTBox;Typedef struct { CTBox node[ max_TREE_SIZE]; int n ,r; } Ctree; 6.18----6.19

    1 B40 A2 c 3 D R 5 E6 F 7 G 8 H 9 K3 5 6 R A B C D E F G H K 0 1 27 8 9

  • 3firstchild nextsiblingTypedef struct CSNode { ElemType data ; struct CSNode *firstchild, nextsibling ;} CSNode, *CSTree;

    6.20

    6.19

    1 4 B2 4 c 3 0 D4 -1 R 5 0 E6 2 F 7 6 G 8 6 H 9 6 K3 5 6 0 4 A9 R A B C DE F G H K

  • 26.21

    6.21

    A B C D E FFDC A BE A B C D E F A B CE D F

  • 6.22

    A E G B C D F H I J B E C F G D H I J6.22F ={T1T2 Tn}B= ROOT , LBRB1FM=0B 2FM=0B BLBT1F1={T11T12 . T1m}RBF = {T2T3. Tm}

    A

  • 3 ABCDEFGHIJBCDAFEHJIG11232 1 2 3

    A E G B C D F H I J

  • ((Huffman) 1 2 3 WPL = W * L k

  • N WkK LKK94ABCD

    WPL =3*2+5*2+2*2+6*3 =6+10+4+18 =38ABD2C338

  • 4N{W1W2 Wn}nWPL75424

    6.23

    7 A 5 B 2 D 4 C 5 B 4 C 2 D 7 A 5 B 4 C 2 D7 A

  • 51N NF={W1W2WN2F3F423FF ={ 7542}

    64 2 6 5 114 2 6 115718

  • 6 AAAABBBAAABBCCDCCD472D684 C 2 6 115 B7 A 180 1 0 1D

  • 01 ABCD 010110111 NWiLi Wi * LiWI

    4 C 2 6 115 B7 A 180 1 0 1D

  • 7Typedef struct { unsingned int weight ;( unsingned int parent,lchild,rchild ;}HTNode,*HuffmaTree;Typedef char * * HuffmaCode;Void HuffmaCoding(HuffmaTree &HT,HuffmaCode&hc,int *w,int n) { if (n
  • For (i=n+1; i
  • HC = (HuffmanCode)malloc(n+1) * sizeof( char *)); Cd = (char * )malloc(n* sizeof(char); Cd[n] = \ 0 ; For (i= 1; i
  • w p lc rc 1 5 0 0 02 29 0 0 03 7 0 0 04 8 0 0 05 14 0 0 0 6 23 0 0 07 3 0 0 0 8 11 0 0 09 0 0 010 0 0 011 0 0 0 12 0 0 013 0 0 0 14 0 0 015 0 0 023 2911 14 5 3 7 82 29 14 0 03 7 10 0 05 14 12 0 0 6 23 13 0 07 3 9 0 0 8 11 11 0 09 8 11 1 710 15 12 3 411 19 13 8 9 12 29 14 5 10 14 58 15 2 1215 100 0 13 14 5 9 0 0A 0 1 1 0 B 1 0 C 1110 1 1 11E 1 1 0 F 0 0 G 01114 8 0 0 013 42 15 11 6H 010D1 2 3 4 5 6 7 8HC

  • T

  • 1TPXPP2XPP3XXXP45K 6N

  • 17, 18 .l19 20 21PYP 22P 23

  • 24M 25N N26N N27 28

  • * * * * * *

  • 1 Graph(Vertex)(Edge)G =VE V,E G =V E V = {V1V2V3V4} E ={e1,e2,e3,e4,e5}2(Undigraph) 7.0 undirected edge). e1e1 = v1,v2)=(v2,v1).E = {(v1,v2),(v1,v3),(v2,v4),(v3,v4),(v2,v3)}n,eei

    V1 V4e1 e2e3 e4e5 7.0 V2 V3 V1 V4e1 e2e3 e4e5 7.0 V2 V3

  • ei= (vi, vj) = (vj,vi); vi,vj V; ei E;vi,vj eieivi,vj vi,vj vi vi7.0V1 V42V2 V332Directed Graph)Directed edge).e1 =< v1 v2 >= v2 v1 E={,,,}n,eeiei=vi, vj=vj,vi; vi,vj V; ei E; 7.1e2 e3e1 v1 v2v3 e4 v4

  • vi() Arc ei tail node) ;vjeihead node)(Terminal node)ei vi,vj.vivjvi vivi vi id vivi vi od viTd(vi) = id vi+ od vi 7.1 id v1= 1; od v1= 2; id v3= 1; od v3=1; Td(v1) = id v1+ od v1= 3;ne e = Td(vi) 3Completed graph)ne *n*n-1),(7.3 a)

  • nen*n-1),(7.3 b)weight)Network).(4Subgraph) G =V{E}G= V{E}VVE EGG 7.17.1