Поиск максимального элемента в односвязном циклическом списке - C (СИ)
Формулировка задачи:
Нужно найти max элемент этого динамического списка... помогите пожалуйста
// list.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
struct Point
{
int value; //Значение элемента
Point *next;//указатель на следующий элемент
};
Point *start, *current;//Начало списка и текущий элемент
int Length() //Чтобы проверять выход за пределы
{
Point *tmp = start; //указатель на начало списка
int res = 0; //количество элементов пока 0
while (tmp!=NULL) //Пока не конец списка
{
res++; //увеличиваем количетво элементов
tmp = tmp->next;//переходим к следующему элементу
}
return res; //возвращаем количество элементов
} //Узнаем длинну списка(количество элементов)
void CreateList(int Value)
{
if (start!=NULL) //Если список уже создан - выводим сообщение
{
printf("Список уже был создан!!!");
return;
}
current =(Point*)malloc(sizeof(Point)); //Создаем новый элемент
current->value = Value; //Записываем в него значение
current->next = NULL; //следующий элемент пустой,его пока не сущевствует
start = current; //И начальному элементу задаем значение текущего
printf("Список создан.");
} //Создаем список
void DeleteList()
{
if (start==NULL) //Если список не создан выводим сообщение
{
printf("Список не создан!!!");
return;
}
Point *delPoint; //Переменная для хранения удаляемого элемента
while (start->next!=NULL) //Пока список не закончен
{
delPoint = start;
start = start->next;//Переходим к следующему элементу
free (delPoint); //Удаляем все элементы из кучи
}
start = NULL; //И присваеваем стартовому и текущему элементу значение пустого списка
current = NULL;
printf("Список удален.");
} //Удаление списка
void AddElement(int Value)
{
if (start==NULL)//Если список не создан выводим сообщение
{
printf("Список не создан!!!");
return;
}
Point *tmp =(Point*)malloc(sizeof(Point)); //Создаем новый элемент
tmp->value = Value; //Записываем в него значение
tmp->next = NULL; //следующий пока нуль не создан
current->next = tmp; //Последним элементом списка указываем на новый
current = current->next;//новый элемент делаем текущим
printf("Элемент добавлен.");
}
void InsertElement(int Position, int Value)//Вствка элемента
{
if (start==NULL) //Если список не создан выводим сообщение
{
printf("Список не создан!!!");
return;
}
if (Position>Length() || Position<1) //проверяем позицию на корректность
{
printf("Неправильный ввод!!!");//Сообщаем об ошибке
return;
}
int currentNumber = 1;//номер текущего элемента
Point *tmp;
if(Position==1) //Если нужно вставить перед первым элементом
{
tmp = (Point*)malloc(sizeof(Point)); //Выделяем память
tmp->value = Value;//Зписываем туда значение
tmp->next = start;//Указываем на начальный элемент
start = tmp; //И говорим что теперь tmp будет началом
printf("Элемент вставлен.");
return;
}
tmp = start;
while(currentNumber<Position-1)//Пока не дойдем до нужного элемента.Нужно найти предшествующий элемент чтобы использовать следующий
{
currentNumber++;
tmp = tmp->next; //Перебираем список
}
Point *newElement =(Point*)malloc(sizeof(newElement));
newElement->value = Value; //Записываем туда значение
newElement->next = tmp->next;//Указываем на место в которое указывает элемент после котороко осуществиться вставка
tmp->next = newElement; //указываем на новый элемент
printf("Элемент вставлен.");
return;
}
void DeleteElement(int Number)
{
if (start==NULL) //Если список не создан выводим сообщение
{
printf("Список не создан!!!");
return;
}
if (Length()<Number || Number<1) //Если удаляемый элемент больше длинны списка или он отрицательный
{
printf("Неправильный ввод!!!");//Сообщаем об ошибке
return;
}
Point *delPoint; //Переменная для хранения удаляемого элемента
if (Number==1) //Если удаляем первый элемент
{
delPoint = start;
start = start->next;//Но элемент указывающий на начало сдвигаем на 1 позицию
free (delPoint); //Удаляем элемент из памяти (кучи)
printf("Элемент удален.");
return;
}
Point *tmp = start; //Создаем новый элемент и присваеваем ему значение начала списка
int currentNumber = 2;//потому что первый мы тут не удалим
while (currentNumber!=Number) //Пока не дойдем до нужного номера
{
currentNumber++; //увеличиваем счетчик
tmp = tmp->next;//Перебираем элементы списка
}
delPoint = tmp->next;
tmp->next = (tmp->next)->next;//Сдвигаем значение на 2 элемента (удаляется из списка 1-й элемент)
free (delPoint); //Удаляем элемент из памяти
tmp = start;
while (tmp->next!=NULL)//Перебираем все элементы пока не дойдем до конца списка
tmp = tmp->next;
current = tmp; //Текущему элементу присваиваем значение последнего
printf("Элемент удален.");
}
void PrintList()
{
if (start==NULL)//Если список не создан выводим сообщение
{
printf("Список не создан!!!");
return;
}
Point *tmp = start;
while (tmp!=NULL)//Пока не дойдем до конца списка
{
printf("%i ", tmp->value);//Печатаем все элементы
tmp = tmp->next;
}
}
int main()
{
setlocale(LC_ALL, "RUSSIAN");
int choice = 0;
int a=0;
while(choice!=8)
{
int tmpValue, tmpValue2;
system("cls");
printf("1 - Создать список\n2 - Удалить список\n3 - Добавить елемент\n4 - Вставить элемент\n5 - Удалить елемент\n6 - Показать список\n7 - Найти max 'ktvtynn8 - Выход\n");
printf("Указатель стоит на %i позиции",(Length()-(Length()-a)));
printf("\nСписок содержит в данный момент %i элементов",Length());
while(!fflush(stdin)&&printf("\nВведите команду: ")&&!scanf("%i",&choice));
system("cls");
switch (choice)
{
case 1:
while(!fflush(stdin)&&printf("Введите значение первого элемента: ")&&!scanf("%i",&tmpValue));
CreateList(tmpValue);
a=1;
getch();
break;
case 2:
DeleteList();
a=0;
getch();
break;
case 3:
while(!fflush(stdin)&&printf("Введите значение элемента: ")&&!scanf("%i",&tmpValue));
AddElement(tmpValue);
a=Length();
getch();
break;
case 4:
while(!fflush(stdin)&&printf("Введите номер элемента: ")&&!scanf("%i",&tmpValue));
while(!fflush(stdin)&&printf("Введите значение элемента: ")&&!scanf("%i",&tmpValue2));
InsertElement(tmpValue, tmpValue2);
if(tmpValue<Length())
{
a=(Length()-(Length()-tmpValue));
}
getch();
break;
case 5:
while(!fflush(stdin)&&printf("Введите номер элемента: ")&&!scanf("%i",&tmpValue));
DeleteElement(tmpValue);
if(tmpValue<Length())
{
a=tmpValue;
}
getch();
break;
case 6:
PrintList();
getch();
break;
case 7:
while(!fflush(stdin)&&printf("Введите номер элемента: ")&&!scanf("%i",&tmpValue));
while(!fflush(stdin)&&printf("Введите количество элементов: ")&&!scanf("%i",&tmpValue2));
SummElement(tmpValue, tmpValue2);
if(tmpValue<Length() && tmpValue+(tmpValue2-1)< Length())
{
a=tmpValue+(tmpValue2-1);
}
getch();
break;
}
}
return 0;
}Решение задачи: «Поиск максимального элемента в односвязном циклическом списке»
textual
Листинг программы
// list.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
struct Point
{
int value; //Значение элемента
Point *next;//указатель на следующий элемент
};
Point *start = NULL, *current;//Начало списка и текущий элемент
int MaxElem (){
int max;
Point *tmp = start;
max = tmp -> value;
while (tmp != NULL){
if (tmp -> value > max)
max = tmp -> value;
tmp = tmp -> next;
}
return max;
}
int Length() //Чтобы проверять выход за пределы
{
Point *tmp = start; //указатель на начало списка
int res = 0; //количество элементов пока 0
while (tmp!=NULL) //Пока не конец списка
{
res++; //увеличиваем количетво элементов
tmp = tmp->next;//переходим к следующему элементу
}
return res; //возвращаем количество элементов
} //Узнаем длинну списка(количество элементов)
void CreateList(int Value)
{
if (start!=NULL) //Если список уже создан - выводим сообщение
{
printf("Список уже был создан!!!");
return;
}
current =(Point*)malloc(sizeof(Point)); //Создаем новый элемент
current->value = Value; //Записываем в него значение
current->next = NULL; //следующий элемент пустой,его пока не сущевствует
start = current; //И начальному элементу задаем значение текущего
printf("Список создан.");
} //Создаем список
void DeleteList()
{
if (start==NULL) //Если список не создан выводим сообщение
{
printf("Список не создан!!!");
return;
}
Point *delPoint; //Переменная для хранения удаляемого элемента
while (start->next!=NULL) //Пока список не закончен
{
delPoint = start;
start = start->next;//Переходим к следующему элементу
free (delPoint); //Удаляем все элементы из кучи
}
start = NULL; //И присваеваем стартовому и текущему элементу значение пустого списка
current = NULL;
printf("Список удален.");
} //Удаление списка
void AddElement(int Value)
{
if (start==NULL)//Если список не создан выводим сообщение
{
printf("Список не создан!!!");
return;
}
Point *tmp =(Point*)malloc(sizeof(Point)); //Создаем новый элемент
tmp->value = Value; //Записываем в него значение
tmp->next = NULL; //следующий пока нуль не создан
current->next = tmp; //Последним элементом списка указываем на новый
current = current->next;//новый элемент делаем текущим
printf("Элемент добавлен.");
}
void InsertElement(int Position, int Value)//Вствка элемента
{
if (start==NULL) //Если список не создан выводим сообщение
{
printf("Список не создан!!!");
return;
}
if (Position>Length() || Position<1) //проверяем позицию на корректность
{
printf("Неправильный ввод!!!");//Сообщаем об ошибке
return;
}
int currentNumber = 1;//номер текущего элемента
Point *tmp;
if(Position==1) //Если нужно вставить перед первым элементом
{
tmp = (Point*)malloc(sizeof(Point)); //Выделяем память
tmp->value = Value;//Зписываем туда значение
tmp->next = start;//Указываем на начальный элемент
start = tmp; //И говорим что теперь tmp будет началом
printf("Элемент вставлен.");
return;
}
tmp = start;
while(currentNumber<Position-1)//Пока не дойдем до нужного элемента.Нужно найти предшествующий элемент чтобы использовать следующий
{
currentNumber++;
tmp = tmp->next; //Перебираем список
}
Point *newElement =(Point*)malloc(sizeof(newElement));
newElement->value = Value; //Записываем туда значение
newElement->next = tmp->next;//Указываем на место в которое указывает элемент после котороко осуществиться вставка
tmp->next = newElement; //указываем на новый элемент
printf("Элемент вставлен.");
return;
}
void DeleteElement(int Number)
{
if (start==NULL) //Если список не создан выводим сообщение
{
printf("Список не создан!!!");
return;
}
if (Length()<Number || Number<1) //Если удаляемый элемент больше длинны списка или он отрицательный
{
printf("Неправильный ввод!!!");//Сообщаем об ошибке
return;
}
Point *delPoint; //Переменная для хранения удаляемого элемента
if (Number==1) //Если удаляем первый элемент
{
delPoint = start;
start = start->next;//Но элемент указывающий на начало сдвигаем на 1 позицию
free (delPoint); //Удаляем элемент из памяти (кучи)
printf("Элемент удален.");
return;
}
Point *tmp = start; //Создаем новый элемент и присваеваем ему значение начала списка
int currentNumber = 2;//потому что первый мы тут не удалим
while (currentNumber!=Number) //Пока не дойдем до нужного номера
{
currentNumber++; //увеличиваем счетчик
tmp = tmp->next;//Перебираем элементы списка
}
delPoint = tmp->next;
tmp->next = (tmp->next)->next;//Сдвигаем значение на 2 элемента (удаляется из списка 1-й элемент)
free (delPoint); //Удаляем элемент из памяти
tmp = start;
while (tmp->next!=NULL)//Перебираем все элементы пока не дойдем до конца списка
tmp = tmp->next;
current = tmp; //Текущему элементу присваиваем значение последнего
printf("Элемент удален.");
}
void PrintList()
{
if (start==NULL)//Если список не создан выводим сообщение
{
printf("Список не создан!!!");
return;
}
Point *tmp = start;
while (tmp!=NULL)//Пока не дойдем до конца списка
{
printf("%i ", tmp->value);//Печатаем все элементы
tmp = tmp->next;
}
}
int main()
{
setlocale(LC_ALL, "RUSSIAN");
int choice = 0;
int a=0;
while(choice!=8)
{
int tmpValue, tmpValue2;
system("cls");
printf("1 - Создать список\n2 - Удалить список\n3 - Добавить елемент\n4 - Вставить элемент\n5 - Удалить елемент\n6 - Показать список\n7 - Найти max 'ktvtynn8 - Выход\n");
printf("Указатель стоит на %i позиции",(Length()-(Length()-a)));
printf("\nСписок содержит в данный момент %i элементов",Length());
while(!fflush(stdin)&&printf("\nВведите команду: ")&&!scanf("%i",&choice));
system("cls");
switch (choice)
{
case 1:
while(!fflush(stdin)&&printf("Введите значение первого элемента: ")&&!scanf("%i",&tmpValue));
CreateList(tmpValue);
a=1;
getch();
break;
case 2:
DeleteList();
a=0;
getch();
break;
case 3:
while(!fflush(stdin)&&printf("Введите значение элемента: ")&&!scanf("%i",&tmpValue));
AddElement(tmpValue);
a=Length();
getch();
break;
case 4:
while(!fflush(stdin)&&printf("Введите номер элемента: ")&&!scanf("%i",&tmpValue));
while(!fflush(stdin)&&printf("Введите значение элемента: ")&&!scanf("%i",&tmpValue2));
InsertElement(tmpValue, tmpValue2);
if(tmpValue<Length())
{
a=(Length()-(Length()-tmpValue));
}
getch();
break;
case 5:
while(!fflush(stdin)&&printf("Введите номер элемента: ")&&!scanf("%i",&tmpValue));
DeleteElement(tmpValue);
if(tmpValue<Length())
{
a=tmpValue;
}
getch();
break;
case 6:
PrintList();
getch();
break;
case 7:
if (start != NULL)
printf ("Max = %d", MaxElem());
else
puts ("Список не создан");
getch();
break;
}
}
return 0;
}