Поиск максимального элемента в односвязном циклическом списке - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д