Скачиваний:
14
Добавлен:
01.05.2014
Размер:
42.5 Кб
Скачать

#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;};};};

Соседние файлы в папке Индивидуальное задание по структурам данных