Опубликован: 10.12.2015 | Доступ: свободный | Студентов: 605 / 89 | Длительность: 07:10:00
Лекция 18:

Связанные списки структур

< Лекция 17 || Лекция 18 || Лекция 19 >

Связанные списки могут иметь одиночные или двойные связи. В списке с одиночными связями каждый элемент содержит ссылку на следующий элемент данных. В списке с двойными связями элементы содержат ссылки на предыдущий и последующий элементы. Элементы структур из связанного списка могут быть могут быть полями для сортировки.

Рассмотрим весьма распространенную в токсикологии задачу определения смертельной концентрации (СК50) и летальной дозы (СД50) в серии экспериментов.

Имеется массив структур, содержащий исходные данные для серии экспериментов (массив структур sample).

struct tox {
 double C[100];//Массив концентраций
 double Mortality[100];//Массив смертности
 double Control_Mortality;  //Величина смертности в контроле
 int n;       //Количество концентраций
 double mass; //Масса организма в мг
 double v;    //Объем наносимого препарата, мкл
 int Number;  //Количество особей
} sample[100];

С помощью математических расчетов находим смертельную концентрацию LC (СК50) и летальную дозу LD (СД50) для каждой серии экспериментов (массив структур pest) (остальные элементы структуры повторяют исходные данные и используются при составлении отчета).

Математические расчеты следующие.

Исходные данные: в каждой серии опытов имеется массив концентраций препарата C1,C2,…,Cn. Каждой концентрации соответствует определенная величина смертности Mortality1, Mortality2,… Mortalityn. Известна величина смертности в контроле Control_Mortality. Количество концентраций (величин смертности) в каждой серии опытов - n, средний вес особей в эксперименте - mass, объем наносимого инсектицида, в мкл - v, количество особей в опыте - Number.

Требуется найти: смертельну концентрацию, СК50 (LC) и смертельную дозу, СД50 (LD).

Алгоритм расчетов: LC =10(5-a)/b, a=(y∑x2-∑x∑xy)/(N∑x2-(∑x)2), b=(N∑xy-∑x∑y)/(N∑x2-(∑x)2), где y - значение из таблицы Блисса для заданной величины смертности, Ci после внесения поправки на смертность в контроле по Эбботу, Abbot[i]=(Ci- Control_Mortality)*100%/(100- Control_Mortality), x - LgCi. LD=1000*v*LC/mass.

struct card 
{
double LC;  //СК50
double LD;  //СД50
double Control_Mortality;   //Смертность в контроле
double mass;   //масса организма
double v;     //объем инсектицида
int Number;    //Количество особей

} pest[100];

Ключом для сортировки является поле LC (смертельная концентрация). Формируется связанный список массива структур. Для этого создается структура record, содержащая структуру с результатами вычислений и два указателя (с их помощью элементы списка будут в дальнейшем будут связываться с предыдущими и последующими членами списка).

struct record
{card toxin;  //Структура с данными о результатах вычислений
record *prior;//На предыдущий элемент списка
record *next; //На следующий элемент списка
};

Со структурой record связываются три переменные (указатели), они будут использоваться при размещении элементов в списке.

record *begin=NULL, //Указатель на начало списка
       *last =NULL, //Указатель на очередную запись
       *list;       //Указатель на элементы списка

Далее следует цикл обработки записей (элементов массива структур результатов вычислений) сортировка ведется по полю LC, элементы списка размещаются по возрастанию величины смертельной концентрации и выводся на экран.

Токсикологическая база данных

//==========================================================
// Name        : toxicology.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

#include<string.h>
#include<math.h>
//Эта программа рассчитывает токсикологические параметры
//Такие, как СК,50, СД, 50. Выдает структурированный список токсикологических параметров
//и сортирует этот список по СК,50 по возрастанию

