Войти

Показать полную графическую версию : Не работает правильно программа


artyomartemyev96
05-03-2015, 00:32
//программа создания однонапрвленного целого списка
#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;
}


Почему программа удаляет все максимальные элементы, не оставляю первого?

opel431
05-03-2015, 00:55
Вторая Ваша тема подряд с одной проблемой и без ответов, куда подевались пользователи MS Studio?
Не вникаю, просто мысли вслух..... И в первой и во второй теме идет речь о создание массива (0-11, в первой теме и интерактивное предложение ввести количество элементов в списке, сейчас). Что дальше? В одном массиве, не может быть "много" максимальных элементов, ибо выполнил цикл по созданию заданного массива и все ... далее или выход, или начинай формировать новый массив.

Посмотрите алгоритм поиска максимального элемента в массиве - http://liveflowcharts.ru/sites/default/files/f/charts/ArrayMax/chart.html

artyomartemyev96
05-03-2015, 07:42
Посмотрите алгоритм поиска максимального элемента в массиве »
Я прекрасно знаю алгоритм нахождения максимального элемента в массиве.Проблема в том,что при поиске повторных максимальных, программа игнорирует дополнительное условие i!=k.

mrcnn
05-03-2015, 10:32
Почему программа удаляет все максимальные элементы, не оставляю первого?

Потому что при поиске максимального if (Q->num == max)
а при удалении if(Q->next->num==max && i!=k)

k нужно увеличить на единицу в условии




© OSzone.net 2001-2012