// Ychebka3.cpp : main project file.
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <string.h>
#define COUNT 20
struct zap//очередь
{
char inf[COUNT];//структурная переменная хранящяя инфу
zap *nx;
};
//Функция добавления нового файла в очередь.
void Add(zap **h, zap **t, char *inf)
{
zap *temp;
//Выделяем память
if (!(temp=(zap*)calloc(1,sizeof(zap)))){ puts("Occured error!");return ;}
//Копируем строку в элемент очереди
strcpy(temp->inf, inf);
//Работаем с очередью
if(!*h)//Если очередь не создана то создаем ее
{
*h = temp;
*t = temp;
}
else //Иначе добавляем новый элемент в очередь.
{
(*t)->nx = temp;
*t = temp;
}
}
//Функция записывающая информацию из файла в очередь.
void InputQueueFromFile(zap **h,zap **t, FILE *f)
{
char temp[COUNT];
//пока не достигнут конец файла записываем информацию в очередь
while (!feof(f))
{
//считываем строку из файла
fscanf(f, "%s", temp);
if (feof(f))
{
break;
}
//Добавляем ее в очередь
Add(h, t, temp);
}
}
//Функция сортировки очереди.
void Sort(zap **h, zap **t)
{
zap *n = *h, *temp, *before, *beforeh = NULL, *temp2;
while (n->nx)//Пока очередь не кончится
{
temp = n->nx;//Ставим указатель на следущий элемент.
before = n;//Ставим указатель на предыдущий элемент temp.
while (temp)//этим циклом ходим с n->nx по последний элемент.
{
if (strcmp(n->inf, temp->inf) > 0)//Если мы нашли значение больше данного то мы меняем указатели
{
before->nx = n;
//если меняем с первым элементом очереди
if (!beforeh)
{
*h = temp;
}
else
{
beforeh->nx = temp;
}
//меняем значения указателей
temp2 = n->nx;
n->nx = temp->nx;
temp->nx = temp2;
//если меняем последний элемент
if (!temp->nx)
{
*t = n;
}
//т.к. поменяли местами
temp2 = n;
n = temp;
temp = temp2;
}
before = temp;
temp = temp->nx;
}
beforeh = n;
n = n->nx;
}
}
//Функция создания очереди из двух уже имеющихся.
void CreateQueue(zap *h1, zap *h2, zap **h3, zap **t3)
{
while(h1 && h2)
{
if(strcmp(h1->inf,h2->inf)>0)
{
Add(h3, t3, h2->inf);
h2=h2->nx;
}
else
{
Add(h3, t3, h1->inf);
h1=h1->nx;
}
}
//дописываем
while(h1)
{
Add(h3, t3, h1->inf);
h1=h1->nx;
}
while(h2)
{
Add(h3, t3, h2->inf);
h2=h2->nx;
}
}
//Создаем файл с информацией из очереди.
void InputFileFromQueue(zap *h, FILE *f)
{
if(!h)//если очереди нету - возвращаемся
return;
while(h)
{
fprintf(f, "%s\n", h->inf);//Печатаем элементы очереди
h = h->nx;//идем по очереди
}
}
//Печать очереди на экран
void Print(zap *h)
{
while (h)
{
printf("%s\n", h->inf);
h = h->nx;
}
}
void main()
{
FILE *f;
zap *h1 = NULL, *t1 = NULL; //Создаем указатели Хвоста и Головы для первой очереди.
zap *h2 = NULL,*t2 = NULL; //Создаем указатели Хвоста и Головы для второй очереди.
zap *h3 = NULL,*t3 = NULL; //Создаем указатели Хвоста и Головы для третьей очереди.
//Вызываем первый файл и копируем информацию в очередь.
f = fopen("1.txt","r");
if (f)
InputQueueFromFile(&h1,&t1,f);
fclose(f);
printf("\n1.txt\n"); Print(h1);
//Вызываем второй файл и копируем информацию во вторую очередь.
f = fopen("2.txt","r");
if (f)
InputQueueFromFile(&h2,&t2,f);
fclose(f);
printf("\n2.txt\n"); Print(h2);
//Вызываем функции для сортировки очереди.
Sort(&h1, &t1);
Sort(&h2, &t2);
//Создаем третью очередь и добавляем отсортированые элементы из первой и второй.
CreateQueue(h1, h2, &h3, &t3);
printf("\n3.txt\n"); Print(h3);
//Сохраняем очередь в файл
f = fopen("3.txt","w");
if (f)
InputFileFromQueue(h3, f);
fclose(f);
}