//Таблица пробитов по Блиссу
static double Probit[101][10]={
{0,      1.9098, 2.1218, 2.2522, 2.3479, 2.4242, 2.4879, 2.5427, 2.5911, 2.6344},
{2.6737, 2.7096, 2.7429, 2.7738, 2.8027, 2.8299, 2.8556, 2.8799, 2.9031, 2.9251},
{2.9463, 2.9665, 2.9859, 3.0046, 3.0226, 3.0400, 3.0569, 3.0732, 3.0890, 3.1043},
{3.1192, 3.1337, 3.1478, 3.1616, 3.1750, 3.1881, 3.2009, 3.2134, 3.2256, 3.2376},
{3.2493, 3.2608, 3.2721, 3.2831, 3.2940, 3.3046, 3.3151, 3.3253, 3.3354, 3.3454},
{3.3551, 3.3648, 3.3742, 3.3836, 3.3928, 3.4018, 3.4107, 3.4195, 3.4282, 3.4368},
{3.4452, 3.4536, 3.4618, 3.4699, 3.4780, 3.4859, 3.4937, 3.5015, 3.5091, 3.5167},
{3.5242, 3.5316, 3.5389, 3.5462, 3.5534, 3.5605, 3.5675, 3.5745, 3.5813, 3.5882},
{3.5949, 3.6016, 3.6083, 3.6148, 3.6213, 3.6278, 3.6342, 3.6405, 3.6468, 3.6531},
{3.6592, 3.6654, 3.6715, 3.6775, 3.6835, 3.6894, 3.6953, 3.7012, 3.7070, 3.7127},
{3.7184, 3.7241, 3.7298, 3.7354, 3.7409, 3.7464, 3.7519, 3.7574, 3.7628, 3.7681},
{3.7735, 3.7788, 3.7840, 3.7893, 3.7945, 3.7996, 3.8048, 3.8099, 3.8150, 3.8200},
{3.8250, 3.8300, 3.8350, 3.8399, 3.8448, 3.8497, 3.8545, 3.8593, 3.8641, 3.8689},
{3.8736, 3.8783, 3.8830, 3.8877, 3.8923, 3.8969, 3.9015, 3.9061, 3.9107, 3.9152},
{3.9197, 3.9242, 3.9286, 3.9331, 3.9375, 3.9419, 3.9463, 3.9506, 3.9550, 3.9593},
{3.9636, 3.9678, 3.9721, 3.9763, 3.9806, 3.9848, 3.9890, 3.9931, 3.9973, 4.0014},
{4.0055, 4.0096, 4.0137, 4.0178, 4.0218, 4.0259, 4.0299, 4.0339, 4.0379, 4.0419},
{4.0458, 4.0498, 4.0537, 4.0576, 4.0615, 4.0654, 4.0693, 4.0731, 4.0770, 4.0808},
{4.0846, 4.0884, 4.0922, 4.0960, 4.0998, 4.1035, 4.1073, 4.1110, 4.1147, 4.1184},
{4.1221, 4.1258, 4.1295, 4.1331, 4.1367, 4.1404, 4.1440, 4.1476, 4.1512, 4.1548},
{4.1584, 4.1619, 4.1655, 4.1690, 4.1726, 4.1761, 4.1796, 4.1831, 4.1866, 4.1901},
{4.1936, 4.1970, 4.2005, 4.2039, 4.2074, 4.2108, 4.2142, 4.2176, 4.2210, 4.2244},
{4.2278, 4.2312, 4.2345, 4.2379, 4.2412, 4.2446, 4.2479, 4.2512, 4.2546, 4.2579},
{4.2612, 4.2644, 4.2677, 4.2710, 4.2743, 4.2775, 4.2808, 4.2840, 4.2872, 4.2905},
{4.2937, 4.2969, 4.3001, 4.3033, 4.3065, 4.3097, 4.3129, 4.3160, 4.3192, 4.3224},
{4.3255, 4.3287, 4.3318, 4.3349, 4.3380, 4.3412, 4.3443, 4.3474, 4.3505, 4.3536},
{4.3567, 4.3597, 4.3628, 4.3659, 4.3689, 4.3720, 4.3750, 4.3781, 4.3811, 4.3842},
{4.3872, 4.3902, 4.3932, 4.3962, 4.3992, 4.4022, 4.4052, 4.4082, 4.4112, 4.4142},
{4.4172, 4.4201, 4.4231, 4.4260, 4.4290, 4.4319, 4.4549, 4.4378, 4.4408, 4.4437},
{4.4466, 4.4495, 4.4524, 4.4554, 4.4583, 4.4612, 4.4641, 4.4670, 4.4698, 4.4727},
{4.4756, 4.4785, 4.4813, 4.4842, 4.4871, 4.4899, 4.4928, 4.4956, 4.4985, 4.5013},
{4.5041, 4.5070, 4.5098, 4.5126, 4.5155, 4.5183, 4.5211, 4.5239, 4.5267, 4.5295},
{4.5323, 4.5351, 4.5379, 4.5407, 4.5435, 4.5462, 4.5490, 4.5518, 4.5546, 4.5573},
{4.5601, 3.5628, 4.5656, 4.5684, 4.5711, 4.5739, 4.5766, 4.5793, 4.5821, 4.5848},
{4.5875, 4.5903, 4.5930, 4.5957, 4.5984, 4.6011, 4.6039, 4.6066, 4.6093, 4.6120},
{4.6147, 4.6174, 4.6201, 4.6228, 4.6255, 4.6281, 4.6308, 4.6335, 4.6362, 4.6389},
{4.6415, 4.6442, 4.6469, 4.6495, 4.6522, 4.6549, 4.6575, 4.6602, 4.6628, 4.6655},
{4.6681, 4.6708, 4.6734, 4.6761, 4.6787, 4.6814, 4.6840, 4.6866, 4.6893, 4.6919},
{4.6945, 4.6971, 4.6998, 4.7024, 4.7050, 4.7076, 4.7102, 4.7129, 4.7155, 4.7181},
{4.7207, 4.7233, 4.7259, 4.7285, 4.7311, 4.7337, 4.7363, 4.7389, 4.7415, 4.7441},
{4.7467, 4.7492, 4.7518, 4.7544, 4.7570, 4.7596, 4.7622, 4.7647, 4.7673, 4.7699},
{4.7725, 4.7750, 4.7776, 4.7802, 4.7827, 4.7853, 4.7879, 4.7904, 4.7930, 4.7955},
{4.7981, 4.8007, 4.8032, 4.8058, 4.8083, 4.8109, 4.8134, 4.8160, 4.8185, 4.8211},
{4.8236, 4.8262, 4.8287, 4.8313, 4.8338, 4.8363, 4.8389, 4.8414, 4.8440, 4.8465},
{4.8490, 4.8516, 4.8541, 4.8566, 4.8592, 4.8617, 4.8642, 4.8668, 4.8693, 4.8718},
{4.8743, 4.8769, 4.8794, 4.8819, 4.8844, 4.8870, 4.8895, 4.8920, 4.8945, 4.8970},
{4.8996, 4.9021, 4.9046, 4.9071, 4.9096, 4.9122, 4.9147, 4.9172, 4.9197, 4.9222},
{4.9247, 4.9272, 4.9298, 4.9323, 4.9348, 4.9373, 4.9398, 4.9423, 4.9448, 4.9473},
{4.9498, 4.9524, 4.9549, 4.9574, 4.9599, 4.9624, 4.9649, 4.9674, 4.9699, 4.9724},
{4.9749, 4.9774, 4.9799, 4.9825, 4.9850, 4.9875, 4.9900, 4.9925, 4.9950, 4.9975},
{5.0000, 5.0025, 5.0050, 5.0075, 5.0100, 5.9125, 5.0150, 5.0176, 5.0201, 5.0226},
{5.0251, 5.0276, 5.0301, 5.0326, 5.0351, 5.0376, 5.0401, 5.0426, 5.0451, 5.0476},
{5.0502, 5.0527, 5.0552, 5.0577, 5.0602, 5.0627, 5.0652, 5.0677, 5.0702, 5.0728},
{5.0753, 5.0778, 5.0803, 5.0828, 5.0853, 5.0877, 5.0904, 5.0929, 5.0954, 5.0979},
{5.1004, 5.1030, 5.1055, 5.1080, 5.1105, 5.1130, 5.1156, 5.1181, 5.1206, 5.1231},
{5.1257, 5.1282, 5.1307, 5.1332, 5.1358, 5.1383, 5.1408, 5.1434, 5.1459, 5.1484},
{5.1510, 5.1535, 5.1560, 5.1586, 5.1611, 5.1637, 5.1662, 5.1687, 5.1713, 5.1738},
{5.1764, 5.1789, 5.1815, 5.1840, 5.1886, 5.1891, 5.1917, 5.1942, 5.1968, 5.1993},
{5.2019, 5.2045, 5.2070, 5.2096, 5.2121, 5.2147, 5.2173, 5.2198, 5.2224, 5.2250},
{5.2275, 5.2301, 5.2327, 5.2353, 5.2378, 5.2404, 5.2430, 5.2456, 5.2482, 5.2508},
{5.2533, 5.2559, 5.2585, 5.2611, 5.2637, 5.2663, 5.2689, 5.2715, 5.2741, 5.2767},
{5.2793, 5.2819, 5.2845, 5.2871, 5.2890, 5.2924, 5.2950, 5.2976, 5.3002, 5.3020},
{5.3055, 5.3081, 5.3107, 5.3134, 5.3160, 5.3186, 5.3210, 5.3239, 5.3266, 5.3292},
{5.3319, 5.3345, 5.3372, 5.3398, 5.3425, 5.3451, 5.3478, 5.3505, 5.3531, 5.3558},
{5.3585, 5.3611, 5.3638, 5.3665, 5.3692, 5.3719, 5.3745, 5.3772, 5.3799, 5.3826},
{5.3853, 5.3880, 5.3907, 5.3934, 5.3961, 5.3989, 5.4016, 5.4043, 5.4070, 5.4097},
{5.4125, 5.4152, 5.4179, 5.4207, 5.4234, 5.4261, 5.4289, 5.4316, 5.4344, 5.4372},
{5.4399, 5.4427, 5.4454, 5.4482, 5.4510, 5.4538, 5.4565, 5.4593, 5.4621, 5.4649},
{5.4677, 5.4705, 5.4733, 5.4761, 5.4789, 5.4817, 5.4845, 5.4874, 5.4902, 5.4930},
{5.4959, 5.4987, 5.5015, 5.5044, 5.5072, 5.5101, 5.5129, 5.5158, 5.5187, 5.5215},
{5.5244, 5.5273, 5.5302, 5.5330, 5.5359, 5.5388, 5.5417, 5.5446, 5.5476, 5.5505},
{5.5534, 5.5563, 5.5592, 5.5622, 5.5651, 5.5681, 5.5719, 5.5740, 5.5769, 5.5799},
{5.5828, 5.5858, 5.5888, 5.5918, 5.5948, 5.5978, 5.6008, 5.6038, 5.6068, 5.6098},
{5.6128, 5.6158, 5.6189, 5.6219, 5.6250, 5.6280, 5.6311, 5.6341, 5.6372, 5.6403},
{5.6433, 5.6464, 5.6495, 5.6526, 5.6557, 5.6588, 5.6620, 5.6651, 5.6682, 5.6713},
{5.6745, 5.6776, 5.6808, 5.6840, 5.6871, 5.6903, 5.6935, 5.6967, 5.6999, 5.7031},
{5.7063, 5.7095, 5.7128, 5.7160, 5.7192, 5.7225, 5.7257, 5.7290, 5.7323, 5.7356},
{5.7388, 5.7421, 5.7454, 5.7488, 5.7521, 5.7554, 5.7588, 5.7621, 5.7655, 5.7688},
{5.7722, 5.7756, 5.7790, 5.7824, 5.7858, 5.7892, 5.7926, 5.7961, 5.7995, 5.8030},
{5.8064, 5.8099, 5.8134, 5.8169, 5.8204, 5.8239, 5.8274, 5.8310, 5.8345, 5.8381},
{5.8416, 5.8452, 5.8488, 5.8524, 5.8560, 5.8596, 5.8633, 5.8669, 5.8705, 5.8742},
{5.8779, 5.8816, 5.8853, 5.8890, 5.8927, 5.8965, 5.9002, 5.9040, 5.9078, 5.9116},
{5.9154, 5.9192, 5.9230, 5.9269, 5.9307, 5.9346, 5.9385, 5.9424, 5.9463, 5.9502},
{5.9542, 5.9581, 5.9621, 5.9661, 5.9701, 5.9741, 5.9782, 5.9822, 5.9863, 5.9904},
{5.9945, 5.9986, 6.0027, 6.0069, 6.0110, 6.0152, 6.0194, 6.0237, 6.0279, 6.0322},
{6.0364, 6.0407, 6.0450, 6.0494, 6.0537, 6.0581, 6.0625, 6.0669, 6.0714, 6.0758},
{6.0803, 6.0848, 6.0893, 6.0939, 6.0985, 6.1031, 6.1077, 6.1123, 6.1170, 6.1217},
{6.1264, 6.1311, 6.1359, 6.1407, 6.1455, 6.1503, 6.1552, 6.1601, 6.1650, 6.1700},
{6.1750, 6.1800, 6.1850, 6.1901, 6.1952, 6.2004, 6.2055, 6.2107, 6.2160, 6.2212},
{6.2265, 6.2319, 6.2372, 6.2426, 6.2481, 6.2536, 6.2591, 6.2646, 6.2702, 6.2759},
{6.2816, 6.2873, 6.2930, 6.2988, 6.3047, 6.3106, 6.3165, 6.3225, 6.3285, 6.3346},
{6.3408, 6.3469, 6.3532, 6.3595, 6.3658, 6.3722, 6.3787, 6.3852, 6.3917, 6.3984},
{6.4051, 6.4118, 6.4187, 6.4255, 6.4325, 6.4395, 6.4466, 6.4538, 6.4611, 6.4684},
{6.4758, 6.4833, 6.4909, 6.4985, 6.5063, 6.5141, 6.5220, 6.5301, 6.5382, 6.5464},
{6.5548, 6.5632, 6.5718, 6.5805, 6.5893, 6.5982, 6.6072, 6.6164, 6.6258, 6.6352},
{6.6449, 6.6546, 6.6646, 6.6747, 6.6849, 6.6954, 6.7060, 6.7169, 6.7279, 6.7392},
{6.7507, 6.7624, 6.7744, 6.7866, 6.7991, 6.8119, 6.8250, 6.8384, 6.8522, 6.8663},
{6.8808, 6.8957, 6.9110, 6.9268, 6.9431, 6.9600, 6.9774, 6.9954, 7.0141, 7.0335},
{7.0537, 7.0558, 7.0579, 7.0600, 7.0621, 7.0642, 7.0663, 7.0684, 7.0706, 7.0727},
{7.3263, 7.3301, 7.3339, 7.3378, 7.3416, 7.3455, 7.3495, 7.3535, 7.3575, 7.3615},
{8.0902, 8.1214, 8.1559, 8.1947, 8.2389, 8.2905, 8.3528, 8.4316, 8.5401, 8.7190}
};

