cs235102 data structures

18
CS235102 CS235102 Data Structures Data Structures Chapter 4 Lists Chapter 4 Lists

Upload: basil-johns

Post on 02-Jan-2016

18 views

Category:

Documents


0 download

DESCRIPTION

CS235102 Data Structures. Chapter 4 Lists. Dynamically Linked Stacks and Queues (1/8). When several stacks and queues coexisted, there was no efficient way to represent them sequentially. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: CS235102  Data Structures

CS235102 CS235102 Data StructuresData Structures

Chapter 4 ListsChapter 4 Lists

Page 2: CS235102  Data Structures

Dynamically Linked Dynamically Linked Stacks and Queues (1/8)Stacks and Queues (1/8)

When several stacks and queues coexisted, there When several stacks and queues coexisted, there was no efficient way to represent them was no efficient way to represent them sequentially.sequentially. Notice that direction of links for both stack and the queue Notice that direction of links for both stack and the queue

facilitate easy insertion and deletion of nodes.facilitate easy insertion and deletion of nodes. Easily add or delete a node form the top of the stack.Easily add or delete a node form the top of the stack. Easily add a node to the rear of the queue and add or delete a Easily add a node to the rear of the queue and add or delete a

node at the front of a queue.node at the front of a queue.

Page 3: CS235102  Data Structures

Dynamically Linked Dynamically Linked Stacks and Queues (2/8)Stacks and Queues (2/8)

Represent n stacks

top item link

link

NULL

...

Stack

Page 4: CS235102  Data Structures

Dynamically Linked Dynamically Linked Stacks and Queues (3/8)Stacks and Queues (3/8)

Push in the linked stackvoid add(stack_pointer *top, element item){void add(stack_pointer *top, element item){

/* add an element to the top of the stack */ /* add an element to the top of the stack */ Pushstack_pointer temp = (stack_pointer) malloc (sizeof (stack));stack_pointer temp = (stack_pointer) malloc (sizeof (stack));if (IS_FULL(temp)) {if (IS_FULL(temp)) {

fprintf(stderr, “ The memory is full\n”);fprintf(stderr, “ The memory is full\n”);exit(1);exit(1);

}}temp->item = item; temp->link = *top;*top= temp;

}}

top link

NULL

...

item linktemp

link

Page 5: CS235102  Data Structures

Dynamically Linked Dynamically Linked Stacks and Queues (4/8)Stacks and Queues (4/8)

Pop from the linked stackelement delete(stack_pointer *top) {element delete(stack_pointer *top) {/* delete an element from the stack */ /* delete an element from the stack */ PopPop

stack_pointer temp = *top;stack_pointer temp = *top;element item;element item;if (IS_EMPTY(temp)) {if (IS_EMPTY(temp)) {

fprintf(stderr, “The stack is empty\n”);fprintf(stderr, “The stack is empty\n”);exit(1);exit(1);

}}item = temp->item;*top = temp->link;free(temp);return item;return item;

}}

item link

link

NULL

...

link

toptemp

Page 6: CS235102  Data Structures

Dynamically Linked Dynamically Linked Stacks and Queues (5/8)Stacks and Queues (5/8)

Represent n queues

front item link

link

NULL

...

Queue

rear

Add to

Delete from

Page 7: CS235102  Data Structures

Dynamically Linked Dynamically Linked Stacks and Queues (6/8)Stacks and Queues (6/8)

enqueue in the linked queuein the linked queue

front link

NULL

...

itemtemp

link

rear

NULL

Page 8: CS235102  Data Structures

Dynamically Linked Dynamically Linked Stacks and Queues (7/8)Stacks and Queues (7/8)

dequeue from the linked queue (similar to push)from the linked queue (similar to push)

link

NULL

... link

front item linktemp

rear

Page 9: CS235102  Data Structures

Dynamically Linked Dynamically Linked Stacks and Queues (8/8)Stacks and Queues (8/8)

The solution presented above to the The solution presented above to the nn-stack, -stack, mm--queue problem is both computationally and queue problem is both computationally and conceptually simple.conceptually simple. We no longer need to shift stacks or queues to make We no longer need to shift stacks or queues to make

space.space. Computation can proceed as long as there is memory Computation can proceed as long as there is memory

available.available.

Page 10: CS235102  Data Structures

Polynomials (1/9)Polynomials (1/9)

Representing Polynomials As Singly Linked ListsRepresenting Polynomials As Singly Linked Lists The manipulation of symbolic polynomials, has a classic example The manipulation of symbolic polynomials, has a classic example

