МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
КУЙБЫШЕВСКИЙ ФИЛИАЛ
По дисциплине: Программирование
На тему: « Разработка линейного однонаправленного списка»
Выполнил студент
группы ВТК-281
Киселёв С.А.
.
_______________
(подпись, дата)
Проверил:
Бычков М.И.
Куйбышев 2010
Задание:
Разработать программу реализующая следующие элементы списка:
Вставка, удаление, вывод на экран, чтение из файла, удаление последнего элемента и удаление всех элементов списка, осуществляет выход из программы.
Структурное и функциональное описание программы:
//-------------------------------Подключение библиотек--------------------------
#include <iostream> // Стандартные потоки ввода-вывода:
// ios,istream,ostream,iostream
#include <conio>
#include <windows>
#include <stdio>
#include <stdlib>
#include <fstream> // Файловые потоки ввода-вывода:
//------------------------Русификатор------------------------------------------------
void rus(char *str)
{
char buf[100];
CharToOem(str,buf);
cout<<buf;
return;
}
//------------------------Вывод на экран меню и запись значения--------------
int menu()
{int n;
rus(" Меню ");cout<<"\n";
rus(" ");cout<<"\n";
rus(" 1 - Вставка ");cout<<"\n";
rus(" 2 - Удаление ");cout<<"\n";
rus(" 3 - Вывод на экран ");cout<<"\n";
rus(" 4 - Сохранение ");cout<<"\n";
rus(" 5 - Чтение");cout<<"\n";
rus(" 6 - Удаление всего списка");cout<<"\n";
rus(" 0 - Выход ");cout<<"\n";
rus("==============================");cout<<"\n";
rus(" Введите пункт меню ");cout<<"\n";
cin>>n; return n;} // ввод с клавиатуры
//-----------------------------------------------------------------------------------
struct node{char x[15]; node *next;};
node *un=NULL; //создаём указатели на начало списка
node *uk=un; //создаём указатель на конец списка
node *r,*pre; //ещё 2 указателя
int count;
//--------------------------------Удаление всего списка-------------------------
void dellist(node *p) // функция удаления
{
while(p){delete p; p=p->next;
}
uk=un;
}
//----------------------------------Удаление------------------------------------
void delet(node*p)
{
node *h=p;
if(p==uk)
{
uk=p->next;delete h;
}
else
{
node *f=p->next;
p->next=(p->next)->next;
delete f;
}
}
//-----------------------------------Сохранение---------------------------------
void save(node *p)
{
ofstream out("a.txt");
while(p)
{ out<<p->x<<"\n";
p=p->next;
}
rus("СОХРАНЕНО!!!"); cout<<"\n";
}
//-------------------------Print------------------------------------------------
void show(node *z){while(z){cout<<z->x<<"_____"<<z<<"\n";z=z->next;}}
//--------------------------Запись в структуру------------------------
node* insert(node *p)
{
node *q=new node;
rus("Введите значение \n");
textcolor(RED);
rus ("!!!не более 15 символов!!!\n\n");
gotoxy(1.5,wherey());
cin>>q->x; q->next=p;
return q;
}
//--------------------------Запись в структуру----------------------------------
node* insert(node *p, char* str)
{
node *q=new node;
strcpy(q->x, str); //функция копирования
q->next=p;
return q; // функция возвращения переменной
}
int GetCountEl(node *p)
{
int n = 0;
while(p) //цикл с предусловием
{
n++;
p=p->next;
}
return n;
}
char* getEl(const int &num)
{
if(num < count) // структура (вид – ветвление)
{
node *p = uk;
for(int i=0; i<num; i++)
p = p->next;
return p->x;
}
else return 0; // иначе возвращается 0
}
void exchange(const int &dpos, const int &spos)
{
if((dpos<count)&&(spos<count))
{
int i;
char* temp;
temp = new char[15];
node *dest = uk;
node *source = uk;
for(i=0;i<dpos;i++) dest = dest->next;
for(i=0;i<spos;i++) source = source->next;
strcpy(temp, source->x);
strcpy(source->x, dest->x);
strcpy(dest->x, temp);
}
}
//--------------Загрузка--------------------------
loading()
{
char *str;
str = new char[15];
ifstream inf("a.txt");
if (!inf)
{
rus("Ошибка при открытии файла!\n\n\n");
} else
{
while (!inf.eof())
{
inf.getline(str,15); //введенная из файла строка
if (strcmp("",str)) uk = insert(uk, str);
}
rus("Данные успешно загружены!\n\n\n");
}
}
//-------------------------Главная функция-----------------------------------
int main()
{ int n=1;
while(n){char x[15];
n=menu();
switch(n) // оператор выбора
{
case 1:clrscr();
cin>>x; uk=insert(uk,x);break;
case 2:clrscr();delet(uk);break;
case 3:clrscr();show(uk);break;
case 4:clrscr();save(uk);break;
case 5:clrscr();loading();break;
case 6:clrscr();dellist(uk);break;
case 0:clrscr();exit(0);
}
}
getch();
}
Схема
Вывод: эта программа выполняет ввод данных с клавиатуры, сохранение в файл и чтение из него; удаление элементов или всего списка, осуществляет просмотр и выход из программы, то есть она выделяет динамическую память для ввода данных с клавиатуры, сохраняет данные в файл. Можно загрузить данные из файла. Редактирует список с помощью удаления элемента списка, а так же возможно удалить список полностью и начать заполнение списка заново.