Source of linked_node_functions.h


  1: /** @file linked_node_functions.h
  2: Specification file corresponding to the implementation file
  3: linked_node_functions.cpp. The functions in this module are
  4: used with the demonstration program in linked_node_main.cpp.
  5: */

  7: #include <iostream>
  8: #include <iomanip>
  9: using namespace std;

 11: /**
 12: The kind of data in each node.
 13: */
 14: typedef int DataType;

 16: /**
 17: The structure of a node in a sequence of linked nodes.
 18: */
 19: struct Node
 20: {
 21:     DataType data;
 22:     Node* link;
 23: };

 25: /**
 26: An alias for a pointer to a node.
 27: */
 28: typedef Node* NodePointer;


 31: /*
 32: Part of the documentation of each of the following functions is a list
 33: of what functions are called by that function and/or what functions that
 34: function calls. Unless otherwise indicated, any function missing this
 35: documentation is called only by main and does not call any other functions.
 36: */


 39: void DescribeProgram();
 40: /**<
 41: Display a brief description of the program.
 42: @pre None.
 43: @post The program description has been displayed, and the output has
 44: paused for the user to press Enter to continue.
 45: */


 48: void InitializeSequence
 49: (
 50:     NodePointer& head //inout
 51: );
 52: /**<
 53: A utility function for initializing (or re-initializing) a sequence.
 54: Called by: BuildSequenceFixedSize and BuildSequenceAnySize
 55: @pre None.
 56: @post head has been set to 0.
 57: @param head A pointer to the first node of a sequence of linked nodes
 58: (after the function call).
 59: */


 62: void ReclaimStorage
 63: (
 64:     NodePointer& head //in
 65: );
 66: /**<
 67: A utility helper function for reclaiming the storage used by a sequence
 68: for the free store, once that sequence is no longer needed.
 69: Called by: BuildSequenceFixedSize and BuildSequenceAnySize
 70: @pre head has been initialized.
 71: @post All storage (if any) in the node sequence pointed to by head has
 72: been returned to the free store and head itself has the value 0.
 73: @param head A pointer to the first node of a sequence of linked nodes
 74: (and to 0 after the function call).
 75: */


 78: void BuildSequenceFixedSize
 79: (
 80:     NodePointer& head //inout
 81: );
 82: /**<
 83: Build a sequence of fixed size.
 84: @pre None.
 85: @post The user has entered the number of nodes to be in a newly
 86: constructed  sequence, as well as the values to be inserted into
 87: that sequence, the  sequence has been constructed, and head points
 88: at the first node. All storage in any sequence previously pointed to
 89: by head has been returned to the free store.
 90: @param head A pointer to the first node of a sequence of linked nodes.
 91: */


 94: void PrintNodeValues
 95: (
 96:     NodePointer head //inout
 97: );
 98: /**<
 99: Display the values in any sequence.
100: Calls: InitializeSequence and ReclainStorage
101: @pre head has been initialized.
102: @post If the sequence is empty, a message to that effect has been output.
103: Otherwise, all values in the sequence pointed to by head have been 
104: displayed, ten to a line, with each one in a field width of six spaces.
105: @param head A pointer to the first node of a sequence of linked nodes.
106: */


109: void FindNodeDataValue
110: (
111:     NodePointer   head,          //inout
112:     DataType      targetValue,   //in
113:     bool&         found,         //out
114:     NodePointer&  targetPointer, //out
115:     int&          targetPosition //out
116: );
117: /**<
118: A utility function called as a helper function by any function that needs
119: to find a node containing a given value.
120: Called by: FindDataValues and InsertAfterNodeWithDataValue
121: @pre head and targetValue have been initialized.
122: @post If targetValue is in the sequence, found is true and:
123: - targetPointer points to first node of sequence containing targetValue
124: - targetPosition contains number of the first node in the sequence that
125:   contains targetValue
126: Otherwise, found is false and both targetPointer and targetPosition
127: are undefined.
128: @param head A pointer to the first node of a sequence of linked nodes.
129: @param targetValue The value being sought.
130: @param found A boolean indicating whether targetValue has been found.
131: @param targetPointer A pointer to the first instance of targetValue.
132: @param targetPosition The number of the position of targetValue.
133: */