double tox_LC(int n, int Number, double Control_Mortality, double Mortality[], double C[])
{
	double LgC[100];             //Массив десятичных логарифмов концентраций
	double Sum_LgC=0;	         //Сумма десятичных логарифмов концентраций
	double Sqr_LgC=0;            //Сумма квадратов десятичных логарифмов

	for(int i=0;i<n;i++)
	{
	LgC[i]=log10(C[i]);//Десятичный логарифм концентрации
Sum_LgC+=LgC[i];//Сумма десятичных логарифмов концентраций
		Sqr_LgC+=pow(LgC[i], 2);//Сумма квадратов десятичных логарифмов
	}
	double LgC_Sqr=pow(Sqr_LgC, 2); //Квадрат суммы десятичных логарифмов концентраций

double Abbot[100];//Величина смертности с поправкой на Аббота
double y[100];    //Пробит
int k,m;          //k-целая часть смертности, m-десятичная часть смертности
double Sigma_y;   //Сумма пробитов

for(int i=0;i<n;i++)
{
//Смертность с поправкой на Эббота:
Abbot[i]=((Mortality[i]-Control_Mortality)/(100-Control_Mortality))*100;
k=floor(Abbot[i]);         //Возвращает наибольшее целое, не превышающее Abbot[i]
m=floor((Abbot[i]-k)*10)+1;//Возвращает наибольшее целое, не превышающее (Abbot[i]-k)*10+1
y[i]=Probit[k][m];
Sigma_y+=y[i];
}

double Sigma_xy=0; //Сумма произведений десятичных логарифмов концентраций на пробиты
for(int i=0;i<n;i++)
{
Sigma_xy+=y[i]*LgC[i];
}
double a=(Sigma_y*Sqr_LgC-Sum_LgC*Sigma_xy)/(Number*Sqr_LgC-LgC_Sqr);
double b=(Number*Sigma_xy-Sum_LgC*Sigma_y) /(Number*Sqr_LgC-LgC_Sqr);
double LC_50=pow(10, (5-a)/b); //СК50
return LC_50;
}

