第四章 鏈結串列 (linked list)

48
written by Wei-ShenLai 1 第第第 第第第第 (Linked List) 4-1 第第第第第第第第第第第第第 4-2 第第第第第第 (Singly Linked List) 4-3 第第第第第第第第第 4-4 第第第第第第第第 (Circular Linked List) 4-5 第第第第第第 (Double Linked List) 第第第 4-6 第第第第第第第第 4-7 第第第第 第第第第

Upload: tayten

Post on 11-Jan-2016

190 views

Category:

Documents


0 download

DESCRIPTION

第四章 鏈結串列 (Linked List). 4-1 簡介鏈結串列與動態資料結構 4-2 單向鏈結串列 (Singly Linked List) 4-3 鏈結堆疊與鏈結佇列 4-4 認識環狀鏈結串列 (Circular Linked List) 4-5 雙向鏈結串列 (Double Linked List) 的應用 4-6 多項式串列表示法 4-7 動態記憶體管理介紹. 4-1  簡介鏈結串列與動態資料結構. - PowerPoint PPT Presentation

TRANSCRIPT

  • (Linked List)4-1 4-2 (Singly Linked List)4-3 4-4 (Circular Linked List)4-5 (Double Linked List)4-6 4-7

  • 4-1 (pointer) (pointer) (node)(Data)(Pointer)(Linked List)

    Node

    C(main())typedef struct node *node_pointer;typedefstructnode{int data;node_pointer link;};*node_pointerstruct nodenode_pointer

    Null

  • Cmalloc()free()malloc()malloc()(NULL)mallocfp = (*)malloc()(sizeof())mallocfpfree()malloc()free()free()(dangling reference) free(fp);

  • Cvoid main(){float *fp; /* */fp=(float*)malloc(sizeof(float)); /**/if(!fp) { /* !fp */printf(" !\n");exit(1); /**/}*fp=3.1415926; /* */printf("PI :%f\n",*fp);free(fp); /* */}

  • 4 . 1 . 1 C free()C(overflow)(pointer)(node)delete (Singly Linked List)AV(Available Node)newAV

  • 4-2(Singly Linked List)

  • ch04_01.c

    num

    name

    score

    num

    name

    score

    next

    next

    num

    name

    score

    next

    num

    name

    score

    next

    newnode

    ptr

    Null

    num

    name

    score

    next

    num

    name

    score

    next

    ptr

    Null

    delptr

    ptr

  • top=headhead=head->nextdelete top;

    Y=ptr-next;ptr->next=Y->next;free(Y);

    NULL ptr->next=tail;ptr->next=NULL;free(tail);

    Null

    head

    head

    head

    Null

    head

    Y

    ptr

    Null

    head

    tail

    ptr

  • newnode= ....malloc(...)newnode->next=head;head=newnode;

    N UL L newnode= ....malloc(...)ptr->next=newnode;

    X Y X Y newnode= ....malloc(...)X->next=newnode;newnode->next=Y;

    Null

    newnode

    Null

    head

    head

    Null

    newnode

    head

    Null

    X

    Y

    Null

    newnode

    head

    Null

    ptr

  • Procedure Invert(x)p x;q NIL;While pNIL dorq;qp;pLINK(p);LINK(q) r;ENDx q;END

    Null

    X

    Null

    X

    r

    q

    p

    r

    q

    p

  • CProcedure Invert(x)p x;q NIL;While pNIL dorq;qp;pLINK(p);LINK(q) r;ENDx q;ENDptr=head;before=NULL;printf("\n \n");while(ptr!=NULL) { /**/last=before;before=ptr;ptr=ptr->next;before->next=last;}ptr=before;

  • C struct NODE_TYPE{int Data;struct NODE_TYPE* pNext;};typedef struct NODE_TYPE NODE;NODE* Concatenate(NODE* head1,NODE* head2){NODE* ptr;ptr = head1;while(ptr->pNext != NULL)ptr = ptr->pNext;ptr->pNext = head2;return head1;}

    Null

    head1

    Null

    head2

  • 4-3 struct _NODE{int Data;struct _NODE* pNext;};typedefstruct_NODEnode;typedefnode*link;typedefnode_TOP;

    Null

    top

  • void AddNodeToStack(_TOP** top, int nVal){link pNewNode = (link)malloc(sizeof(node));pNewNode->Data = nVal;pNewNode->pNext = *top;*top = pNewNode;}void DelNodeFromStack(_TOP **top, int* nRetVal){link pDelNode = (link)malloc(sizeof(node));if(*top == NULL){printf("[]\n");*nRetVal = -32768;return;}else{pDelNode = *top;*nRetVal = (*top)->Data;*top = (*top)->pNext;free(pDelNode);}}

    Null

    nVal

    pNewNode

    top

    Null

    pDelNode

    top

  • void AddNodeToQueue(_FRONT** front, _REAR** rear, int nVal){link pNewNode = (link)malloc(sizeof(node));pNewNode->Data = nVal;pNewNode->pNext = NULL;if(*rear == NULL){*front = pNewNode;*rear = pNewNode;}else{(*rear)->pNext = pNewNode;*rear = pNewNode;}}void DelNodeFromQueue(_FRONT** front, int* nRetVal){link pDelNode = NULL;if(*front == NULL){printf("[]\n");*nRetVal = -32768;return;}*nRetVal = (*front)->Data;pDelNode = *front;*front = (*front)->pNext;free(pDelNode);}

    Null

    nVal

    pNewNode

    front

    rear

    Null

    Null

    pNewNode

    front

    rear

  • 4-4(Circular Linked List)

    A

  • newNode = ... malloc...;newNode->next=head;tail->next=newNode;head=newNode;

    I X I = ... malloc ..;I->next=X->next;X->next=I;

    tail

    head

    newNode

    head

    I

    tail

    X

  • pNewNode

    head

    pNewNode

    head

    pCurNode

    pCurNode

    head

    pNewNode

    tail

    after

  • tail=head->next;head=head->next;free(pDelNode);

    pPrevNode->next=del->next;

    head

    pDelNode

    head

    pCurNode

    pCurNode

    tail

    pCurNode

    head

    I

    pCurNode

    del

    pPrevNode

  • head

    pDelNode

    head

    pCurNode

    pCurNode

    pTailNode

    pCurNode

    head

    I

    pCurNode

    del

    pPrevNode

  • 1 2 W=X->next;X->next=Y->next;Y->next=W;

    1

    2

    9

    X

    A

    B

    Z

    Y

    NULL

    Y

    NULL

    1

    2

    9

    A

    X

    B

    Z

    Y

    1

    B

    Z

    X

    A

    2

    9

    Y

  • 4 . 4 . 1 () Procedure Invert(T)if T=nil then returnq T;p LINK(T)While p T doBEGINr qq pp LINK(p);LINK(q) rEndLINK(T) qT qend.O(1)

    q

    p

    T

    r

    r

    q

    p

    T

  • 4 . . 2 (circular linked list)(1)(2)()(1)Procedure CINSERT(A,X)if A=Nil then [A X;LINK(X) NIL]else [LINK(X) LINK(A)]LINK(A) Xend(2)Procedure Length(T)i 0if T NIL [P Twhile (P T) do[ i i+1 P LINK(P)]]return(i)END

    head

    pNewNode

    head

    pCurNode

    pCurNode

  • 4 . 4 . 4 (Erase)(1)(Single linked list)(2)(circular list)(3)()(1) TAV() AVT Procedure ERASE(T)if T=Nil then returnP Twhile LINK(P)Nil doP LINK(P)endLINK(P) AVAV Tend

    AV

    T

    NULL

    NULL

    AV

  • (2)TTAVAVTProcedure CERASE(T)if T=nil then returnX LINK(T)LINK(T)AVAVXend.(3)TT(Tn)O(n)AVO(1)

    AV

    NULL

    T

    AV

  • (Sparse Matrix) i j D R ai,j

    i

    D

    j

    R

    ai,j

  • 3-tuple

    3

    3

    0

    0

    0

    0

    0

    0

    A

    H1

    H2

    H3

    0

    0

    0

    0

    0

    0

    H1

    H2

    H3

    2

    1

    12

    3

    3

    -2

  • 4 . 4 . 6 AVL()()(1) (2) O(m+n+j)mn j

  • 4-5(Double Linked List) LLINK RLINK RLINK LLINK

    ptr ptr=RLINK(LLINK(ptr))=LLINK(RLINK(ptr)) struct _NODE{int DATA;struct _NODE* LLINK;struct _NODE* RLINK;};typedef struct _NODE node;typedef node* link;typedef node* _HEAD;typedef node* _INSERTAFTER;typedef node* _DELETE;

    DATA

    RLINK

    LLINK

    NULL

    NULL

    Head

  • For_HEAD CreateDoubly(int* arr,int Num){link LLINKNode = NULL;link pNewNode = NULL;int i = 0;_HEAD head = (_HEAD)malloc(sizeof(node));if(head == NULL){printf("[]\n");return NULL;}else{memset(head,0,sizeof(node));head->DATA = *(arr+0);LLINKNode = head;for(i=1;iDATA = *(arr+i);LLINKNode->RLINK = pNewNode;pNewNode->LLINK = LLINKNode;LLINKNode = pNewNode;}}return head;}

    NULL

    NULL

    Head

    pNewNode

    NULL

  • head->LLINK=pNewNode;pNewNode->RLINK=head;head=pNewNode;

    ptr->RLINK=pNewNode;pNewNode->LLINK=ptr;

    p t r pNewNode->RLINK=ptr->RLINK;ptr->RLINK->LLINK=pNewNode;ptr->RLINK=pNewNode;pNewNode->LLINK=ptr;

    NULL

    NULL

    Head

    pNewNode

    ptr

    1

    2

    3

    4

    NULL

    NULL

    Head

    pNewNode

    Head

    1

    2

    NULL

    NULL

    Head

    pNewNode

    1

    2

    ptr

  • head=head->RLINK;free(head->LLINK);head->LLINK=NULL;

    del->LLINK->RLINK=NULL;free(del);

    p t r del->LLINK->RLINK=del->RLINK;del->RLINK->LLINK=del->LLINK;free(del);

    NULL

    NULL

    Head

    Head

    NULL

    NULL

    Head

    del

    NULL

    NULL

    Head

    del

  • 4 . 5 . 1 ()

  • 4-6

    COEFEXPL INKn P(x)=an-1xen-1+an-2xen-2++a0

    A(x)=3X2+6X-2

    EXP

    LINK

    COEF

    en-1

    an-1

    en-2

    an-2

    e0

    a0

    NULL

    2

    3

    1

    6

    0

    -2

    NULL

  • ch04_05.cwhile(a!=NULL) /*1*/{b=ptr; /* AB */while(b!=NULL){if(a->exp==b->exp) { /* */

    sum[i]=a->coef+b->coef;a=a->next;b=b->next;i++;}else if(b->exp > a->exp) {/*BC*/sum[i]=b->coef;b=b->next;i++;}else if(a->exp > b->exp) { /*AC*/sum[i]=a->coef;a=a->next;i++;}}}return creat_link(sum);

  • 4 . 6 . 1 XAYBZC(1) X6-6XY5+5Y6(2) "0" (3) X6-3X5-4X4+2X3+3X+5

  • 4 . 6 . 2 P(x,y,z)=x10y3z10+2x8y3z2+3x8y2z2+x4y4z+6x3y4z+2yz

  • 4-7CPU(Allocation)(Release)( Dynamic Storage Management)SizeLink

  • 4-7-1(Bes t Fit) (First Fit) (Worst Fit)(Best Fit)

  • 4-7-2(Boundary Tag Method) (First Fit) (tag) (tag value)

  • ( H e a d e r ) (1) L I N K (2) TAGTAG= 0 T A G = 1 (3) S I Z E (4) R L I N K ( S p a c e ) ( T a i l e r ) (1) UP L INK(2) TAGTAG=0 TAG=1

  • (Buddy System)2 2 n 2k 2k - 1n2k2 2m 0~2m-1 2021222mm + 1

  • n 2k2k-1n2kAV( i ) k i m i headk< i 2 2i-1 head head+2i-12i-13k i-132khead 2k

  • 4 . 7 . 2 256k (Buddy System)(1) (Allocated Node)(Free Node)(2) 4 (program)P1=41kP2=15kP3=29kP4=115k

  • 4 . 7 . 3 (1) P3(2) P5=43k