Поиск максимального элемента в односвязном циклическом списке - 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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы