1 / 24

Objects : ( item 0 , item 1 ,  , item N  1 )

CHAPTER 4 Lists. 4.1 The List ADT:. Objects : ( item 0 , item 1 ,  , item N  1 ). Operations :  Finding the length , N , of a list.  Printing all the items in a list.  Making an empty list.  Finding X item from a list, 0  k < N .

uma-sanford
Download Presentation

Objects : ( item 0 , item 1 ,  , item N  1 )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CHAPTER 4 Lists 4.1 The List ADT: Objects: ( item0, item1,  , itemN1 ) Operations:  Finding the length, N, of a list.  Printing all the items in a list.  Making an empty list.  Finding X item from a list, 0  k < N.  Inserting a new item after the k-th item of a list, 0  k < N.  Deleting an item from a list.  Finding next of the current item from a list.  Finding previous of the current item from a list.

  2. Address Content …… …… array+i itemi array+i+1 itemi+1 …… …… • Simple Array implementation of Lists array[ i ] = itemi Sequential mapping MaxSize has to be estimated. Finding takes O(n) time. Insertion and Deletion not only take O(N) time, but also involve a lot of data movements which takes time.

  3. 4.2 Singly Linked Lists • Linked list • an ordered sequence of nodes with links represented as arrows • Insert mat after cat : • Delete mat from list :

  4. The capabilities to make linked representation: • Define a node's structure----self-referential structures • Create a new node ---- malloc function • Remove nodes ---- free function 〖example〗list of words ending in at define a node typedef struct listNode *listPointer; structure typedef struct listNode { char data [ 4 ]; listPointer link; }; create a new list listPointer ptr = NULL; ( #define IS_EMPTY(ptr) ( ! ( ptr )) ) create new nodes ptr = (listPointer) malloc ( sizeof (listNode )); place a word into the list strcpy ( ptr ->data, "bat"); ptr -> link = null; Free point free(ptr);

  5. x first ... ... a1 ai ai+1 an b NULL temp 〖example〗List insertion  temp->link = x-> link  x-> link = temp Question: What will happen if the order of the two steps is reversed? Read Program 4.2 on p.153 and answer the question: Why is first passed as a pointer to listPointer?

  6. 〖example〗List insertion #define IS_FULL (ptr ) ( ! (ptr )) void insert(listPointer *first, listPointer x) { /* insert a new node with data = 50 into the list ptr after node */ list_pointer temp; temp = (listPointer)malloc(sizeof(listNode)); if ( IS_FULL(temp) ) { fprintf(stderr, "The memory is full\n'); exit(1); } temp->data = 50; if ( *first) { temp->link = x->link; x->link = temp; } else { temp->link = NULL; *first= temp; } }

  7. trail first ... ... b an b ai a1 ai+1 NULL node x 〖example〗list deletion  trail-> link = x-> link  free ( node ) Question: How can we delete the first node from a list? Read Program 4.3 on p.155 and find the answer.

  8. List after the function call delete(&ptr, NULL, ptr) List after the function call delete(&ptr, ptr, prt->link) 〖example〗list deletion void delete(listPointer *first, listPointer trail, listPointer x) { /* delete node from the list, trail is the preceding node ptr is the head of the list */ if ( trail ) trail->link = x->link; else *first= (*first)->link; free(x); }

  9. 〖example〗Printing out a list void print_list(listPointer first) { printf("The list contains: "); for ( ; first; first= first->link ) printf("%4d”,first->data); printf("\n"); }

  10. STACK temp top top top item item item item NULL    4.3 Dynamically Linked Stacks and Queues Push:  temp->link = top • Linked Stacks  top = temp Pop:  temp = top  top = top->link  item = temp->item Read Program 4.5 and Program 4.6 on p.158 about implementation of push and pop item  free ( temp )  return item Question: How to represent n stacks? Answer: stackPointer top [ n ] ;

  11. Program : Add to a linked stack #define MAX_STACKS 10 /*maximum number od stacks */ typedef struct { int key ; /* other fields */ } element; typedef struct stack *stackPointer; typedef struct stack { element item; stackPointer link; }; stackPointer top [ MAX_STACKS ]; void push(inti, element item) { /* add an element to the top of the stack */ stackPointer temp = (stackPointer)malloc(sizeof(stack)); if ( IS_FULL(temp) ) { fprintf( stderr, "The memory is full\n"); exit(1); } temp->item = item; temp->link = top[i]; top[i] = temp; }

  12. Program : Delete from a linked stack element pop(inti) { /* delete an element from the stack */ stackPointer temp = top[i]; element item; if ( IS_EMPTY(temp) ) { fprintf(stderr, "The stack is empty\n"); exit(1); } item = temp->item; top[i] = temp->link; free(temp); return item; } • the boudary condition for the stacks: • top [ i ] = NULL, iff the i th stack is empty 0 <= i < MAX_STACKS • IS_FULL ( temp) iff the memory is full

  13. QUEUE front rear front temp temp rear NULL item  item    item item Linked Queues addq:  rear->link= temp NULL  temp-> link = NULL  rear = temp deleteq:  temp = front  front = temp-> link item Read Program 4.7 and Program 4.8 on p.159-160 about implementation of addq and deleteq  item = temp->item  free ( temp )  return item Question: How to represent n queues? Answer: queuePointer front[n], rear[n];

  14. Program: Add to the rear of a linked queue #define MAX_QUEUES 10 /*maximum number of queues */ typedefstruct queue *queuePointer; typedefstruct queue { element item; queuePointer link: }; queuePointer front [MAX_QUEUES], rear [MAX_QUEUES ]; void addq(inti, element item) { /* add an element to the rear of the queue */ queuePointer temp = (queuePointer)malloc(sizeof(queue)); if ( IS_FULL(temp) ) { fprintf(stderr, "The memory is full\n"); exit(1); } temp->item = item; temp->link = NULL; if ( front[i] ) rear[i]->link = temp; else front[i] = temp; rear[i] = temp; }

  15. Program: Delete from the front of a linked queue element deleteq(inti) { /* delete an element from the queue */ queuePointer temp = front[i]; element item; if ( IS_EMPTY(front[i]) ) { fprintf(stderr, "The queue is empty\n"); exit(1); } item = temp->item; front[i] = temp->link; free(temp); return item; } • the boudary condition for the queues: • front [ i ] = NULL, iff the i th queue is empty 0 <= i < MAX_QUEUES • IS_FULL ( temp) iff the memory is full

  16. 4.5 Additional List Operations 1. operations for chains a)Inverting a singly linked list b) Concatenating singly linked lists 2. operations for circularly linked lists a) Inserting at the front of a list b) Finding the length of a circular list

  17. a) Inverting a singly linked list listPointer invert (listPointer lead ) { /* invert the list pointed to by lead */ listPointer middle, trail ; middle = NULL ; trail=NULL; /* middle is head of the inverted chain */ while ( lead ) { middle = lead ; lead = lead->link; middle->link= trail ; trail = middle ; } /* end while-loop */ return middle ; } middle middle middle lead lead lead 2 2 3 1 1 3 1 3 2          trail trail trail NULL NULL NULL NULL NULL NULL Tinvert= O( length of lead )

  18. b) Concatenating singly linked lists listPointerconcatenatelistPointer ptr1, listPointer ptr2) { /* produce a new list hat contains the list ptr1 followed by the list ptr2. The list pointed to by ptr1 is changed permanently */ listPointertemp; if ( IS_EMPTY(ptr1) ) return ptr2; else { if ( !IS_EMPTY(ptr2) ) { for ( temp = ptr1; temp->link; temp = temp->link ) ; temp->link = ptr2; } return ptr1; } } Tconcatenate= O( length of ptr1 )

  19. a) Inserting at the front of a circularly linked list void insertFront listPointer *last, listPointer node) /* insert node at the front of the circular list last, where last is the last node in the list */ { if ( IS_EMPTY(*last) ) { /* list is empty, change ptr to point to new entry */ *last= node; node->link = node; } else { /* list is not empty, add new entry at front */ node->link = (*last)->link; (*last)->link = node; } }

  20. b) Finding the length of a circular list int length(listPointer last) { /* find the length of the circular list last */ list_pointer temp; int count = 0; if (last) { temp = last; do { count ++; temp = temp->link; } while ( temp != last); } return count; }

  21. llink rlink  item         item1 item2 item3    H H 4.8 Doubly Linked lists typedef struct node *nodePointer; typedef struct node { nodePointer llink; element item; nodePointer rlink; }; Uhhh ... Then I’ll have to go from the 1st node again. But hey, why do I wantta find the previous node? Don’t we have enough headache already? Why do we need the doubly linked lists? ptr = ptr->llink->rlink = ptr->rlink->llink I’ll go from the 1st node to the m-th node. Suppose you have a list 1->2->3->…->m. Now how would you get the m-th node? Why do you ask me? :-) Maybe you wantta delete the m-th node? A doubly linked circular list with head node: Then you are asked to find its previous node m 1? An empty list :

  22. Program : Insertion into a doubly linked circular list void dinsert(nodePointer node, nodePointernewnode) { /* insert newnode to the right of node */ newnode->llink = node; newnode->rlink = node->rlink; node->rlink->llink = newnode; node->rlink = newnode; }

  23. Program: Deletion from a doubly linked circular list void ddelete(nodePointer node, nodePointer deleted) { /* delete from the doubly linked list */ if ( node == deleted ) printf("Deletion of head node not permitted.\n"); else { deleted->llink->rlink = deleted->rlink; deleted->rlink->llink = deleted->llink; free(deleted); } }

  24. Homework-2 1. P112, #4 2. P142, #1 3. P154, #2 4. P154, #6 5. P172, #1 补充: 6. 如果单链表带头结点,请完成CreateList, Insert, Delete函数操作, 可修改Program4.2和Program4.3完成。并请给出相关的数据结构定义。 CreateList:创建带一个头结点的单链表; Insert:在单链表first的X结点后插入元素Item; Delete:删除单链表First中Tail结点后的X结点,并返回其值。

More Related