Индивидуальное задание по структурам данных / CURSOV4
.doc#include <stdio.h>
#include<string.h>
#include<conio.h>
#include<iostream.h>
//список ключевых слов
struct key
{ char *SL; //строка – кл.слово
struct key*next; //указатель след.элемент
struct f_name*flag;//указатель на список имён файлов
}; //содержащих кл.слова
//список имён файлов, содержащих кл.слов
struct f_name
{ char *imay; //строка-имя файла
struct f_name *next2;//след.элемент списка
};
//список для хранения строк из файла
struct slovo
{ char *AL; //строка, хранящаяся в файле
struct slovo*sui; //след. элемент списка
};
//список файлов
struct x_files
{ char *name; //имя файла
char *info; //строка в файле
char *str; //строка для чтения из файла
int b; //кол-во строк в файле
FILE *A; //указатель на поток
struct slovo *begin;//указатель на список строк
struct x_files*sled;//след.элемент списка
};
void main()
{ clrscr(); //очистка экрана
char x; //переменная для switch
int i=0; //рабочая переменная
int j; //кол-во кл.слов
int f; //кол-во файлов
char *q; //строка-кл.слово
struct x_files *topx,*px,*qx; //указатели на список файлов
struct key *top,*p,*p1;//указатели на список кл.слов
struct slovo *n,*m; //указатели на список строк
struct f_name *topy,*py,*qy;//указатели на список f_name
char *w=" "; //символ пробел
cout<<"Сколько будет ключевых слов? - ";
cin>>j; //ввод кол-ва кл.слов
if(j==1)
cout<<"Вводите слово:\n";
else
cout<<"Вводите слова:\n";
//заполнеие первого элемента списка key
q=new char[80]; //выделяем память под строку
gets(q); //ввод строки
top=new struct key;//выделяем память под первый элемент списка
top->SL=q; //записываем строку
top->next=0;
p=p1=top;
//заполнение остальных элементов списка
while(i<j-1)
{ q=new char[80];
gets(q);
p=new struct key;
p->SL=q;
p1->next=p;
p->next=0;
p1=p;
i++;
};
//меню
while(1)
{
cout<<"\t\t\t\t1.Вывод ключевых слов\n";
cout<<"\t\t\t\t2.Создание новых файлов и запись в них слов\n";
cout<<"\t\t\t\t3.Вывод слов из файлов\n";
cout<<"\t\t\t\t4.Поиск кл.слов в файлах\n";
cout<<"\t\t\t\t5.Добавление файла \n";
cout<<"\t\t\t\t6.Выход\n";
cin>>x;
switch(x)
{
case '1': //вывод кл.слов
cout<<top->SL<<"\n"; //вывод первого слова
p=top;
do //вывод остальных слов
{p=p->next;
cout<<p->SL<<"\n";
}
while(p->next!=0);
break;
case '2': //заполнение списка файлов
int d;
i=0;
cout<<"Введите кол-во файлов\n";
cin>>f;
//заполнение первого файла
topx=new struct x_files;
cout<<"Введите имя файла\n";
gets(topx->name); //ввод имени файла
//открытие файла
if ((topx->A = fopen(topx->name, "w+"))== NULL)
perror (topx->name);
cout<<"Сколько будет слов?";
cin>>topx->b;
if(topx->b==1)
cout<<"Вводите слово:\n";
else
cout<<"Вводите слова:\n";
//запись первой строки
topx->info=new char[80];//выделяем память под первую строку
gets(topx->info); //ввод первой строки
fputs(topx->info,topx->A);//запись строки в файл
fputs(w,topx->A); //запись пробела в файл
topx->str=new char[80]; //строка для чтения из файла
fseek(topx->A,0L,SEEK_SET);//переход на начало файла
//чтение строки из файла в str
fgets(topx->str,strlen(topx->info)+1,topx->A);
topx->begin=new struct slovo;//создание списка строк str
topx->begin->AL=topx->str; //записываем str
topx->begin->sui=0;
n=m=topx->begin;
fseek(topx->A,0L,SEEK_END);//в конец файла
//запись остальных строк
while(i<topx->b-1)
{ topx->info=new char[80];
gets(topx->info);
fputs(topx->info,topx->A);
fputs(w,topx->A);
topx->str=new char[80];
//возвращение курсора в файле на одну строку влево
fseek(topx->A,-(long)(strlen(topx->info)+1),1);
fgets(topx->str,strlen(topx->info)+1,topx->A);
n=new struct slovo;
n->AL=topx->str;
n->sui=0;
m->sui=n;
m=n;
fseek(topx->A,0L,SEEK_END);
i++;
};
fclose(topx->A);
topx->sled=0;
//заполнение остальных файлов
px=qx=topx;
for(d=0;d<f-1;d++)
{ i=0;
px=new struct x_files;
cout<<"Введите имя файла:\n";
gets(px->name);
if ((px->A = fopen(px->name, "w+"))== NULL)
perror (px->name);
cout<<"Сколько будет слов? - ";
cin>>px->b;
if(px->b==1)
cout<<"Вводите слово:\n";
else
cout<<"Вводите слова:\n";
px->info=new char[80];
gets(px->info);
fputs(px->info,px->A);
fputs(w,px->A);
px->str=new char[80];
fseek(px->A,0L,SEEK_SET);
fgets(px->str,strlen(px->info)+1,px->A);
px->begin=new struct slovo;
px->begin->AL=px->str;
px->begin->sui=0;
n=m=px->begin;
fseek(px->A,0L,SEEK_END);
while(i<px->b-1)
{ px->info=new char[80];
gets(px->info);
fputs(px->info,px->A);
fputs(w,px->A);
px->str=new char[80];
fseek(px->A,-(long)(strlen(px->info)+1),1);
fgets(px->str,strlen(px->info)+1,px->A);
n=new struct slovo;
n->AL=px->str;
n->sui=0;
m->sui=n;
m=n;
fseek(px->A,0L,SEEK_END);
i++;
};
fclose(px->A);
qx->sled=px;
px->sled=0;
qx=px;
};
break;
case '3': //вывод списка файлов
px=topx;
for(j=0;j<f;j++)
{ cout<<px->name<<" содержит:\n";
cout<<px->begin->AL<<"\n";
n=px->begin;
do
{ n=n->sui;
cout<<n->AL<<"\n";
}
while(n->sui!=0);
px=px->sled;
};
break;
case '4':
//поиск
int i1,i2=0,i3=0;//рабочие счётчики
p=top; //переход к началу списка кл.слов
for(i=0;i<j;i++) //перебор кл.слов
{ //начало списка f_name
py=new struct f_name;
p->flag=py;
py->next2=0;
qy=py;
px=topx; //на начало списка файлов
for(i1=0;i1<f;i1++) //перебор файлов
{ n=px->begin; //на начало списка строк из файла
while(i2<px->b||i3!=1) //перебор строк из файла
{ if(strcmp(p->SL,n->AL)==0)//если строки совпадают
{ //записываем в список f_name имя файла
py=new struct f_name;
py->imay=px->name;
py->next2=0;
qy->next2=py;
qy=py;
i3=1; //условие выхода из цикла
break; //выход из сравнения строк
}
else
{n=n->sui;//след.слово из файла
i2++;}
};
px=px->sled; //след.файл
i2=0;
};
p=p->next; //след. кл. слово
};
p=top; //на начало списка кл.слов
for(i=0;i<j;i++) //перебор кл.слов
{ py=p->flag;
cout<<p->SL;
cout<<" хранится в ";
while(py->next2!=0)//вывод списка имён файлов
{ py=py->next2;
cout<<py->imay<<",\n";
};
p=p->next;
cout<<"\n";
};
break;
case '5':
//добавление файла в конец списка
qx=px=topx;
//установить на конец списка
for(i=1;i<f;i++)
{ px=px->sled;
qx=qx->sled;
};
//добавление
px=new struct x_files;
cout<<"Введите имя файла\n";
gets(px->name);
if ((px->A = fopen(px->name, "w+"))== NULL)
perror (px->name);
cout<<"Сколько будет слов? - ";
cin>>px->b;
cout<<"Вводите слова:\n";
px->info=new char[80];
gets(px->info);
fputs(px->info,px->A);
fputs(w,px->A);
px->str=new char[80];
fseek(px->A,0L,SEEK_SET);
fgets(px->str,strlen(px->info)+1,px->A);
px->begin=new struct slovo;
px->begin->AL=px->str;
px->begin->sui=0;
n=m=px->begin;
fseek(px->A,0L,SEEK_END);
i=0;
while(i<px->b-1)
{ px->info=new char[80];
gets(px->info);
fputs(px->info,px->A);
fputs(w,px->A);
px->str=new char[80];
fseek(px->A,-(long)(strlen(px->info)+1),1);
fgets(px->str,strlen(px->info)+1,px->A);
n=new struct slovo;
n->AL=px->str;
n->sui=0;
m->sui=n;
m=n;
fseek(px->A,0L,SEEK_END);
i++;
};
fclose(px->A);
qx->sled=px;
px->sled=0;
qx=px;
f++;
break;
case '6': //выход из программы
return;
break;
default:
cout<<"повторите ввод\n";
break;};};};