240 222 computer programming techniques semester 1 1998
Download
1 / 47

240-222 Computer Programming Techniques Semester 1, 1998 - PowerPoint PPT Presentation


  • 102 Views
  • Uploaded on

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.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '240-222 Computer Programming Techniques Semester 1, 1998' - keiki


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
240 222 computer programming techniques semester 1 1998

240-222 Computer Programming TechniquesSemester 1, 1998

15. Lists

Objective of these slides:

to describe linked lists in C


Overview
Overview

1. List Data Structures and Operations

2. List Implementations

3. Dynamically Created Lists

4. Converting a String to a List

5. List Functions


1 list data structures and operations
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


2 list implementations
2. List implementations

Version 1:

#define N 1000 /* the size of the list */typedef char LIST[N];LIST lt; /* same as char lt[N] */


Version 2 sec 12 2
Version 2 (Sec. 12.2)

struct listnode { char data; struct listnode *nextptr;};typedef struct listnode LISTNODE;LISTNODE elem;

elem

data

nextptr


240 222 computer programming techniques semester 1 1998
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


240 222 computer programming techniques semester 1 1998

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


3 dynamically created lists
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);


Add a second element
Add a second element

head->nextptr = malloc(sizeof(LISTNODE));head->nextptr->data = 'e';head->nextptr->nextptr = NULL;

head

‘n’

‘e’

NULL


Add a third element
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


4 converting a string to a list
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() */


240 222 computer programming techniques semester 1 1998

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;}


String to list ab
string_to_list("AB")

head = malloc(sizeof(LISTNODE));head->data = s[0];tail = head;

head

‘A’

‘?’

tail


240 222 computer programming techniques semester 1 1998

tail->nextptr = malloc(sizeof(LISTNODE));

head

‘A’

‘?’

‘?’

tail


240 222 computer programming techniques semester 1 1998

tail = tail->nextptr;tail->data = s[i]; /* i = 1 here */

head

‘A’

‘B’

‘?’

tail


240 222 computer programming techniques semester 1 1998

s[2] = '\0'/* so end of list is assigned NULL */

head

‘A’

‘B’

NULL

tail


5 list functions
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


240 222 computer programming techniques semester 1 1998

5.6. Deletion

5.7. List Membership

5.8. Print a List

5.9. List Length

5.10. Concatenate Two Lists


5 1 empty lists
5.1. Empty Lists

  • Make an empty list:LNP h1;h1 = NULL;

  • Test for emptiness:int isempty(LNP sptr){ return (sptr == NULL);}


5 2 return the first element of a list
5.2. Return the First Element of a List

char first(LNP cptr){ if (isempty(cptr)) return '\0' else return cptr->data;}


240 222 computer programming techniques semester 1 1998
Use

LNP head;char c;head = string_to_list("new");c = first(head);

/* c is 'n'; head is not altered */


5 3 produce the tail of a list
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".


240 222 computer programming techniques semester 1 1998
Use

LNP head;head = string_to_list("new"); :tail(&head);

/* head is now the list version of “ew” */


5 4 put an element on the list front
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;}


240 222 computer programming techniques semester 1 1998
Use

LNP h1, h2;h1 = string_to_list("ew");h2 = cons('n', h1);

  • Before the cons() call:

h1

‘e’

‘w’

NULL


240 222 computer programming techniques semester 1 1998

After:

h2

‘n’

‘e’

‘w’

NULL

h1


5 5 insertion
5.5. Insertion

Before:

newptr

‘o’

NULL

head

‘n’

‘w’

NULL

previousptr

currentptr


240 222 computer programming techniques semester 1 1998

After:

head

‘n’

‘o’

‘w’

NULL


Code fig 12 3
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


240 222 computer programming techniques semester 1 1998

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");}


240 222 computer programming techniques semester 1 1998
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.


240 222 computer programming techniques semester 1 1998
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');


5 6 deletion
5.6. Deletion

LNP head;head = string_to_list("new");c = delete(&head, 'e');

head

‘n’

‘e’

‘w’

NULL

previousptr

currentptr


240 222 computer programming techniques semester 1 1998

tempptr

head

‘n’

‘e’

‘w’

NULL

previousptr

currentptr


Code fig 12 31
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


240 222 computer programming techniques semester 1 1998

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';}


Some comments
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.


240 222 computer programming techniques semester 1 1998

  • 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.


Dangers
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


5 7 list membership
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); }}


5 8 print a list iteratively fig 12 3
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"); }}


240 222 computer programming techniques semester 1 1998
Use

LNP head;head = string_to_list("old");printList(head);

The list is:o --> l --> d --> NULL


Print a list recursively
Print a List (recursively)

void printList(LNP cptr){ if (isempty(cptr)) printf("NULL"); else { printf("%c --> ", first(cptr)); printList(cptr->nextptr); }}


5 9 list length
5.9. List Length

int length(LNP cptr){ if (isempty(cptr)) return 0; else return (1 + length(cptr->nextptr));}


5 10 concatenate two lists
5.10. Concatenate Two Lists

void concat(LNP a, LNP b){ if (a->nextptr == NULL) a->nextptr = b; else concat(a->nextptr, b);}


240 222 computer programming techniques semester 1 1998
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


Dangers1
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