double tox_LD(double v, double mass, double LC_50)
{
double LD_50=(LC_50*1000*v)/mass;
return LD_50;
}

//Определение структурного типа токсикологических параметров
struct card {double LC; //СК50
	         double LD;  //СД50
	 double Control_Mortality;   //Смертность в контроле
			 double mass;   //масса особи
		 double v;     //объем наносимого инсектицида
			int Number;    //Количество особей
};

	//Функция печати списка токсикологических параметров
	void printtoxin(card& car)
	{
	static int count = 0;
	cout<<"\n"<<++count<<"\nLC50 = "<<car.LC<<" percents";
	cout<<"\nLD50 = "<<car.LD<<" mkg/g";
	cout<<"\nMortality in control = "<<car.Control_Mortality<<" percents";
	cout<<"\nInsecticide's volume = "<<car.v<<" mkl";
	cout<<"\nsample's weight = "<<car.mass<<" mg";
	cout<<"\nNumber of samples  = "<<car.Number<<" pices";
	}

//Структурный тип для элемента списка
	struct record
				{card toxin;     //Структура с данными о результатах вычислений
                 record *prior; //На предыдущий элемент списка
				 record *next;  //На следующий элемент списка
				};

	struct tox{double C[100];//Массив концентраций
	           double Mortality[100];//Массив смертности
				   double Control_Mortality;  //Величина смертности в контроле
				   int n;       //Количество концентраций
				   double mass; //Масса организма в мг
				   double v;    //Объем наносимого препарата, мкл
				   int Number;  //Количество особей
	} sample[100];