136: void FindDataValueAndPrevious
137: (
138:     NodePointer&  head,           //inout
139:     DataType      targetValue,    //in
140:     bool&         found,          //out
141:     NodePointer&  targetPointer,  //out
142:     NodePointer&  previousPointer //out
143: );
144: /**<
145: A utility function called as a helper function by any function that needs
146: to find a node containing a given value and the preceding node.
147: Called by: InsertBeforeNodeWithDataValue and DeleteNodeWithDataValue
148: @pre  head and targetValue have been initialized.
149: @post If targetValue is in the sequence, found is true and targetPointer
150: points at the first node of the sequence containing targetValue, with
151: previousPointer pointing at the previous node, unless targetPointer is
152: pointing at the first node, in which case the value of previousPointer
153: is 0. Otherwise, found is false and the values of both targetPointer
154: and previousPointer are undefined.
155: @param head A pointer to the first node of a sequence of linked nodes.
156: @param targetValue The value being sought.
157: @param found A boolean indicating whether targetValue has been found.
158: @param targetPointer A pointer to the first instance of targetValue.
159: @param previousPointer A pointer to the node before the first one
160: containing targetValue.
161: */


164: void FindDataValues
165: (
166:     NodePointer head //inout
167: );
168: /**<
169: Finds a particular node via the data value in it.
170: Calls: FindNodeDataValue
171: @pre head has been initialized.
172: @post The user has entered zero or more integer values and in each case
173: a message has been displayed, indicating either the first position in
174: the sequence where that value was located, or that the value was not
175: found in the current sequence.
176: @param head A pointer to the first node of a sequence of linked nodes.
177: */


180: void InsertAfterNodeWithDataValue
181: (
182:     NodePointer& head //inout
183: );
184: /**<
185: Finds a node (via the data value in it) and inserts a new node after
186: that node.
187: Calls: FindNodeDataValue
188: @pre head has been initialized.
189: @post The user has entered zero or more data value pairs, and in each
190: case the  second value in the pair has been inserted into the sequence
191: after the first occurrence of the first value in the sequence, or a
192: message has been displayed, indicating that the first value of the pair
193: was not found in the current sequence.
194: @param head A pointer to the first node of a sequence of linked nodes.
195: */


198: void InsertBeforeNodeWithDataValue
199: (
200:     NodePointer& head //inout
201: );
202: /**<
203: Finds a node (via the data value in it) and inserts a new node before
204: that node.
205: Calls: FindDataValueAndPrevious
206: @pre head has been initialized.
207: @post The user has entered zero or more data value pairs, and in each
208: case the second value in the pair has been inserted into the sequence
209: before the first occurrence of the first value in the sequence, or a
210: message has been displayed, indicating that the first value of the pair
211: was not found in the current sequence.
212: @param head A pointer to the first node of a sequence of linked nodes.
213: */


216: void DeleteNodeWithDataValue
217: (
218:     NodePointer& head //inout
219: );
220: /**<
221: Finds a node (via the data value in it) and then deletes that node.
222: Calls: FindDataValueAndPrevious
223: @pre head has been initialized.
224: @post The user has entered zero or more data values and in each case
225: the first node of the sequence containing that value has been deleted
226: from the sequence and its storage has been returned to the free store,
227: or a message has been displayed indicating that the value was not found
228: in the current sequence.
229: @param head A pointer to the first node of a sequence of linked nodes.
230: */


233: void ReverseAllDigits
234: (
235:     NodePointer& p //inout
236: );
237: /**<
238: Reverse all digits in a data value.
239: @pre p has been initialized.
240: @post The value in the node pointed to by p has had its digits reversed.
241: @param p A pointer to a node.
242: */


245: void ProcessAllNodes
246: (
247:     NodePointer& head,              //inout
248:     void (*Process)(NodePointer& p) //function
249: );
250: /**<
251: Processes all nodes by applying to the data in each node the function
252: which it takes in as an input function parameter.
253: @pre head and Process have been initialized.
254: @post The value in each node in the sequence pointed to by head
255: has been processed by the function pointed to by Process.
256: @param head A pointer to the first node of a sequence of linked nodes.
257: @param Process A function to be applied to the data in a node.
258: */