Professional Documents
Culture Documents
Program Design
Program Design
Wherever th',sre Is modularity ''''are is the po,~e:nttal fO'f misunderstandIng; Hiding informatJo'n implies a -IuJed to check aammunicstion.
-- that real-v orld program 1Ii- larger ihan the exampl _- inthis b ok, DIJt Y u m " nO'l realize ju t how m -, 11 larger. Faste r _-PU and larger main memorie -
-a e m e it pe ,m 1 - (, J writ Ipr gf I _. th t W luld have bien impractie al ju',t _
f __ W 'lear ago, _ hie popularity f graphical user intc,rface'" h~ adde - greatly t the ,-_-' rage Ieng h,'- a program. _, 01 full-fer 'lured programs 11 d _ are at 1"1 [00,0,0 Iines ID'o'" - ,-lUi n-liru plf- grams are COmDl', nplac '-, • d it's not unheard ... _ f for ,0 pr ,gram b _ e ] 0 millie n line I, r more,
Although W-. n L desizned for' riting large programs, rru n large prugram~ have in fact been writren m C, If, tricky, __ d it require a great deal of c ore but f. I an -- done, 10 thi 1- apter, [H discus "e_hm,_lIc, dl, _ have proved hel __ ul f r writin _, larg __ program: and' how - hich "features (the B ta'ti c storage class, for example) at' " specialf u _ ful.
" ritina I. _r,_i~ pr,. zram 1 ',. len calle d -.roc ramming-in- I. e-I ·'-~I, '-I!I', ]·1 quite dif-
ferent from writing sm U one -if· like the di nee betwe n _ritin~ ,I nn _ ,I er (10 pag • de uble-: aced, IOf COOT e and ,]1 O=-P~~··' book.v large pr, .~ ram requires more attention to style, In '8 many people will be orkins on ·H,. It T I, uircs "arefu! documentstion. r_ uir . plannin" " r m. inrenance. inl if: it ' . ill Iik 'ly be modified marr time."
Ab "a11, 18 lar ~ rusram requires c ,-. fu] d,·t n nd mu 11 more planning th' 11 a I ,m·w U P'f _ ~ ,m" . ',.. . L KR'_ '£11· _ ~ _ ,i,'-'n . r I "lll, malltalk p 0 rammin . l nguag '", puts iL ~you een -bui~d a dogbou· out of ,lllY:lbin,g.'· A d gbou e can be built- withou ., ,- ... p,I_· icul - I 1,-1 'n l .. in, - h ,.~ ,·~'r .; e -'. _ .. ar - at h:md~'~ house
for humans OD the other hand is [ . omplex [0 just tbro, together.
ICh pt! r I, I dl cur ,", ed writing Iarg , prll- ams in .' but i C ,n·· I ~aled OD Jan-
guage d tails, In thi I, bapter \ e H r~' isit th t pi "~I thi time focusing on t ch ... ni, ues for good program de Ign. A complet diseu si n f pro. - i o'~ iw I" nd the sen ie of . is book H'9l- .' r, I U 'Itfy '"0
484 Chapter 19 Program Design
~ orne irn ~" " rtant c nc pt in rogr ~ d esi and 110 ,hw .u _~ them to creal'
pr l!Jam~, that are read b1 td maintainable.
1'-1 ction 1111 dis ,'"I hoi', I,' iew ',_ pro,_ '~- m '-': , U eetion "f mo ules
that nro id ~ rvie -, ' [, ell, ther .. W ll then se how theconceors of in rm tion hi ~ ingSe ti n 1'9.2) and -II,tr _ t dat ,c CI" f "l:'b,1 '0 - 9,.3) 1_ sn improve nlod,we, ., By til u ,"tl .rm a single example (Q t_ _k dau 1[,-' 'I. :c, ction 1 ,.'1' Uta_ ate how an abstract dar typ can ne c~nl d and implemenn din'. Section 1 IM5des ribes some limitations of C for defining abstract data . pe I and she s hw [10 - 0 around It I' ' JD.
a ules
,0 deslenin a i, pro-a -- (I, r t1 pr, gra in 11, II her lan _ ua, ~ r F th'l t mar n, if'! - often u - , fill to view it ~ " a numbe 0"" in lepend nt lIllodrl,les'"1 A module j a eol-
le nion of [.VII' _, ~ '" m:c of which ar m d, I, I . 'i 11_ I 0, othe - P t, 0
'he-li'e'III. - '~ Each mod ule has 'n i"t_'rlll e that r I ':- - ib _ " the I,l ailabl Til detail Q- 'till ~' rnodu iiel~ ncludin lb, I '(J,UfC code for the stc ed in h" m dule ilJzplrflL'.6',nl! - ~'QI~-.
I _'n I ' f/', ~~'I' ervic es" j- - 'uncti In: 1 The int C,-'I 01 'I ule i ' a
header fil . containing proll-(~ pes _.01" [he fuacnons lh t rill be mad a allable to
cl ients I " u, TIe,'. Th - imph m _nhlli In ' 'rf ltd J ~ is : ~,U[it;' - I '
de finition ofthe m duk ' .. funr til' 11 '~
T 111U'~tr,';t. thi terminol gy\l II-f'- I, ~I", -t th calculator program that was ~,~ I t hed l S ti' n 1- ,..) nd I ,- - I. - _ ~ ~ p- - ID. i .t nf 'the ill ' Cell c .. c.
which c 'nt:~ "11', the main '", 'OJ "in and ala 'k module- ,hich jl I I, ton d in th iles sta;ck",h'Ddstalck.,c(~le he Iigure at th tcp f tbe ne tpagcf. ua.Lc .. c i a cliem of' th ,~ moduh ~ atack~ h . lh ;,11 tJf .' _' the ~II k m ule; il upplie I" er thing tb. eli, nt need' t I ~DJ" - , about' be module, stack. c 11" he
in ,I'J,ll,rnentat,iun of the mod JI ': it I mtains d'!- fmj[i ns of the sn e', fUD ·001 a, ',- I ~ Idee lara" 10m f the v J i_ bles ha rna_ c tip
The library it. , irs J '_ zollection t 1- m dul " Each head r in tb library
er 1_' a lb. interf I'e 1 a modal - ... <: s tdi_o " h», t . unple L the inte ~ ,I - tc B.
m I ule ,n. aining ]10 unctions _ blll < sri n9 ,~, h~ ~, the in erfa ' .. ' I~ module containing stri - ig-handling fun ·'Li ' .i~., Divi ing 'f pro aram illil I module ha
•
'I e I~
-, them-
•
moduh .. ' I 11- Pi I ., perly de 1~IL_ed- 'I I "3n tre . r hem l!! a'bstTac~
:.~ il of how
11,,'1'", m· ',re., k on the
"include ,~stdboo "h':>
void. Make_empty('v'oid) i bool is eWIP'ty 'aid) ,i boo,l J1Ls-fu111[void~;
void push (int i)1 ,F
;, nt pop (va.id) ;
int mate, (va±a) r '\
tnt contents [100] ;' int top -= 01;
)
voidmake_empty(v;oid)
{ s e.e }
ea Lc, C
bool is fu.~l' -oid)
( ~ ) -
void push (in' i)
( ~- )-
stack.c
ular pers,on .. Team member, can then work largely tndependently of ne '~ n nth er,
-: ,_,,-tJbility~,~ '_ ,Y' m, ule tb r P ides servi __ . t· p, r _ u abl .'
P'li grams;> Our . tal mo u~ _ I fi· example; i reusable, (, ill .. it's 0 -'" n h " 1'" anticipate the future uses of ,0 module, it Ii. a good ide rtn .. " gn module: 'or (I eu ability.
• I. atntainabili_ ~ . _ mall bu - ill u uall ,.;J( only' "',m_ Ie m dul impl '-
mematioa, m,_il. ' g th bus easier t Ioea I' and fix. 00 ~, the bug ha been . jed, rebuildin the program r uir I '. n1,Y a recompilation 0 ILh: -, r dule lmptememation (follow1ed by limiting the entire program), On a lars r "calc,
·e could repla . - au, enti m 'I. ule inn j mentation. pethap to improve sr forms ce r I . ben _~n ~p rtins ~", -;rl'gr '. ' to a ' .. - erent pl~ torrn,
.. J though an [hi .. ,e ad vanragl - are' impo - an'l In - intaiD' _ iU ty .. lh" _ m.I., lid .. cot Mo ,t real-world pro nms ar - in service to er a period of y- rs, during which bug ~I ar disco ered . nhanceme ts are made, and medific I' ion ar mad = t m _ e[
hanzms reoul · · · ul f hi 1L.-. •
C anging r quir meut '. e: -gUID' ,,_', programm am,' nr ,8., Ion mac mamte-
nance much le~~ i, r; runt inin program . h nild be like main . ining _ car- fixing ,8 flat tire shouldn t r quire o· erhauling the engin -,.
Far anexample .. \VIe need I k no further than the inven't.ory program 'of Chapters lltJ, and 17. 'The original program (Section 16".3) stored part record in an array, Suppose ah,ftL, aiter 11- j ng this progr m for a while the cu tomer objects to having I, fixed limit on the number ~f paru that can be tored, To satis ~ the ens ... romer, W' might switeh to a linked li t (a'~l- e did in' Section 11.5)., Making this change 'n, quired going thre ugh the entire progr~~m~ ~o,kln,g for all place --- tb~;,1 depend on the way parts are ;, toted. If we"d de igned the program differently in the first place-i-with a separate module dealing 'with p,arlt0cage--·we '\vauld have only needled to rewrite the implementation of (halt module" no' the entire program,
Once we're convinced th,a~ modular design Is [he 'way to go" the process of designing a program boil down to deciding what modules it should hav ." what services each module should provide, .. mnd bow the rno· hrles ahould be Interrelated, We"1] n,QW look at these is~,UC,8, briefly, For more infonnt1_lin abou1l design, consult a $0=11 ware engineering [ext, such as FUndfJn1r!fltaJs of SoftwareE n.grn,,(!erh\1 g, Second Edition by Ghezzi, Jazayeri and Ma,ndrio]] (Upper Saddle River N,.J.,: Pren-
.• 'L:1"",111 2·011'13-)
nee- r,w " . .u -'I.
Good module interfaces :IJie"'~t random collections of declaration . deigned program modules hould have two properties: .
• Hi" . clJ,hesio',',I:~, The elements of" each module should be closely related tv on c another: We might think of them IS, cooperating toward a commongoal. l-li,8h cohesion makes, modules easier to use and makes the' entire program easier (0 understand .
• Low ,C'o,gp,li:.g, .. Mednles s,bou1d be as indep nd, nt ot" eachother ,iI" pes sible, Low' coupling makes ireasier to O]odll)! the program l1.11ld IF.eUS'E; module 'II
Does tile calculator program have these properties? The stack module i" clearly cohesive: i·t" funcnons represent operations 011 ,8 ' tack. There's lliUle cou-
-lj'li'!ii -'"- - '~11 - ',- oeram Th ,,-'--"~ 1 ~ . file' de --,' die - -t -' -k- h (-' d ,- -t ' -, k -
P u.g to IU e pr "tiI~ ~ _ e e.a, u. '.' C I, I epen ,S all S, acx, ranc 8" ae", .' C
depends, on s t ,9. ck ., .h, of course), bu_t there are "10 other apparent dependencies,
Types, of'Modules
~£lD.a1: A h> he3.d~9f lP2,3L l' <.1 .i, m1 't a ~ .b ~ - h~~d9F' .'232
Because ,of 'the need for high cohesion and ~ow coupling, modules tend to fall into certain typi(;,a] categories:
I. A dill. ]loo,l is. ,S ccllection of related variables and/or constants. In IC~ a modu le of this ltype is often Just a header file, From I design standpoint, putting variables, in header fi],es i ·n'lt usually a good idea, but collecting related COD~ stants ina header f le can often be useful. In the C library, -c fLoa t .,h> and <:.li nrl t.s ,i h> are both data p _O~:~l.
- A ,li1Jr_arJ is a collection of related function s .. The -e s t: r ing ~ h:> header for example is the interface to a library of I tring ... handling function .. '
• Anabl·"lrrl,·",/jllc L a eollection o unctions bar openae on a hidden data
structure .. (In this chapter [be term I. object" has a different meaning than in the rest i f the ok, In ~ rmmolog ~I an object is simply ~ ~ lock . if me m-
" that ca ~ tor, ~. i]U. '. I.n thi b~ pu r 11' 1\11. r .. r ,an - - i' t i ~. 0"
I • ata bundle . Oil the I· ,. ' the. " ,t:' i' hi klen
abst act, ')
·rory-
• . n rdiSUll'_ data,. . , . type • ho e re pr ~ entad _ n is hidden, eli, nt
modules can u"e th tl/parl, 'e des, ut hav D' - cnowledge _ the
arucmre I. f th e van b • es, 'eli at m . - ule ,.1 perrorm .c _ IP rati n I.' D
such 3 variable it must call ,I functinn provided by the ab t =,'-, ( dat;l t ' _ modul . Abstra :-1 d ta types pi y a significant r Ie in modem rogramrnin ; we" U r tum- them it! . 'eclt n 19,~3--] 9.S.
All- e ign·d m ule ,_., ~ .. ps sc me . orm fa cr 't _Or m iu eli ~nt ... li-
. .n ~ '0' sur s_ ~- .... me ule ,f· '," nple ~ ha, 11 .. need to kn .. . hether th, l i
.. - red in an arroyo in ,I linked li ··,t, OT in some tb t rim. D J I . rate Jy COD, - sling D nforrnation from Lhe clien " 0" a module is known as. i'I'fo - I - nOI "idi" , .. Inferrm ~. i n hidin 0 hs .two ·rimary _ dvautages:
_. '" d. n t kn _ w he W tbe t;_ ,e ~ _ ,i' ~,'011 d, th Y '. ' on" t be ~ cJ _ to
orrupl i" by amperlng rith Jt ~ intern 1 orkings, To perre rm op r tj, n . n the stack thev' U have 'La can luncti n '. that are' provid d by th module It ,eU"-funcli .. D· thar v e' r: written and. t =., red,
• c_ Ie» :bi'lt .. ,.' - ing chi' g ~n rn -l er how la I. --(I ~_ In. dule "L internal orking WOD,"t b iffi,1 ult. For example we ceuld implement tb, tack a
an arrayr fir.,l then later witch to ' linked lis t Of' othr r p._ · c_ntatiOD,~
We"U have t 'rewrite th i-ml['nlcnlati'DIl ·f the moduli ur course, but-iF
he mr idule ' .. de signed properly-e-we n't have " alt r the module -
inte face,
In C, [be rnaj ,r L,oJ, for enfor in informati n hidi - g j' the stati,e 'S,( age Bt.stin5tinlag~das8 ~nJ.2 ela '., Declaring a variable witb file scope to be at.at.Lc giv,., it internal linkage, tbu [preventing it ft· 1]11 being ar I~' ed . 'om orb fr ., Ies, incl -, ing lients nt" the dul .. (Declaring a function t _, e at.at.Lc is · ]'1:" useful tho func ion can b dir tly called nl b ther unctions in th . am - file.
A. 'tack Mo -~ ule
o 'I - the benefit of information hiding J .... . 10k ,at two implement rion
stack m dule, on _ u ina an arr· and the other · I linked lis t . The . .. du ~. _,~" had ~r fil wHI have the following appearance:
488 Ch,apter 19 Pro:graml ,Design
s'fs\ckl,ti -#i,fndle,f STA€K H, :tI;d,efin.e ST~C'K Ii
#inc:lu,de <stdlhool. h>,
;- C!99 only *1
void make ...... empty (v.Qid) i bool, is_e'mllp,ty tvoid~ ; booI is~f·u.l~ (void) ,: void push~int i);
int pap('vaid~ ;
#endif
I've included C99"s, <,6't:dboo,1 ,. h» header '-,0 that the is, empty and is ~fu~1 functions can n~~turn. 1\ boo1 result rather than an int value.
et 's f rst use an ,alTay to i ml plernentth e stac k:
s'l.clt1,c . \ Lne.Lude < BtdiQ .' h> linclude <stdlib~h> iinclud-e iI,stack"hU
#define ST1\C:K SIZE 1010
static int corrt ent.s [STACl{~SIZE]. ; static int top = 0;
,static 'void terminate fc"onst cha.r *mesQagll!)
{
pz Ln 11:;: f I( II is: \ n .~~. mea sag'8) If exit (EXIT=FAILfJR.E) ;
vadjd ma,ke_empl:,y"void)
{
ttJP = 0:
}
boo L
{
}
bool is full (¥Did)
{
V,Q ie. pU-Sll ( in t _i)
{
if (is_full ( ) )
t. e.rmina'te ( II~ Error in pUSll:: stack i ,8 full. II )1 ; .eont.erit.s [top''t''l''] -r i;
}
in't pep (vod d)
{
i.f I( ia~a'mp~y' ( ) )
termin,~te(,~I'Error in pop r st.aok is e:mpty,. il'); r'et.ur'n orrn t ent.s [- - "top] ;'
}
The van b),e8, that make up the stack (cont.ent s and tOPI) are both declared at.at.Lc, since there's no reason ~or 'the rest 'of' the program to access them directly. The ter'mina.te, function is alsodeclared s t.at L c. This function isn't part of the module s interface; instead if, designed for ue solely wlthin '(he implementation of the module,
A a aaner of ' tyle, 'orne programmers use macros to indicate which func .... tions and variables are "public" (accessible elsewhere in 'the program) and 'which are "private" (limited 'to a single file):
#de,fine PUBLIC t= empt.y * I #define PRI'VATH, atat.i,c
The reason for writing PRIVATE in ste ad, of stat.f.c ill that the latter has, more [han, OD_ use in C,:, PRI'VAT'E makes it clear that we're using it to enforce info m,8J~ tion hiding .. Here's what the stack implementation would look like if we were to use P·'UB" 'LIe· an' ... 11 'P,'RI'IV''"fIITE·'
IJl-:~ ._L_" _' I"'~ -...J_ .~:' :u. ~ ;.,-1 '.I.'~l.-· ~
PRIVATE Lnt cont.ent s [STACK SIZE] ; P:RIVATE Lnt; top. •.• ::: O';i
, '
'PUBL,I c boo'l i s ~ empt; y (va id) .( ... " } POBLlt(:! bool i,3 full (void) -{ ., ... ' }
prUBLIC in:t pop (void) {: ... }
s,ta't:1c2~c ~.in,c'lude <s,tdio ,. h> #inelu,de <f~rtdlih,. h:> ~ I inc 1 ude III staok .. b ~m
at.zuct; node ,{ int dat.a r
st,ruct node =next :
} ;
st at.Lc at ruct node *top -NULL;
static valid t,e1rminat.J21(COns,t chaz *·m8.6B.a9'~)1
{
pz Lnt.f (~~ %6.\0'111, me·ssage) i .Qx.i t, 'EXIT F1l.ILtJliE) ,t
}
VQ,idl make'~le'mpty (void)
{
whi Le (l i s_.eRl:pl'ty ( ) ) pOTP' () ;
h'ool
{
}
'bool
{
}
r"e t.u ~ f =;, 111 E!t.D ~
.IL.,. .' ..... ,iI;;L . aA,..."",,~ ;'
voidpuah (:i rrt; i)
{
·s'tru·c·'t, node '*ll,e'w node = malIce i(s:izeof (str.u.ct nod:e)) ; i£ (new node == NULL]
term..in,ate fit Error. in. push . ,s'ta,ck is 'full ~ II) ;'
n.lew' node-o-dat;a. = i~' new node->next ~ top; tojp = ~w BOld1E!;
at.ruct; node *'olld_'I:,o'p.; int i;
if (i,s~empt·y {) )
t.:e:rminate I( II Err.o.r .in POIP:: stac'k is iempty ~ '!'I) ;
ol,d_'top :: 'to,P i
i = to'p- >data; tap .=. tlop'" >n.e.xt. ;' free' (Ol'cl_top) ,: re.t~urn. i;
}
Note tbat the is_fu11 funcrion returns fals~ every time it's called, A linked list has DO 1 imit on its size . 10 ILb ·:tack wil I never be full, It's p~: sible (but Dot Ijk1ely) that the programmight run O~It (If memory, which 'w'jU cause the push function to mll~ bUL then:' I; no ea y WtiJl'y to tes t for til' 1 condition in. advance.
OIUJ' stack example showaclearly the advantage of information hiding: i'l
19.13
do .,nt matter' h. ther we u,:c stack1. e or ,stack2' ~ c to implem _nt the stac
module .. Both . ,'(. j ,n' - match 'til mo, ule' . int erfa .i~, 1 ,'. 'e un ~" itch from on' ,0
the other without h" rving t chan es else her' i " the p_ i ram,
,es
m '. ule th ' an abstr ict 'I' e "I ~. -. I he ,rue. _-_ duk in " f'e' i -u .,
ction, h. __ · " :1 ious dj, advant , -: tb 'I", ~, I n. Wei_: [I hs vie mulllii . in t nees of the 0 ,~ect mer than one stack in thi ca ' , I,. To accompli' 11 '11 .' ~ e' ~ ~ need to go a ste '1 fur er nd cr ate a new t pe.
One - e' ve de fined a ,Stack t"P " many stack ~ - e
"111 meat illu trat '., hoO' '. e co rld 11. ve t 0 tacks in the same
S,tack s
g- ""'i ,~
" 4. i
make lempty(&s1) ; make empty ( &s,2)1 i
~
pus,h I('"S~, 1):.
push ( &09,2, .2) t
it: I( lis~empty(ics1»)
pr,in'tf r H%,d\n~", pop (&B1) ) ;
Wi "ric not really sure , hat 131 and s2 ~'-_ (structures '? pointer, ,?). but it doesn't nU11,'J:. . ll· . 'lien ' I, :81 and s:2 ~ b· tra -ti .'nl ha ' JiC· P md t .,riain' .. peratioi c.IO,~ (make __ ,empt:y, is_empty i,s_full~, push- 'PIOP'~
L t'l .convert our stalcklih header so that itorovi "I a St,ack typ"--" where Stack is, a struc ore" Dingo, UJ require adding . Stack UT Stack *) par-' - tert .'aL h fun tion~ TIl be' d· win nos I _Oi, I~ 1 iliis I( chanze tc S," ac ., h ' in. bold~ ufll:hanged portions ofthe beader - en't shown):
*dle!i,ne STA,ICft S:IZE 100
typed.ef sitruct., {
1D,"t contlents [ISUTACX artiE]: iQ,ttop,:
} S'tack,;
voidmil.l~e_empty (Skack *9) j' boo'l, i,s_empt:y ('c!Q'BB't Stack 11'9) ; bool is_ful-- (,CD; ,B,t, St,a"ck ... s,) ; void push(S't:_',ck ·'B, int. i)' i int pop (Stack .8);
he stack parameters . make empty, pushnd POIP nee _ [0 bep 'int r "l'luCte these unctions m i the sr C ... Tb paramet r t is_emp '~ ',B'n · s f'uLL doesn ' need [0 b a pointer but I v' c_' In, ' de it on, - an)"" ay~, II' '. ing the ~ unctions Sta,lck P'I in te I in tad ef a st ack value i m re effi ient~"inc'. ~ the latter -~, uld
~l ult i a tru tore being ", - j d,
492 Ch,aptet 19 Pr:agram Design
En, --apsols'ti,on
Unfortunately, S,tack isn' nn abstra ·t dan Itype,!, since at.ack '" h rev DIs what tbe,S,tack, t p reall: is, N, Ithino pr,e, I nt 'eli /Dt~ from usin Stack variable a at structur :
Stack 91;
,sl. tocp = 0;'
sl. oont.enns [tOPI++] ~ I"
Providing ace ~~, to the t.cp land con.t.errt.a m,~mbef allov .client to corrupt ch '
~"""'II,""- .,r ~tilL -- ,J l be lble (1_ change the , ' C ' " are stored ,. ith ut
having to ,se,,;, th ' effect I - rhe chan 'on eli Ill' .
- bat ~ need i \. -I pri en I Iients ' _~ "n1, "n in bw the Stack -~ i - repr sent d." has 0 Y Iimit sd .c upport f r IIl,R,_f Q' -I -,Illan :g type in t '·1 wa '. Ne ver '-bald k n c Itag 'in_-ladiIlS, '++,c Java and C#'J all bener e uipp d f r thi P' 'po
I clol,m II, 't l , 'pre ~
The nnly" ,i that C ~i_ s us tor 1_'.01 psul 'lion l tile "'IOlm" 'ete ,p',e~ (Incomplet type, were mentloru d bri fly in Section ] 7.9 ~O-I in th: QI, - ~" tion _ the len hapt r 17.) Th, C _: t ndard de cribe j ncom ple e ,. -~ e ~ , ' that d [rib - bj .s bu lac '_ info ' ne d.'d LI d terrnine til ir ~"Iiz, ample, til, declaration
at ruct; t;
/* incomp eta decla.ratian Q '~* I
ells the c mnlier tn-[ I ~ " I U"U, ture ta bu d sesn t deserib the memb r of' 'tbl
nruetur '. ~'_ ' a r sul eompit r d esn't h- - I 'ouch Information t ',' determine
the size of, 0,1 11 a tru 'lID~" The inti nt i that n inc omplete l pe will be completed _l! € ,~, here ill th pn gram.
_ "1 lonz sa type remains incomplete, its uses are limite d. Since the compiler
"'Iifi' o. r t know th size of an inc mplete type, it ~, nit,' us . to declare a" ariahle:
struct t 8',i
f*** WRONG ***1
Ho . e c_'r ir " per e ,t~, legal to d fine a point r r P ,.' that f t,', pe,:
This : pe tle initi ' ' I,' tate that a, \'~ riabl - f t- p ~ T i, '. I r poi H'C'f to a I, truetur ' with tag t. We~aJl now declare variables to ' pe T'~ pass them as argurnenu to func-
tioni land ,ertio n otb --r' op er til n ilia are legal f r P in . ; ,.. Ttl ' f
- oinn r doesn't dp nd n what il poims LIl hich I plain' why - allow hi'>, beha lor, bat - . an '. [ de 'I lh su '_ ~ i ~ apply th -:>' p , ator to '0-0. ~'" .f lb, - _ ~',arj,able', . nee rhe compik 'f ~ -- iws n tllin. " "bout the mem er "If ,8 t ,c, ucture,
,~.'N#"ii,h'lI D '"I'" ,A-I jIIllLarll.ll'A#t I' .1" I
(Ve:rS'Dd 1,J
, , illustrare h absn act dat _ l-,p c' be 1_11l . 'P" Iated u in in, romple leyp·'
we" JI develop a : .ac ~ ADI' based 0.111 the ta· 'k modul escribed in I ection 19.2. In
th. p . ess we n I ." plore thrice dirt" rent .. :' y rc im - lernenr the stn
Fir I we 'Il need I bead r 111 .that efine: our stael ·DT't- pe and ,'._~I . e prototyp '- S for the functiom that reprei nt stack p _rlal'ion~,. Let's name thi file sta'ck-·
.AD'T"h~ TIl. Stack type ill ~ pointer [ s' ac,k_::typ,e struc ure that : tore
the actual contents of th sta -k. his strur lure i ' an incompk ·'te It p -- Lh. t will be I ompl ted in the Illc thai impl men . th stack. The rnemb T his tructure will dend on how 'h. sta k t implemented, Her ' .. 11, 't he at,ackAOT,.hfile win 1u, k like:
#ifndef STACKADT' H '" de·fin.e S~ACKADT H
I' leg! only * I
t d f t t t k t ''liSt - .- k
: ype e ,S, -ruC'~ S .acr ~:- ype .' ac I.
Stack create (void) ; void destroy(Stack al;
vo id make_empty ( St aok S,); boo l is enlp'ty (Stack 6)1;' booI, is_full (Stack s) i voi.d push (S.t,dlck s , int i) ; int pop (Stack 5) i
#:endif
eli llt< tb~ ,t in lud ~ a tackAD'T .. h . HI re able [I . d:..' 1, - 1I j. 'bl,~s of typ. st.ack each of which is capable I f pointin c to ' s,t,ac]{_ tJIPlettucto:re;; ~ Iient can rbe n call tho funcri n. d cl- '-;C' in stackADT II h l r, P .. rm . aer till I. tl
tack variable .Tlo e er clk I1t . an t ace ',1' th m - fl,' ers the atalck~t'l'P'e
structure, since tt at s trucmre will be defined in al separate file,
ot ' th t ach function has a Sta,ck p~ m LI"_f or returns n Stack alue, The stack func i ms in Section 9M' h~ d P r ~ .. ter . of type Stack *,~ TI e reason for the' difference 'i tha a St,aLck variable is now a point r;, it pint t·· I· :stack_type structure that to I_I th, c nr n '.' .'1., tbe 1 t ck, _ un .tion needt mo· ify the s ack it changes the structure it ell, 11 t tile-oint r to' the nru - ture.
494 Chap'ter 1'9 PTiogram Design
:, enerall: do sn t need th,_ .~-, fun- tions.f ut " n , d. e crea.t·e ·~iU dynarnicnlly allocau metnory~"r ,a 'lac . including the memory required for a st,ack_typ,etroctur}, as well r ," initializing the stack to u "empty I' stat '. destroy wiH release the - _DC',- .. - r dyn"n ically allnca ed m~mo _JO
Thi _uU,w;ng client' e ean b' U-' ",- l- .l the .·t ~~k AD/T. It ere ites " . (11
",, __ JIIj:s.L,JI'. 'j, nd peru rm' I , • e y IIIP ~.r_ '~'·n . . n them,
sraallc:lien tar C' # inelude <: s t d,io ., h» #include ustackADT .. h"
int rnaa.n (void'
(
S"tack 91 t' S2; int 'n;
81 - cr eat.e I() ; s2 -- 'C,reate () ;
pushl~.slt1 1); pus h ( s 1 ~ 2);.
n ;; pop r( B~) Ii
p1rintf I( npoppe,d %d from 81 \n"I~, n l : push I( 82, n):
n ': PlOP (a 1) ;.
prlntf (!IIP'opped t·d fr,om 51 \n!I.11 n) i push I( sl.2 " n) ,;.
while (1 is_empt,y (,82) ),
printf'("Popped % fr.om 8,2\011, p,op(s2));
push, ( 82, J,) i n1ake_emp: y ( s2) ,; if (i.:s_s'mp,ty'(s2)')'
prin,tf r( U s2 i,e e,mpty\n,ll) i
else
printf ( III s2 is not Is,mpty\n~');'
pr . gram b uld nrc du .. ',:. the
return Q;
}
,~
1 D -=- outpu t
Popped 2 from sl Popped 1 f zorn s 1 P'opped '1 fro'm s2 Po;pped 2 from s',2 s2 is rem,pty
19~4: A Stack Abs,tract Data Ty;pe 495
implement Im-
plest, . te U 11 e lh s,t,ackAOT. c ,- t define I_" stack ' ype _ tru ture ~ '. that
it contain c a fixed ... len tb 3y (to' ho,ld the eont nt of 'til stack) L ng with an
Jut' ,·r that . e~lp.. track of the op '. f the st" ck;
sczuot; st,ac'k_type {
int cont.ent.s [aTACK SI:ZE] I int t1oiPi'
} ;
stackAO'J:c # incl ude <,stdio,~ h>, #includ,e c,stdlih ... ,h> #--incl ude 11' IS tac'kADT ,. h II
# !efine S, 1lCK SIZE, 100
struc-t ,S' ,ack~, ype (
in - contents [STACK_afIZE] ; int tOIPi'
} "
static v,oid termina .. t'e! (conat; chaz *message,)'
{
prin ',( II 'Its \n III, ms'ss,ag,e); exit (EXIT_FAILrURE] ;
}
St,ack create'(v,oid)
-{
S' ack a malioe ('sizeo - (s,truct stack~type}I)~'
if (s ~H~ NOLL)
terorinat,e (,lrE,r:ror an create: st,ack could not. b@ ,C!reated_ I 1 ; ,8 >to,:p =. 0;
re'turn 81;'
}
void deatro¥(Stack s.)
{
free (s,) ;
}
void make_,e'mpt'y (Sta'ck s)
{
b,olo,l is_empty' (S:ta,ck :9)
{
r'Ed:;u,rn s -c-t op =~ 0;
}
stackAD1:h t{ve,rsl'o,o' 2}
beol is full (Stack B)
{
ret.urn ~,-">top ~~ LBT1U~K SIZE:
~
void push f S,tack stint i)
{
if ( is _f ull (s) )1
·termina.l e ('!ErrC!I,r in push: stack is f'011. II) i ,8- >Icontents [s ->top -+] ;;; i:
int p,o- (,Stack B l
{
i _ I( i E --. emp ty ( s 1 >
f lermina'tel(,mBrror in pop: stack is empty" III~I; return ,B->content,s[.".;ooos->_op];
}
The mo: 'I ' triking thing about th ' functions in this _ ~ lie i'" b,a:, the use h·· - .0..;:> o ier,EUOf\ no the ,. op rator to 18~' .ess ttl' cont.ent.a ' . -d tOPI memb f, 0 I tb s,t,_ack_c'yp,e structure, Th S naram -~~r j pointer to a stack_typ,e stru 'ture, not II - tructure itself '0 using I he ~, operator would hie' illegal,
" ,0\ tIl- 'I we have Q working vel '.' ion of he . rae . ADIT- let S try tJe irnpro e it t First. n te that l ·m.'_· in the stack mus t be integer: ,. That' '"_00· re rrictive: in [~_.I, , he item
, r Ie doe n t real]: matter, Th- st ~_ item 1'0 Id jm t ~ I· asil b - lb,,, r •. 1_1: Lyp~
(f Loat; doub.l.e Lonq etc, I or e·" n structur . , anioln, "1 or poin "T' for that matter,
To make the stack AD'T' easier tomm ify tor differen item type ~ilef . add
r pe definition to the s,tackADrT ~:h beadier. It will define a type named IteUl~ r· pr ": .... mting the l) pe 0 data t be lor d . -D the' .sl . ·k,.
#if,nd,ef ST1\,C'KADT !-1 define ST'ACK:ADT' :8:
Stack create (voieD ;
void destroy(Stack 51; votd make~,empty (Stack s) ,i haol iB~emp't¥j(,Stack s); hool is full(Stack s);
void push (S't,cu:k a , ItleDl ;} "' Item pop ("SLiack s);
The change. to the ile e hwn in bold" BII '. ,id}c', the ad ition I . the Item type, the push and pop fun-tins hav ' been mo if d, piaah n .'. has Iii pat met -_ of
t.YP I t ern, and P'OP renu 0 --, Iue eft It em.- ". 11 U'L! __ • -, e ion
st,a:ckAD'T ., h ~~, rn n I. n: It replace ill.'. ,rii_ r ~r, ion.
The st,BckADT',,, c fil •. ill n_, d _ I be modi __ ~I. l match 'the new s't,ackADT, h, The change an minimal, however. -t he stacJc ~type~trllc .ure will ]lOW contain an array wh se element have t ,1'_ Item instead If Lnt.:
atruct st,aJ:::k_type {
I't,em cont.ent.a [STACK~SIZE] ;' Lnt; top';
} ;'
The only other change: arc to plush (til ,0 e ond p( __ ameter now has tyPI . !._ em and pop (which e tum', 18 value I r lyp _ I tem). The b dies If push and pc,p - ~e un hanged.
Th stack,alient .. c file an be ',-~ d to te ·'t the n. ,,- stackJU]T;o h . nd s.tackAO'T" C [I ... rify lhattb" Sta,c·k p '. ~. till works I it d: ,1)'. -, . , we I-an change th item typ1e ,U1IY lim . we want by imply modifying the defini ion I f the Item Itype in s,'tackADT" h,. I Although "A' won t have to chan e the sta,ck~ AnT .. c file, w;-' II . Iti It "' _ d .0 recompile 'it}
1m '1 "i!! tb ·'ta· k AD'T' U II D •
p[ __ rnentms .' .' '. "1 e' ._' I'" ,--In'; 18 , ' -. BlI! .
Anoth r probl - ml with the ~. ,8[_ k AnT . ~ il.~urlientl ',t"od' i." tha - -, ch . t ck bp I, :,
ti eed maximum i .1-, ,hi ~'b I UT'l1 nU ser at 11- items, This limit ,. n
;'n'l ~. .-1. d tn an num _ ~iJ 'h~ I, f cour c, - ut ~ n·t· , " ,rle~c' e using (he Stack ype wH1 ha' the' arne limit Til '. n ,way t . b ,':'tta,' ~ 'w-illl different capacities or to .. tll 1.'-,- iz as th P gram i~ running,
Ther are twc solu .ions [0 this problem, One i s 0 implement th e staek I'~",- II Iinked list in wl1ieh "'1. tiler s nr fixed limit nnits . iz Ii' W'j];n esti _ ate lhjl ,oluti n 'in a moment, First, though, I'~, ,'. (1'U1 r i~ ppr -. .h . hich in ' I '
d~namICBJ.I!I' lIaeated ,arm:,! ~ '7.3 to rin st ck it, in t " [I' mi _ally aU[ ., t' d __ r _y",
Th cnn to th· latter appr all i t m ill the srtack_typ,e ucture si that Lb contient.a memb r j ,~. ,01 f 'r L .th arra in . hich lh. items " 'e stored. not th . array itself
struct a,ta. k~type t ttem 'iICQ'll't'sntsl; int top;
int size~'
)- ;
I've so addeda new member, ,size.lthaL,li'.re· the tack" rm simurn ize (the h~ng'th,of'mearr'ly'[h'·.lclcn'tentsp·iD: '0), ···,enu.·~ this rnemb r n che t for the k,ttack full condition.
, he' cr'e'i3' e funcrton will DOW have a parameter that .. ' - e .ifi -"' I the . esired
stack create(ln~ size) I
When crea t@ i called, it win cr __ re s Lack _·typetfu tur (}II,u III arra 0 ~. ngth 5,1 ae .. The oont; ents member of the . tru 'uri.' will p iint to this array,
The s'tac.kADT ,. h IDle '\\/j]II b the s nne as, befor " . xc 'p1 [bat w' e'Il need to add a size parameter to th ere.,ate function. (Let's name the new ersion stackADT2 iI hi') The's t.a'okADT . c fil _ .. in need more extensiv . modification, how,e' er, Tb -, new version a pear b 1· w~ with change, . bOWD in
,s,tlJ',cIcADT2:.,t: #incl.ude <:5Itdia h> -#include <stdlib ~ h» jinc'lude 1-s'ta.ckADT2 ~hH
,e,! 1""UCt ,stack_'type { Item ·CCD't,s,nt;"s i int to'p;
l.D,t S'ize1i'
} ,
staotic. void tlerIDJ.nate, (C,ollst C!b.ar ~me9,sIJag,e)
{
print! I( u %,9.\n 1'1 ~I m,ess"ag'e)1 ~ exit (EXIT_FAILURJE') ;
Stack create (int size)
{
Stack B = mallo'c '(siZe,Q'I (8 ruct: s'taq;k_'type)I)1 i '! f (- "'1Tn TL·· "u
1.. . ,S ='- .1-" Y ~ J
t.ezmi nat;e (~"Error in create: stack cou'l.d riot; be create'." I) 1 ;B,~>,eontBnts, ,= ,ma:L~'Qc [,size * size,Qf {Item,') ) :
if 1(,s-~lIc.on·tent:B =~; NULL) {
fr'ee (s) ;'
t,ermin,a'te 1(' ",Eixror in Iczoe"a"te I s1t;,ck cou.1,d not b,e cr,e,a.t,s,d .. , H', i
}
• •
s ~ ::>B1ze -= ,S1ZS!,;
re'j!o.., rr'n 6' • . IL;,.,~ ... ,
}
vod d destroy ('St'Qck, lEI)
{
free(s-~conteDts) , free (.91) It
boo l
{"
}
ia~[empty (Stack 9)
bool is full(Stack s)
-
{
~,=. - "'. u- rn· n ~ - .... ·til'"'ll'n _ _ s- ,_, ..... s-.r;; 1IJi2 e ..
:.L ~ II;... ~,.,- _ """"~' - _, -,-,-. ,I!l' _'_'.£,g_ 11'
}
vot,d push I( st~ack s Itlem i)
{
if (ie~ful.l (,s) )
term_inat,e i( UE:r"l"',or in p1us,h: stack .is full" I'll) ; S ->C~lclnt,E!n't,s Ls ~ >t,op'_++ ] == i;
]
Item pop (Btack s)
{,
i_ (i,B_empty (s,) ),
terminate (~rrEr:t:lor in pop, ; ~rtack is empty'~, I~) ; rleturn e ->C.OI.aJ:ents [ _ -'s- '>top] :
}
The Icreat,e function :D'DW calls malLoe twice: once to allocate at stack, t.vne
~ J~
structure and once to allocate the [array that will contain the stack i ern ... -. _ ither call
of ma t t.oc [could fall causing t.ermina'te to be called, TIlle ,destro,y function must call f'r'~e twice to release an the memory allocated by cz'ea t e.
The stac,tel Lent; 'I' c file can again b 'used to test the stack AD'T. The calls of cr'eat,e will need to be changed, 11ow1ever"s,1nce cre[at@ now requires IJ1 argument, For example, Wit could repl,alce dl'e statements
9:1 ~ c:reat,le I~) ; 8.2 :' C rea;t,e C) ;
sl - create(lOO); 92 = craa'tl@; (_2DD)1 :
Implementing the Slack ADT Using a Linked List
Irnplernentirtg the s~BCIt A_DT URiHg ;1- dynamically allocated arraygive I us more flexibility than using a fixed-size array, However, the client 1.S still required to spec .... izy ,I maximum size for a stac '. [Bel the time it's cleated" If we USIC H, linked-list implementation instead, there 'won't be any preset limit on I besize of a stack,
50'0. Chapter 19 Program DlsfJign'
'Our impl men a ion will b. irnih r to 'th. in th· stack2 .. e file of '. ec-
tian ~0I.2. The linked li ",I will c' 'o,j t of nodes, .~. pre. eo, e by the following stru 01],_ ture:
at.ruct; node ,{ Item oat.a;
Sltru,C·t: riode *next; } ;
The typ" of th 1 dat.a mernbr r "I-~ _'W Item ratll' r han i i It .. b [ he stru nure ~ otherwis . the same as before.
Tb ,s I' ack _type .• I ~UC' ILl! .
Is't'ru,c't: staclt~typle ~ struc't node . tOiPI,i
) ;
. de i _ . ·16. .... ··11 ',.
n . e In Ui;: '"
_'l first glanc [he stack_'t.~ uructur eems superflu u ~ .. e could jut
define Sta,ck o be struct no,de 'Ii and let a Stack alue b poin er o the
first nod In the list, H', ,e, er, ~c . till need the st ack_t"ype tructure s 0 'that the lnte c'e l- .. he ~- L_ c_ rlem, ins unchans ed, (If " r jd I" ,; y ,. i1h i "' ~'y fun '-, ...
Lion tb~'t. modified the ~·.,'a,c'k 'would need __ S aok parameter instead of a S'tack parameter ) sorecver ha in- th st,au~:k~type tructur ill make it
I c ie:r to chan I the impk rn mation in 111' uurre, should w decide [0 store additional i nfonnation, For' I· mpl i ~ I ' t t r ci It that Ull stack ~ type ,truetur should ' : .n'[t. in a count " h w m . v it '- ire ICUI'l, ntl uored in the "lac - we can I sily add a member to the s;tack _type- tructure to ',lr'Drl Illii~ in form _ -
,pr:in~ f ( I~ ts \n.1I ,t mess,age); ,ex:i (EXIT_FAI'LURE);
•
1 [1,.-
We WD,J]"'L meed UJI mak any ehanges to the stack1illT,.,h bead, .. IW_ ]I u:,- this b ad r file, no' s"tackADT2~, h.) " _ e coon ' - .,101 U'I the " riginal at.ackcLi ant; . c 'ilt, 101' tine, All the I. ban' Ie will be in h s:tackADT,~ o ile, I ere' '- it .. ' new ersion:
sta,e-,' 'DT3.lc '"include' <sltdio. b" "~include <stdlib .h~
o 'IDel ude t' s ackADT ~ h il
,struct node ( Il:lsm da a,
st-ru~:::rt node *nex't i
i ;'
sta"ticvoid terminate (ccnst; ch,ar *mf!ssage)
{
IS'tack e'~ea'te (vc&d)
{
Sta1ck s :: tnaI Loo (~izeo'f (struct SJtack~typ,e)) i if (5,.== NULL)
-termin2tte ,( ~1'Error in e're'atei: ,stack oou.Ld not bile created,. Ill) ; ,S - :>tOlP = ~L.;
return S'li
vod d Idestr.ory' (Stack al
{
mak,e~e'mpty(·s)' i . ree (5)1 ;
}
vof.d m,ak1e_lempty(St,ack s )
-{
while (!is_emp-YI(a))!
POIPI (s) t
boo'l i5 __ empty (Stack s)
{
return B,~·:>'top ;:= NULL;
}
bocl is full (Stack s)
{
return false;
1
void pusb{St,aclt S't Ita,m i)
{
stru,ct node ·*new node ;:: malloe (size',of (struct no,de))I; i£ (new node == NULL)
termin,at'B' 111~IError in puah . st~ack is fu11". ~il) ;
new node-o-da t a = i;'
- .
n~'w_node.->n,ext ~ s,->top;
S->t:·0p = new node;
}
r- em pop (Stack IS 1
{
struct nod@ *old_top; Item· ~;
if (ie_ empty (s) )
terminate! ('~Error in pop: stack is empty. I!II) ;
old_'.op ....; s,->·toPi i = 'old_top·- >d,ata;
s .... _>; lOP == old _ tOIP ~ >ne . t ; fr,@e I(old:__·top) ,;
"I"eturn i;
}
502~ Chapter,'9 Program Desig:n
Note that ·~e Idestroy function calls m,ake~empty (to release the memory occupied by thenode , in the linked H, ,It) before it calls free (10' release the; memory for the stack_,typ,e structure),
Section 19,.4 dese rib ed a staek A " and showed several ways to' implement it Unfonuuately rtlli, I ADT sut er from several problem tha prevent il fro IHI being indu trial-strength, Let's lock al each uf these problern~ and djscll. , possible solution'~ .
The stack ADT functions currently h - ve short, easy ... to-under tand n,aU~:ME~S,: ereat.e. das t.roy, m,ak'e~e:mpty~ is, __ ernpcy, is_full~ push" and pop, If w have more than Ollie .A'D'T in a program, name clashes are likely with functions in two modules having [be' lam' nam ., (Each ADT wul Deed its owu cr'ea,te' function, for example . .) Therefore; we'Il probably need 'to use function name (111Ql inclrp ':rat,e the name of the AD' ' i ,elf,ucll as, at.ack create in' tead of" ,cr1eate.
The srack AnT deals 'with error: by displaying an error mes I age and terminating the program, That's 00' a bad thing to de, TIl programmer call !avoid popping an Icmplty '. tack or pu ihing data OI.n-tOI Iii full stack by being careful to call i,s_'empty priorto each call of P'OP and iSI~full prior -JO each cal! 0" push.: 0 in theory there's ,DO reason for a call of 'prush or- pop 'to fail, 1(1,1]1 the linked- list implementatien, :~10\VleVer'P calling is_full i n't foolproof a rubsequent call of pu;sh t;, n still ihl1l.) Nevertheless, we might wanrt to pro ide aw,ay for at program '[01 recover from these errors rather than terminanug .
. An alternative is to have the 'push and POPI function return a boo.l value 'D indicate whether Of' not they. ucceeded, pnsh currently ,II a , ,8 vod.d return 'Lype~, '
it would b _' easy to modify it to return t rue if the push operation succeed: and false if the stack Is full. Modlfying the pop function would be more dj_fflcuI[~ since pop currently returns the' valuethat "N'S'· popped. - Iowever, if pop were to return a pointer to, 'tbi value, instead .. ,f the 'value itself, 'then POPI 'COU ~,d return NUL,L to indicate that 'IJ11! tack Is empty.
A final comment about error handling: Tbe C standard library contains :' as·aert mBrQreI )j!.·24_1 parameterized maero named aaae rt; ths tcan terminate a program! if a specified condition isn t satisfied. We could use calls of thi 'macro as repl. cements fur' he if statements and calls 'of termi.na'te that currently appear in the stack .ADIT.
~ ta,ck~ I)~ , __ d .. I
, nri . 0 he stack AD'T"~, Stac'k t '(_' .~ _.
C U)I' I
tbe st.ack~ r ,r
void Illsh(Stack s~ voi~ *pl; 'v'c"id ""pap ( S,·t-,ack s l r
PIOIP' r tu -- , point r t the item p .'p returns a mll . oimer,
Th· I 'if I tw' I i a ' ,n. es t u in~ void "lit ~ I L _ L . 1 c • '. 01," i' ha his
approf.j cb does 0 't w'. rk for data th at can t b =.' represi . led in poi nt. r £ rm. Items
c uld I', trms I, which . r. 1"', " .' en .... I Y a inl r I ' . ~r _ h _ _:, _~. ter ill lb-
strin or d nami 111', a~l~ eared L [_ U tu "Ifr. bUll n t b __ 'j',. _ ch .' int and
douhle. T111- other i '.~ d anra _ i'. that rr r ' I . sibl .
t cs .. tha stores void It i ms ill happil alii" t p Ij ~', the e': no W' , It - I 1I trct n 1= nil r ., us - dr .ID .I
Ip "
.. tal:_~ -. if th
. .
,1 empt I
AD
,
that w - '.'
dare d all \ ith mu b m ·rl
. - efi nin . eOI lli , -, lng the it m yp
++- f r Ie " rnpl
I I'll
'. 'JIIl
., .
Q:
• Ii!
'FILE_, pe d tn .in ust d ·lar, __
, lLE: typel ,.22. ,I < S I ,di a ~ h> I ~ B -'- f Ir '.' - rt rming ',I - abl ,ftyp FILIE *:
FILE *fp;
Th fp arial JI will then be . (0 ' ari 1.)1; file-handli ig men ns,
.nr I xp cte rea FI" 1 E -. Ian '_ I,. uacti I "T n
to knw what a FTLE 1, in order to u . tb FILE pe, '.' esurnabf FILE i
tru tu e " pe, '. ut thet _ tandar ", ~I." .... n tel D guarantee th at In -a _- it ._.,iI.._- tc much, I ,lout h -"-- FILE . U 1 i ire stored. 'm ~ ~ the definiti
FILE Ip, can land often do ': I V,r: -, comeilei
:U~:"I w· .can alv ays [oak in hie at.dd.o .. h file . FILE I,~
Ha in de n ,,0 I ther 1 ree -nl u. . fr 'In .' .," 11:- 0 - I:. t· ' I.' ,- .'" th . in' -_' ~
nals of a F'ILE .. Fa m I, .. rnigl t dis ~o, I r tb'_ FI"I ,E ]. " . trUl, tur with a
m ,- be r owned bs i z e 1I-' file -, buffer ~.jz'· ):
-Y'Pedef ,struc {
I buf_er size 'I
(j I
} FILE;'
ID_ . cnow about the bsi,ze m iber rh re's nothing 0 arevenr u from
,_., ,'in, the buff r ize ". - ,I' unicula 'ile:
o in' . n i· __ It ,j nood l,' " hi' " "r _ '_.U " 1-.[" .1 moilers -
-~'
buffer size unde a d~ f r nt name or keep, ", ck ,II il in some ntirel
w ,",1_ '·0, h e lh, " Irs Lze rneml -'f j": 11. '0 W r
f~p-,bsize =, 102 f
n111'" . I_n,w illthe detalls
to do, - en L WI 'l e next rel_ 'aile of th .
,~'r ". is a, dangerous thing
~,I-;"""_ " . h I. Ij I~r t ' mpiler r
IQ':' Wha:t o,tbe:r Ineemplcte l~ ~pes are there ,esl~,e: ineo - , p,l,et 's:trc'tDre 'I ~'pes,? [p, 492]
A:' One of the most CO~mJl10n incomplete types occurs when an array i_s declared with DO specified ,.Ill -'::
ext.ezn tnt at, l l ;'
After 'toi", declaration (which 'we first eneount red in S. iction 1,5.__,) a has :an incomplete type~ because the compiler doesn't knov ,a" length, Presumably ,at, is defined [11 another file within the program; that definition will supply me missing length, : nether incomplete type occurs in declaratiom that specify IlO length for a n array bu.' ~ provide an, i nlt iallzer:
Lnt; a [] = {. 1 ~ 2, ~ 3, } ;
In this example, the arr,~t ,a in!r.ialJ,:Y aa an incomplete type but the 'typ~ iscompleted by 'the initializer.
Declaring ,3 union tag without specifying themembers of [he UmOD also ereeM. ate an incomplete type. Flexible array member (8 c'g'g feature) have an incom~~exlblre 31'1raY memJbers, ,p 1i:9 plete type, Finally, voi.d is, WI inccmplete type. The void type bas, [be unusual property that it can ne cr be completed, thus making it impos .ible to dec we a variable of OU·, type,
Q: What D'tber' I',es,biclio: - is -,8r - Ille I. OlD tb1e Us ,of lneom p,lel- _.' p, ~. '1 ~P'. 41912]
A:, be sizeof open lor can't be applied '[0 an incomplete type (not urprisingly .. ,
.ince rbe "'i "e of an incomplete ryp'e is unknown I. A mernh - r of a structure 'Or union (other 'than :31 flexible IDT,a'y memberjcan't have an incomplete type" SimiIarly the elements of an array ,c,an 't have an, incorru lie e type., Finally, a parameter in u function definition can't have an incomplete type (although thi ' is allow ~ I in ,3 func ion declaration). The compiler ( adjUlst.:~: ,~, each array param rer in a function definition so that it bas, a pointer type thu preventing it f om having _n lnco 11- plete type,
l. fIllIJII;B is similar Ito a staek, IBXC)ept that items are added at ElIU: end but removed from the
other in at - :IFO' [first-In, fu~ . .t~Qut) fashion. Operations on a queue might include:
Insetting ,all item 91 tbe lend 0' the queue
Removing an uem from the beginning of the quetlle
Returning the t1 r~ll itemin the queue (witboun changing [be Ig neue) Returning the la ~ item in tl']Jc queue (w,itJtou'[ changing the queue] Testing whether the queue is empty
Wrille am interface for a queue module in lh ' form of ,I, header file named 'qUI9'UI!' • h.
I, (a rit -, an army based implementation of the q,UCllC module d - ribed in ~x-,rci.e 1. U se thre integers tDI keep b';ru -' 0 th 'Iljueue' -, ·hltU,,' ith one inte r [, ,rrO' ~h_e position 0 the first emptj ,1 1 in th array u .ed 'V hen an ltem i iusertedj, lh _ se ,. lid ,[,'lriIlgh, pe itil," n of the' next item to be removed ... and the third storin the number of" · "em, , in the queu, . An ins -rti n Oil' removal that w rld caus euh rof U,.:: nn l ~W' inte , ~" l~ b iner ment I,
lh IfiLl I, f the nrray shoul lnst ad _~ -,t the vnriable [i. I zer (I thus '_ - sing i' 1'.1 II rap arou nd" '1'0 the beginning I f the I';trf"ily.
b"· rite a: linked-list imp) mentation ,f the qoou, rm ,d.ul, d scribed in Exercise l. two poin ters, 011:1 pointing ~o the fu~ ,l nod _ ia the list and the other pointing '0 th ~ lasm n de, Wh~n an it m ~- in erred irm the qu u add i' the _Dd f 1111' li'L' h." an item ., renu 'vied I om the queue. delete mit fl noue in the list,
(,I) ri I, "n imple ,en. ti 11 1.·1 le' 'sta.:ck t, p ~ assurnin (hal S,ta.ck " c. ' , uu tUI
Udnhtw, a Ji - ed-I .. 11 gth array"
(b Redo the St,a.ck typ li irne 'U ,infl 8 linked [j~ l re pr "ent" ion instead fan
(Sh \V oih stack. h anti stack. IC.)
5. dif. tb ~, queue . h beader 101' -erci - 1.0 lh_ l iL define I a Queue type, here Queue
is ',LJiU,"tUl· xmtaining a fixed-l JJ1" uh . rray . see Exer ise 3(_,)). .,dif, the functlon in
queue '. h ro rake a 'Qu,eue~ param ter,
Sec -;ion 1'9.,4
(a) ··dld a pelek . unction to a tac::kADT ~ c. 'TJm stack .. Wh n called, h returns the top it, m nn Lh
(b) Repeat pia (a) ~ mndif itl@; S II ackADIT2 . e l1li time,
c I Rep"8t pact (a) modifying ,st~-arikADT3 . e ' .. , tim c.
uncti n w i ~ I ha· e a parame ter of ty p. t3.c-. bu t dee ,~l WI dily the tack,
1. -,,- u-'ify stackAJ]T~ . ,e ., th 1 ' , ,k ,lru~ 'm;ui~ally double. ill, size when it b -, ' -'m ., full , Have the push fu etion d.ynamicall,' aUe· ate a new arr y thru'·· twic a ... Ierge as 1.11· old one and th n cpy the ac content from [11_- old arra to the nn. Brie '0.1 1·1 b· e push deallocate the uld ,arnay once 'be data has been copied,
I. ,_: odify P_ : l' mrnin Pr ~' [L from Chaet r JOI, lfll i us-, the -tack AnT d j rib -d In
Se lin 1.11.:'t YOu 'rna, III e any of the irnph rnentations of .' D1 described in 1001 section.
_ di ,- Programming Pr ,~ecl ; urn Ch 'Pl· r 10, lh~ t it u e th Se ti, 'in J .. --, You may U I ,aDY of the implem emations ..• 'th ' ..
II lH Y IhcrtackAD'T3 ~ Ie flle of .... €tin 1"., b, d in,~ n in_ In m- er n m .-1 lien t I
th - stack_ -y:pnl,! tructu r e~ This memb r wiJ] ke "p UtI k OJ. bow many items are I. urrently stored in a tack. ,~dd:.1 n w fttocftion named length that ha;., ~_ S'tack parameter and returns tim alu of the lien m,eID,I-' r .. ',I, 11,e ; f th ~ 'i tin fun Ii D ' in stackADT] ~,Ie will need to _ 'Ie modified a~ I well.j M,od~", s'tackcl ient . e lb.D:t it calls the lenlgt'h
un . in (an dl pla- the value that it _' Ulm' I)' all, . ac'h operation that m dlfie ,,' tack.
•
Modify lh"~ st,ackADT. h .od ,sta,CkADT]" c files of - eti 11 I~t I 0 that a tack stores values ~ ~ P void it,,:a described in eeuon 19' .. ""', Lhe I '_ ,em ... pe ~, ill n 'I ng -r _ u· ed,
,~ dire - at aokc I Lent, ~ C . 'I Ill, ,I H ... P inte tOI 'Iring. in the sl ., .. $.,2 stac - ~OJ
S. Stal'tin~g from the queue .,h header of' Exercise l, create a 61e' named que:ueADT ~h that dianne's the following IQueue lyp :
typ,e,d.e.f 8t_ru.C~ qu..eue~type *"Queue;
qne·u€!_t.:YJ?~ is an Inccmplete stmcture typic. Create a f le named queueAD:T ., c that CODrains the fu ~ III de,tini.tion of ~eue_ type. as well as definitions 'for all the functions in queue . h,. Usea fixed-length array 10 store the items in a queue (se Exercise 3{a»)" Create a file named queu-eclien,t ,. c (simihu ItO. the B tac.kcl i~nt . c Jibe of Section ['9'.4) ll..b,alL creates ll\-V'tll queues and performs operations on Ulle111. Be 'SUIle te provide Icr-eat·e: arJtll des'\tr1oy functions for YOIW' ADT.
6. M1fJ1dif, Programming Project S so. lh:ll!~ the hems in a queue' ~Ire stored in 3, tlyn,amical]y allo ... eated, array whose ]'f!l1glh i, passed to 'the Icrela t e. function.
1," MIJd1fy Programming Pmje!lct 5 SOl tha~ the items fin a queue are stored In a ~inked ~is~ (see Exercise 3(b).