int main() {

	int m;//Количество экспериментов
	cout<<"\nInput number of tests, please"<<endl;
	cin>>m;

	int i,j;

	for(int i=0;i<m;i++)
	{
	cout<<"\nInput number of concentrations in ["<<i+1<<"] test ";
	cin>>sample[i].n;
	}


	for(int i=0;i<m;i++)
	{
		for(j=0;j<sample[i].n;j++)
		{
		cout<<"\nInput ["<<i+1<<"]["<<j+1<<"] Concentration ";
		cin>>sample[i].C[j];
		cout<<"\nInput ["<<i+1<<"]["<<j+1<<"] Mortality ";
		cin>>sample[i].Mortality[j];
		}

	cout<<"\nInput ["<<i+1<<"] Mortality in control ";
	cin>>sample[i].Control_Mortality;

	cout<<"\nInput ["<<i+1<<"] pest's weight ";
	cin>>sample[i].mass;

	cout<<"\nInput ["<<i+1<<"] insecticide volume ";
	cin>>sample[i].v;

	cout<<"\nInput ["<<i+1<<"] pest's number ";
	cin>>sample[i].Number;
	}

	double Lethal_Concentration[100];
	double Lethal_Dose[100];

	for(int i=0;i<m;i++)
	{
	Lethal_Concentration[i]=tox_LC(sample[i].n, sample[i].Number, sample[i].Control_Mortality, sample[i].Mortality, sample[i].C);
	cout<<"\nLethal concentration in ["<<i+1<<"] test is "<<Lethal_Concentration[i];
	Lethal_Dose[i]=tox_LD(sample[i].v, sample[i].mass, Lethal_Concentration[i]);
	cout<<"\nLethal dose in ["<<i+1<<"] test is "<<Lethal_Dose[i];
	}
	cout<<"\n"<<endl;

	struct card    //Определение структурного типа токсикологических параметров
	{
	double LC;  //Ск50
	double LD;  //СД50
	double Control_Mortality;   //Смертность в контроле
	double mass;   //масса организма
	double v;     //объем инсектицида
	int Number;    //Количество особей

	} pest[100];


	for(i=0;i<m;i++)
	{
	pest[i].LC=Lethal_Concentration[i];
	pest[i].LD=Lethal_Dose[i];
	pest[i].Control_Mortality=sample[i].Control_Mortality;
	pest[i].mass=sample[i].mass;
	pest[i].v=sample[i].v;
	pest[i].Number=sample[i].Number;
	}

	record *begin=NULL, //Указатель на начало списка
	       *last =NULL, //Указатель на очередную запись
	       *list;       //Указатель на элементы списка

	//Цикл обработки исходных записей о результатах вычислений:
	for(i=0;i<m;i++)
	{//Создать новую запись (элемент списка):
	last=new(record);
	//Занести сведения о результатах вычислений в новую запись:
	(*last).toxin.LC=pest[i].LC;
	(*last).toxin.LD =pest[i].LD;
	last->toxin.Control_Mortality=pest[i].Control_Mortality;
	last->toxin.mass=pest[i].mass;
	last->toxin.v=pest[i].v;
	last->toxin.Number=pest[i].Number;
	//Включить запись в список (установить связи):
	if (begin==NULL) //Списка еще нет
		{
			last->prior=NULL;
			begin=last;
			last->next=NULL;
		}

	else
		{//Список уже существует
		list=begin;
		//Цикл просмотра списка - поиск места для новой записи:
	while(list)
		{if (last->toxin.LC < list->toxin.LC)

			{//Вставить новую запись перед list:
						if (begin==list)
						{//Начало списка:
							last->prior=NULL;
							begin=last;
						}
						else
						{//Вставка между записями:
							list->prior->next=last;
							last->next=list->prior;
						}
					list->prior=last;
					last->next=list;
					//Выйти из цикла просмотра списка:
					break;
		}
	if (list->next==NULL)
		{//Включить запись в конец списка:
		last->next=NULL;
		last->prior=list;
		list->next=last;
		//Выйти из цикла просмотра списка;
		break;
		}
	//Перейти к следующему элементу списка:
	list=list->next;
	}//Конец цикла просмотра списка (поиск места для новой записи)
	}//Включение записи выполнено
	}//Конец цикла обработки исходных данных
	//Печать в алфавитном порядке списка токсикологических параметров:
	list=begin;
	cout<<'\n';
	while(list)
	{
	printtoxin(list->toxin);
	list=list->next;
	}

	cout<<"\n"<<endl;

	return 0;
}

