Для начинающих не используйте числа волхвов c как 5
. Используйте именованные константы.
Имя массива инициализировано неправильно. Вы используете символьные литералы для инициализации элемента данных pname
типа символьного массива без заключения символьных литералов в фигурные скобки.
data name[] = {{'A', .ptotime = 4},
^^^
//...
в этом l oop
for (int x = 0; x < 5; x++)
{
if (name[x].ptotime >= name[x + 1].ptotime)
^^^^^
//...
там это доступ за пределы массива. Таким образом, программа имеет неопределенное поведение.
Используйте локальные переменные, как, например, переменную swap в кратчайшей области, где они используются.
Чтобы поменять местами элементы имени массива, поменять местами не нужно каждый элемент данных каждого элемента массива. Вы можете поменять объекты целиком.
Вот демонстрационная программа.
#include <stdio.h>
typedef struct
{
char pname[2];
int ptotime;
} data;
int main( void )
{
data name[] =
{
{ "A", .ptotime = 4 },
{ "B", .ptotime = 6 },
{ "C", .ptotime = 3 },
{ "D", .ptotime = 7 },
{ "E", .ptotime = 2 }
};
const size_t N = sizeof( name ) / sizeof( *name );
printf("Process Name\t Process Time \n");
for ( size_t i = 0; i < N; i++ )
{
printf( "\t%s\t\t\t\t%d\n", name[i].pname, name[i].ptotime );
}
putchar( '\n' );
//Shortest job first (SJF) scheduling
printf("\nShortest job first (SJF) scheduling \n");
for ( int swapped = 1; swapped; )
{
swapped = 0;
for ( int i = 1; i < N; i++ )
{
if ( name[i].ptotime < name[i-1].ptotime )
{
data tmp = name[i];
name[i] = name[i-1];
name[i-1] = tmp;
swapped = 1;
}
}
}
printf("Process Name\t Process Time \n");
for ( size_t i = 0; i < N; i++ )
{
printf( "\t%s\t\t\t\t%d\n", name[i].pname, name[i].ptotime );
}
return 0;
}
Ее вывод
Process Name Process Time
A 4
B 6
C 3
D 7
E 2
Shortest job first (SJF) scheduling
Process Name Process Time
E 2
C 3
A 4
B 6
D 7