Чтение онлайн

ЖАНРЫ

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

141: };

142:

143: PartsList PartsList::GlobalPartsList;

144:

145:

146: PartsList::PartsList:

147: pHead(0),

148: itsCount(0)

149: { }

150:

151: PartsList::~PartsList

152: {

153: delete pHead;

154: }

155:

156: Part* PartsList::GetFirst const

157: {

158: if (pHead)

159: return pHead->GetPart;

160: else

161: return NULL; // ловушка

ошибок

162: }

163:

164: Part * PartsList::operator[](int offSet) const

165: {

166: PartNode* pNode = pHead;

167:

168: if (!pHead)

169: return NULL; // ловушка ошибок

170:

171: if (offSet > itsCount)

172: return NULL; // ошибка

173:

174: for (int i=0;i<offSet; i++)

175: pNode = pNode->GetNext;

176:

177: return pNode->GetPart;

178: }

179:

180: Part* PartsList::Find(

181: int & position,

182: int PartNumber) const

183: {

184: PartNode * pNode = 0;

185: for (pNode = pHead, position = 0;

186: pNode!=NULL;

187: pNode = pNode->GetNext, position++)

188: {

189: if (pNode->GetPart->GetPartNumber == PartNumber)

190: break;

191: }

192: if (pNode == NULL)

193: return NULL;

194: else

195: return pNode->GetPart;

196: }

197:

198: void PartsList::Iterate(void (Part::*func)const) const

199: {

200: if (!pHead)

201: return;

202: PartNode* pNode = pHead;

203: do

204: (pNode->GetPart->*func);

205: while (pNode = pNode->GetNext);

206: }

207:

208: void PartsList::Insert(Part* pPart)

209: {

210: PartNode * pNode = new PartNode(pPart);

211: PartNode * pCurrent = pHead;

212: PartNode * pNext = 0;

213:

214: int New = pPart->GetPartNumber;

215: int Next = 0;

216: itsCount++;

217:

218: if (!pHead)

219: {

220: pHead = pNode;

221: return;

222: }

223:

224: // если это значение меньше головного узла,

225: // то текущий узел становится головным

226: if (pHead->GetPart->GetPartNumber->New)

227: {

228: pNode->SetNext(pHead);

229: pHead = pNode;

230: return;

231: }

232:

233: for (;;)

234: {

235: // еcли нет следующего, вставляется текущий

236: if (!pCurrent->GetNext)

237: {

238: pCurrent->SetNext(pNode);

239: return;

240: }

241:

242: //

если текущий больше предыдущего, но меньше следующего, то вставляем

243: // здесь, Иначе присваиваем значение указателя Next

244: pNext = pCurrent->GetNext;

245: Next = pNext->GetPart->GetPartNumber;

246: if (Next > New)

247: {

248: pCurrent->SetNext(pNode);

249: pNode->SetNext(pNext);

250: return;

251: }

252: pCurrent = pNext;

253: }

254: }

255:

256:

257:

258: class PartsCatalog : private PartsList

259: {

260: public:

261: void Insert(Part *);

262: int Exists(int PartNumber);

263: Part * Get(int PartNumber);

264: operator+(const PartsCatalog &);

265: void ShowAll { Iterate(Part::Display); }

266: private:

267: };

268:

269: void PartsCatalog::Insert(Part * newPart)

270: {

271: int partNumber = newPart->GetPartNumber;

272: int offset;

273:

274: if (!Find(offset, partNumber))

275: PartsList::Insert(newPart);

276: else

277: {

278: cout << partNumber << " was the ";

279: switch (offset)

280: {

281: case 0: cout << "first "; break;

282: case 1: cout << "second "; break;

283: case 2: cout << "third "; break;

284: default: cout << offset+1 << "th ";

285: }

286: cout << "entry. Rejected!\n";

287: }

288: }

289:

290: int PartsCatalog::Exists(int PartNumber)

291: {

292: int offset;

293: Find(offset,PartNumber);

294: return offset;

295: }

296:

297: Part * PartsCatalog::Get(int PartNumber)

298: {

299: int offset;

300: return (Find(offset, PartNumber));

301:

302: }

303:

304: int main

305: {

306: PartsCatalog pc;

307: Part * pPart = 0;

308: int PartNumber;

309: int value;

310: int choice;

311:

312: while (1)

313: {

314: cout << "(0)Quit (1)Car (2)Plane: ";

315: cin >> choice;

316:

317: if (!choice)

318: break;

319:

320: cout << "New PartNumber?: ";

321: cin >> PartNumber;

322:

323: if (choice == 1)

324: {

325: cout << "Model Year?: ";

Поделиться с друзьями: