View
190
Download
0
Category
Preview:
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
Citation preview
(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
Recommended