Результат:

Input number of tests, please 3
Input nubmer of concentrations in [1] test 6
Input nubmer of concentrations in [2] test 6
Input nubmer of concentrations in [3] test 6
Input [1][1] Concentration 0.001
Input [1][1] Mortality 99
Input [1][2] Concentration 0.0001
Input [1][2] Mortality 96.66
Input [1][3] Concentration 0.00005
Input [1][3] Mortality 73.43
Input [1][4] Concentration 0.00001
Input [1][4] Mortality 16.66
Input [1][5] Concentration 0.000005
Input [1][5] Mortality 2.94
Input [1][6] Concentration 0.000001
Input [1][6] Mortality 6.25
Input [1] Mortality in Control 5.88
Input [1] Pest's weight 14
Input [1] insecticide volume 1
Input [1] pest's number 240
Input [2][1] Concentration 0.001
Input [2][1] Mortality 93.33
Input [2][2] Concentration 0.0001
Input [2][2] Mortality 50
Input [2][3] Concentration 0.00005
Input [2][3] Mortality 17.647
Input [2][4] Concentration 0.00001
Input [2][4] Mortality 5.263
Input [2][5] Concentration 0.000005
Input [2][5] Mortality 5.55
Input [2][6] Concentration 0.000001
Input [2][6] Mortality 5.55
Input [2] Mortality in Control 3
Input [2] Pest's weight 14
Input [2] insecticide volume 1
Input [2] pest's number 240
Input [3][1] Concentration 0.00005
Input [3][1] Mortality 99
Input [3][2] Concentration 0.00001
Input [3][2] Mortality 64.49
Input [3][3] Concentration 0.0000075
Input [3][3] Mortality 57.142
Input [3][4] Concentration 0.000005
Input [3][4] Mortality 36.338
Input [3][5] Concentration 0.0000025
Input [3][5] Mortality 57.08
Input [3][6] Concentration 0.000001
Input [3][6] Mortality 7.62
Input [3] Mortality in Control 9.909
Input [3] Pest's weight 8
Input [3] insecticide volume 1
Input [3] pest's number 240

