1 / 47

240-222 Computer Programming Techniques Semester 1, 1998

240-222 Computer Programming Techniques Semester 1, 1998. 15. Lists. Objective of these slides: to describe linked lists in C. Overview. 1. List Data Structures and Operations 2. List Implementations 3. Dynamically Created Lists 4. Converting a String to a List 5. List Functions.

keiki
Télécharger la présentation

240-222 Computer Programming Techniques Semester 1, 1998

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. 240-222 Computer Programming TechniquesSemester 1, 1998 15. Lists Objective of these slides: to describe linked lists in C

  2. Overview 1. List Data Structures and Operations 2. List Implementations 3. Dynamically Created Lists 4. Converting a String to a List 5. List Functions

  3. 1. List Data Structures and Operations • Some possible operations: • create/destroy a list • test to see if a list is empty • return the tail of the list • insert/delete elements • print a list • calculate the length of a list

  4. 2. List implementations Version 1: #define N 1000 /* the size of the list */typedef char LIST[N];LIST lt; /* same as char lt[N] */

  5. Version 2 (Sec. 12.2) struct listnode { char data; struct listnode *nextptr;};typedef struct listnode LISTNODE;LISTNODE elem; elem data nextptr

  6. Use LISTNODE a, b, c;a.data = 'a';b.data = 'c';c.data = 'e';a.nextptr = b.nextptr = c.nextptr = NULL; a b c continued

  7. a.nextptr = &b;b.nextptr = &c;printf("%c", a.nextptr->data);/* 'c' printed */printf("%c", a.nextptr->nextptr->data);/* 'e' printed */ a b c ‘a’ ‘c’ ‘e’ NULL

  8. 3. Dynamically Created Lists /* list implementation as before */typedef LISTNODE *LNP;LNP head = NULL;head = malloc(sizeof(LISTNODE));head->data = 'n';head->nextptr = NULL; head ‘n’ NULL Function prototype in stdlib.h: void *malloc(size_t size);

  9. Add a second element head->nextptr = malloc(sizeof(LISTNODE));head->nextptr->data = 'e';head->nextptr->nextptr = NULL; head ‘n’ ‘e’ NULL

  10. Add a third element head->nextptr->nextptr = malloc(sizeof(LISTNODE));head->nextptr->nextptr->data = 'w';head->nextptr->nextptr->nextptr = NULL; head ‘n’ ‘e’ ‘w’ NULL

  11. 4. Converting a String to a List #include <stdio.h>#include <stdlib.h>/* list type implementation */LNP string_to_list(char []);int main(){ LNP h = NULL; h = string_to_list("AB"); return 0;}/* implementation of string_to_list() */

  12. LNP string_to_list(char s[]){ LNP head = NULL, tail; int i; if (s[0] != '\0') { head = malloc(sizeof(LISTNODE)); head->data = s[0]; tail = head; for (i=1; s[i] != '\0'; i++){ tail->nextptr = malloc(sizeof(LISTNODE)); tail = tail->nextptr; tail->data = s[i]; } tail->nextptr = NULL; /* list end */ } return head;}

  13. string_to_list("AB") head = malloc(sizeof(LISTNODE));head->data = s[0];tail = head; head ‘A’ ‘?’ tail

  14. tail->nextptr = malloc(sizeof(LISTNODE)); head ‘A’ ‘?’ ‘?’ tail

  15. tail = tail->nextptr;tail->data = s[i]; /* i = 1 here */ head ‘A’ ‘B’ ‘?’ tail

  16. s[2] = '\0'/* so end of list is assigned NULL */ head ‘A’ ‘B’ NULL tail

  17. 5. List Functions 5.1. Empty Lists 5.2. Return the First Element of a List 5.3. Produce the Tail of a List 5.4. Put an Element on the Front of a List 5.5. Insertion continued

  18. 5.6. Deletion 5.7. List Membership 5.8. Print a List 5.9. List Length 5.10. Concatenate Two Lists

  19. 5.1. Empty Lists • Make an empty list:LNP h1;h1 = NULL; • Test for emptiness:int isempty(LNP sptr){ return (sptr == NULL);}

  20. 5.2. Return the First Element of a List char first(LNP cptr){ if (isempty(cptr)) return '\0' else return cptr->data;}

  21. Use LNP head;char c;head = string_to_list("new");c = first(head); /* c is 'n'; head is not altered */

  22. 5.3. Produce the tail of a list void tail(LNP *cptr){ LNP temp; if (isempty(*cptr)) printf("The list is empty.\n\n"); else { temp = *cptr; *cptr = (*cptr)->nextptr; free(temp); }} • cptr is the address of a pointer, so that the pointer can be modified using "call by reference".

  23. Use LNP head;head = string_to_list("new"); :tail(&head); /* head is now the list version of “ew” */

  24. 5.4. Put an Element on the List Front LNP cons(char c, LNP cptr){ LNP temp; temp = malloc(sizeof(LISTNODE)); temp->data = c; temp->nextptr = cptr; return temp;}

  25. Use LNP h1, h2;h1 = string_to_list("ew");h2 = cons('n', h1); • Before the cons() call: h1 ‘e’ ‘w’ NULL

  26. After: h2 ‘n’ ‘e’ ‘w’ NULL h1

  27. 5.5. Insertion Before: newptr ‘o’ NULL head ‘n’ ‘w’ NULL previousptr currentptr

  28. After: head ‘n’ ‘o’ ‘w’ NULL

  29. Code Fig. 12.3 void insert(LNP *sptr, char value){ LNP newptr, previousptr, currentptr; newptr = malloc(sizeof(LISTNODE)); if (newptr) { newptr->data = value; newptr->nextptr = NULL; previousptr = NULL; currentptr = *sptr; continued

  30. while ((currentptr != NULL) && (value > currentptr->data)) { previousptr = currentptr; currentptr = currentptr->nextptr; } if (previousptr == NULL) { newptr->nextptr = *sptr; *sptr = newptr; } else { previousptr->nextptr = newptr; newptr->nextptr = currentptr; } } else printf("No memory available.\n");}

  31. Note • The use of a pointer address (sptr) as an argument to insert() is to allow the head pointer to the list to be altered if the character is inserted as the first node.

  32. Use LNP h1;h1 = string_to_list("nw");insert(&hl, 'o'); • Dangers:LNP h1, h2;h1 = string_to_list("nw");h2 = h1;insert(&hl, 'o');

  33. 5.6. Deletion LNP head;head = string_to_list("new");c = delete(&head, 'e'); head ‘n’ ‘e’ ‘w’ NULL previousptr currentptr

  34. tempptr head ‘n’ ‘e’ ‘w’ NULL previousptr currentptr

  35. Code Fig. 12.3 char delete(LNP *sptr, char value){ LNP previousptr, currentptr, tempptr; if (value == (*sptr)->data) { tempptr = *sptr; *sptr = (*sptr)->nextptr; free(tempptr); return value; } else { previousptr = *sptr; currentptr = (*sptr)->nextptr; continued

  36. while ((currentptr != NULL) && (currentptr->data != value)) { previousptr = currentptr; currentptr = currentptr->nextptr; } if (currentptr) { tempptr = currentptr; previousptr->nextptr = currentptr->nextptr; free(tempptr); return value; } } return '\0';}

  37. Some Comments • The use of a pointer address (sptr) as an argument to delete() is to allow the head pointer to the list to be altered if the first character in the list is being deleted.

  38. delete() can stop when: • 1. It has found the character. • 2. It has reached the end of the list (the character isn't there). • 3. It has reached a character lexically bigger than the one being sought. Not used in this code.

  39. Dangers LNP h1, h2;char c;h1 = string_to_list("all");h2 = h1;c = delete(&h1, 'l'); h1 ‘a’ ‘l’ NULL h2 • • h2 would be pointing at nothing if the first node of h1 was deleted

  40. 5.7. List Membership int member(char c, LNP cptr){ if (isempty(cptr)) return 0; else { if (c == first(cptr)) return 1; else return member(c, cptr->nextptr); }}

  41. 5.8. Print a List (iteratively) Fig. 12.3 void printList(LNP cptr){ if (!cptr) printf("List is empty.\n\n"); else { printf("The list is:\n"); while (cptr) { printf("%c --> ", cptr->data); cptr = cptr->nextptr; } printf("NULL\n\n"); }}

  42. Use LNP head;head = string_to_list("old");printList(head); The list is:o --> l --> d --> NULL

  43. Print a List (recursively) void printList(LNP cptr){ if (isempty(cptr)) printf("NULL"); else { printf("%c --> ", first(cptr)); printList(cptr->nextptr); }}

  44. 5.9. List Length int length(LNP cptr){ if (isempty(cptr)) return 0; else return (1 + length(cptr->nextptr));}

  45. 5.10. Concatenate Two Lists void concat(LNP a, LNP b){ if (a->nextptr == NULL) a->nextptr = b; else concat(a->nextptr, b);}

  46. Use LNP h1, h2;h1 = string_to_list("new");h2 = string_to_list("ton");concat(h1, h2); /* h1 altered */print_list(h1); The list is:n --> e --> w --> t --> o --> n --> NULL

  47. Dangers LNP h1, h2;h1 = string_to_list("ab");h2 = string_to_list("cd");concat(h1, h2); /* h1 is list "abcd" */h2->data = 'o'; h1 ‘a’ ‘b’ ‘o’ ‘d’ NULL h2

More Related