![]() |
Не работает правильно программа
//программа создания однонапрвленного целого списка
#include<stdio.h> #include<locale.h> struct tsp{ //1 Объявляем тип int num; tsp*next; }; tsp *Q,*P,*T;//2 Объявляем один или несколько указателей на данную структуру // Р-адрес начала списка // Q - переменная для обработки списка,а именно перемещению по нему // Т - переменная для вставки и удаления элементов из списка int main() { setlocale(LC_ALL,"rus"); //Непосредственное создание списка T=new tsp;//Создаем фиктивный элемент,зарезервировали память для фиктивного элемента списка и его адрес поместили в Т T->num=0;//Определили информациоонную часть для фиктивного элемента, этого можно не делать, так в просмотре он не участвует P=T;//В переменной Р - адрес начала списка int n,k;// n - количество реальных элементов списка, без уёта фиктивного printf("Введите количество элементов списка\n"); scanf("%d",&n); for( int i=1;i<=n;i++)//цикл добавления реальных элементов в список { Q=new tsp;//Резервируем память для нового элемента списка и его адрес помещяем в Q printf("Введите элемент списка\n"); scanf("%d",&Q->num);//Определяем информационную часть нвого элемента T->next=Q;//Соединяем его с предыдущим элементом:адрес нового подготовленного элемента,который находится в Q,помещаем в адресное поле структуры,адрес которой в T->next T=Q;//Чтобы повторить предыдущий шаг,адрес только что созданного элемента и присоедеинного к списку элемента (Q) помещаем в T //После этого присвоения этот элемент Q,а точнее T, будет играть роль предшествующего элемента,а новый элемент Q создадим } Q->next=NULL;//Последний элемент должен содержать адрес NULL,это означает,что после него в цепочке не больше элементов списка. //Начинаем просмотр списка Q=P->next;//В начале списка есть фиктивный элемент,так как он при просмотре не должен участвовать,то переходим на второй элемент списка,то есть на первый реальный. //Напоминание!В переменной P находится адрес начала списка for(int i=1;i<=n;i++) { printf("%d\n",Q->num); Q=Q->next;//Переход на следующий элемент } //Нахождение максимального элемента в списке Q=P;//Переставляем нашу переменую хождения по списку в голову списка int max = Q->num; for(int i=1;i<=n;i++) { if (Q->num > max) max = Q->num; Q = Q->next; } printf("Максимальный элемент равен = %d\n",max); Q=P; //Ищем номер первого максимального Q=P;//Переставляем нашу переменую хождения по списку в голову списка for(int i=1;i<=n;i++) { if (Q->num == max) {k=i;i=n;} else Q = Q->next; } printf("Номер первого максимального = %d\n",k-1); Q=P; for(int i=1;i<=n;i++) { if(Q->next->num==max && i!=k) { T=Q->next; Q->next=Q->next->next; T->next=NULL; delete T; } else Q=Q->next; } printf("Новый список\n"); Q=P->next; while(Q) { printf("%d\n",Q->num); Q=Q->next;//Переход на следующий элемент } return 0; } Почему программа удаляет все максимальные элементы, не оставляю первого? |
Вторая Ваша тема подряд с одной проблемой и без ответов, куда подевались пользователи MS Studio?
Не вникаю, просто мысли вслух..... И в первой и во второй теме идет речь о создание массива (0-11, в первой теме и интерактивное предложение ввести количество элементов в списке, сейчас). Что дальше? В одном массиве, не может быть "много" максимальных элементов, ибо выполнил цикл по созданию заданного массива и все ... далее или выход, или начинай формировать новый массив. Посмотрите алгоритм поиска максимального элемента в массиве - http://liveflowcharts.ru/sites/defau...Max/chart.html |
Цитата:
|
Цитата:
а при удалении if(Q->next->num==max && i!=k) k нужно увеличить на единицу в условии |
Время: 13:35. |
Время: 13:35.
© OSzone.net 2001-