1
LC50 = 5.31389e-006 percents
LD50 = 0.000664237 mkg/g
Mortality in control = 9.909 percents
Insecticide's volume = 1 mkl
Sample's weight = 8 mg
Number of samples = 240 pices
2
LC50 = 1.57043e-005 percents
LD50 = 0.001121174 mkg/g
Mortality in control = 5.88 percents
Insecticide's volume = 1 mkl
Sample's weight = 14 mg
Number of samples = 240 pices
3
LC50 = 1.57043e-005 percents
LD50 = 0.001121174 mkg/g
Mortality in control = 3 percents
Insecticide's volume = 1 mkl
Sample's weight = 14 mg
Number of samples = 240 pices

Более подробную информацию о работе со связанными списками можно найти в следующих книгах:

  1. Подбельский Программирование на языке С++
  2. Шилдт. Г. Теории и практика С++. BHV. Санкт-Петербург. 1999. 416 с.
  3. Паапас К., Мюррей У. Полное руководство по Visual C++.

Вложенные структуры

Элементами структур могут быть другие структуры. Предположим, имеется структура publishing, она в свою очередь, может быть элементом структуры book. Для доступа к отдельному элементу структуры можно воспользоваться следующим оператором: foliant.record.publish.

//==========================================================
// Name        : struct_card1.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;
#define n 50

struct publishing{char publish[n];
		     char city[n];
};

struct book{char author[n];
		char titel[n];
		int year;
		struct publishing record;
};

int main() {
	struct book foliant;
	void print(struct book any_book);

	cout<<"\nInput book author ";
	cin>>foliant.author;

	cout<<"\nInput book titel  ";
	cin>>foliant.titel;

	cout<<"\nInput issue year ";
	cin>>foliant.year;

	cout<<"\nInput city ";
	cin>>foliant.record.city;

	cout<<"\nInput publishing ";
	cin>>foliant.record.publish;

	print(foliant);
	return 0;
}

void print(struct book any_book)
{
	cout<<"\nBook's autor is  "<<any_book.author;
	cout<<"\nBook's titel is  "<<any_book.titel;
	cout<<"\nIssue year "<<any_book.year;
	cout<<"\nIssue city "<<any_book.record.city;
	cout<<"\nPrinted in "<<any_book.record.publish<<" Publishing"<<endl;
}

Результат:

Input book Author Brem
Input book titel Zology
Input issue year 1887
Input city Moscow
Input publising Prosvechenie

Book's author is Brem
Book's titel is Zoology
Issue year 1887
Issue city Moscow
Printed in Prosvechenie Publishing
< Лекция 17 || Лекция 18 || Лекция 19 >
Зося Ковалева
Зося Ковалева

Хочу получить удостоверение. Сколько стоит оплата?