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;
}
Почему программа удаляет все максимальные элементы, не оставляю первого?
#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;
}
Почему программа удаляет все максимальные элементы, не оставляю первого?