// SpisFile.cpp : Defines the entry point for the console application.//
// Написать программу, которая вводит из текстового файла последовательность символьных строк,
// содержащих целые числа, записанные через пробел. Строит из чисел строк однонаправленный список-очередь.
// В списке считае количество элементов, находит адрес махимального элемента и удаляет его из списка.
// формирование списка, печать и все манипуляции организовать с помощью подпрограмм.
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
struct rec{
       int num;
       rec *p;};
int count(rec *first) // подсчет количества элементов списка
{int n=0;rec *q;
 q=first;
 while (q!=NULL)
 { n++;
   q=q->p;
 }
 return n;
}
void funadd(rec **first,rec**last,int n)// добавление элемента в список
{rec *q ;
    if (*first==NULL)
     {*first=new rec;
	   (*first)->p=NULL;
	   (*first)->num=n;
       *last=*first;
	 
    }
	else
	{ q=new rec;
	  q->num=n;
	  q->p=NULL;
	  (*last)->p=q;
	  *last=q;
	}
}
rec * maxelem(rec *first)// нахождение максимального элемента списка (его адреса)
{rec *q=first->p;
int max=first->num;
rec *find=first;
while(q!=NULL)
{ 
	if(q->num>max)
	{ 
		max=q->num;
	    find=q;
	}
	q=q->p;
}
 return find;
}
void delukaz(rec **first,rec **last,rec *f)// удаление элемента с указанным адресом
{rec *p,*q;
     if(f==*first)
	 {p=*first;
	  *first=(*first)->p;
	  delete p;
	 }
	 else
	 { q=*first;
	   p=*first;
	   while((p!=NULL)&&(p!=f))
	   { q=p;
	     p=p->p;
	   }
	   q->p=p->p;
	   if(p==*last)
		   *last=q;
	   delete p;
	 }
}
void print(rec *first,char *s)// печать списка с комментарием
{rec *q;
puts(s);
       q=first;
    while(q!=NULL)
	{
       printf("%5d",q->num);
       q=q->p;
	}
	printf("\n");
}

void main()
   {rec *first=NULL,*last,*q,*p;
int i,j,l,n;
    char fname[22],st[80],slovo[12];
	FILE *f;
    puts("Input File Name");
	gets(fname);
	f=fopen(fname,"r");
	while(fgets(st,80,f)!=NULL)
	{     l=strlen(st);*slovo='\0';
	j=0;
	   for(i=0;i<=l;i++)
         if((st[i]==' ')||(st[i]=='\0'))
		 {  slovo[j]='\0';
	        n=atoi(slovo);
			funadd(&first,&last,n);
			j=0;slovo[j]='\0';
		 }
		 else slovo[j++]=st[i];
	}
print(first,"Inputed Spisok");
	

  printf("\nIn Spisok %5d Elementov\n",count(first));
  q=maxelem(first);
  printf("Max element =%5d   adress=%p\n",q->num,q);
  delukaz(&first,&last,q);
print(first," Spisok after delete");
printf(" first=%p, chislo=%5d\n last=%p, chislo=%5d\n",first,first->num,last,last->num);
  
 }
