У вас есть неопределенное поведение
Например, в Max_Value вы делаете Get_Value(Start, Count);
без инициализации Count
, поэтому весьма вероятно
Если GetAddress вызывается с n , оценивающим длину разыменованного вами списка NULL,
if (n < 0 || n >ListLength(Start))
должно быть
if (n < 0 || n >= ListLength(Start))
In Get_Value вы делаете
Buffer = GetAddress(Start, Number_Element);
return Buffer -> Info;
без проверки, если GetAddress возвращает NULL, поэтому вы можете разыменовать NULL снова
Для удобства чтения я призываю вас не использовать заглавные имена для локальных переменных, используйте их для определяемых вами типов и глобальных переменных.
Ваш код также очень сложный и очень медленный потому что вы go бросаете список несколько раз. Простой способ сделать это:
#include <stdio.h>
#include <stdlib.h>
struct List {
int info;
struct List * next;
};
void Max_Value(struct List * l)
{
if (l == NULL)
puts("empty list");
else {
struct List * pmax = l;
int max = l->info;
while ((l = l->next) != NULL) {
if (l->info > max)
pmax = l;
}
printf("max value %d (at %p), next is %p\n", max, pmax, pmax->next);
if (pmax->next != NULL)
printf("value of the next cell %d\n", pmax->next->info);
}
}
// to help to make a list
struct List * mk(int v, struct List * n)
{
struct List * l = malloc(sizeof(struct List));
l->info = v;
l->next = n;
return l;
}
// free resources
void del(struct List * l)
{
while (l) {
struct List * n = l->next;
free(l);
l = n;
}
}
int main()
{
struct List * l;
l = mk(3, mk(1, mk(4, mk(2, NULL))));
Max_Value(l);
del(l);
l = mk(3, mk(1, mk(4, mk(22, NULL))));
Max_Value(l);
del(l);
return 0;
}