of list processing.of list processing. In general, we want to represent the polynomial:In general, we want to represent the polynomial:

Where the Where the aai i are nonzero coefficients and the are nonzero coefficients and the eeii are nonnegat are nonnegative integer exponents such that ive integer exponents such that

eem-1 m-1 > > eem-2m-2 > > … … >> ee1 1 > > ee0 0 0 .≧ 0 .≧ We will represent each term as a node containing We will represent each term as a node containing coefficientcoefficient and and

exponentexponent fields, as well as a fields, as well as a pointer pointer to the next termto the next term..

0101)( ee

m xaxaxA m

Page 11: CS235102  Data Structures

Polynomials (2/9)Polynomials (2/9)

Assuming that the coefficients are integers, the type declAssuming that the coefficients are integers, the type declarations are:arations are:typedef struct poly_node *poly_pointer;typedef struct poly_node *poly_pointer;typedef struct poly_node {typedef struct poly_node {

int coef;int coef; int expon;int expon;poly_pointer link;poly_pointer link;

};};poly_pointer a,b,d;poly_pointer a,b,d;

Draw Draw poly_nodespoly_nodes as: as:

coefcoef exponexpon linklink

123 814 xxa

b x x x 8 3 1014 10 6

Page 12: CS235102  Data Structures

Polynomials (3/9)Polynomials (3/9) Adding Polynomials

To add two polynomials,we examine their terms starting at the nodes pointed to by a and b. If the exponents of the two terms are equal

1. add the two coefficients

2. create a new term for the result.

If the exponent of the current term in a is less than b1. create a duplicate term of b

2. attach this term to the result, called d

3. advance the pointer to the next term in b.

We take a similar action on a if a->expon > b->expon.

Figure 4.12 generating the first three term of d = a+b (next page)

Page 13: CS235102  Data Structures

PolynomialsPolynomials(4/9)(4/9)

Page 14: CS235102  Data Structures

PolynomialsPolynomials(5/9)(5/9)

Add two Add two polynomialspolynomials

Page 15: CS235102  Data Structures

Polynomials (6/9)Polynomials (6/9) Attach a node to the end of a listAttach a node to the end of a list

void attach(float coefficient, int exponent, poly_pointer *ptr){/* create a new node with coef = coefficient and expon = exponent,

attach it to the node pointed to by ptr. Ptr is updated to point to this new node */poly_pointer temp;temp = (poly_pointer) malloc(sizeof(poly_node));/* create new node */if (IS_FULL(temp)) {

fprintf(stderr, “The memory is full\n”);exit(1);

}temp->coef = coefficient; /* copy item to the new node */temp->expon = exponent;(*ptr)->link = temp; /* attach */*ptr = temp; /* move ptr to the end of the list */

}

Page 16: CS235102  Data Structures

Polynomials (7/9)Polynomials (7/9) Analysis of paddAnalysis of padd

1. coefficient additions0 additions min(m, n)where m (n) denotes the number of terms in A (B).

2. exponent comparisonsextreme case:em-1 > fm-1 > em-2 > fm-2 > … > e1 > f1 > e0 > f0 m+n-1 comparisons

3. creation of new nodesextreme case: maximum number of terms in d is m+n m + n new nodessummary: O(m+n)

))(())(( 01010101

ffn

eem xbxbxBxaxaxA nm

Page 17: CS235102  Data Structures

Polynomials (8/9)Polynomials (8/9) A Suite for PolynomialsA Suite for Polynomials

e(x) = a(x) * b(x) + d(x)

poly_pointer a, b, d, e;

...

a = read_poly();

b = read_poly();

d = read_poly();

temp = pmult(a, b);

e = padd(temp, d);

print_poly(e);temp is used to hold a partial result.By returning the nodes of temp, we may use it to hold other polynomials

read_poly()

print_poly()

padd()

psub()

pmult()

Page 18: CS235102  Data Structures

Polynomials (9/9)Polynomials (9/9) Erase PolynomialsErase Polynomials

erase frees the nodes in erase frees the nodes in temptemp

void erase (poly_pointer *ptr){void erase (poly_pointer *ptr){

/* erase the polynomial pointed to by ptr *//* erase the polynomial pointed to by ptr */

poly_pointer temp;poly_pointer temp;

while ( *ptr){while ( *ptr){

temp = *ptr;temp = *ptr;

*ptr = (*ptr) -> link;*ptr = (*ptr) -> link;

free(temp);free(temp);

}}

}}