#1 25.12.07 19:28
Информатика. Изобразите plz блок-схему алгоритма
Народ, если кому не трудно, выручите пожалуйста! Нужно Изобразить блок-схему алгоритма. Вот прога(по спискам):
!!!!!ЗАПЛАЧУ'!!!!
#include <stdio.h>
#include <malloc.h>
// Список - связанные элементы
struct elem{ // структура элемента списка
int d; // данные
elem*n;}; // указатель на следующий элемент в списке
elem*newelem(int d1,elem*next) // получить новый элемент из динамической памяти
{
elem*p=(elem*)malloc(sizeof(elem));
p->d=d1;
p->n=next;
return p;
}
void setlink(elem*p,elem*pn) // уставить связь
{
p->n=pn;
}
unsigned int load(char*fname,elem**ph) // загрузить список из файла
{
FILE*fp;
fp=fopen(fname,"r"); // открыть файл для чтения
int d;
*ph=0;
elem*p=0;
int n=0;
while(fscanf(fp,"%d",&d)==1) { // прочитать данные
*ph=newelem(d,*ph);
n++;
}
return n; // вернуть кол-во прочитанных элементов
}
int ins(elem**ph, int k,int d) // вставить элемент в к -ую позицию списка
{
if(!ph||!*ph&&k)return 0;
if(!k){*ph=newelem(d,*ph);return 1;} // если вставить в голову
elem*pr=*ph;
while(pr->n&&--k){pr=pr->n;} // поиск места вставки
if(!pr->n&&k>1)return 0; // вставка
{pr->n=newelem(d,pr->n);}
return 1;
}
int swap(elem**ph,int k1,int k2) // Поменять местами корректируя значения
{
if(!*ph)return 0;
if(k1==k2)return 1;
if(k2<k1){int t=k2;k2=k1;k1=t;} // коррекция позиций обмена
elem*p1=*ph,*p2;
while(p1&&k1)p1=p1->n,k1--,k2--; // поиск первой позиции
if(k1||!p1)return 0;
p2=p1;
while(p2&&k2)p2=p2->n,k2--; // поиск второй позиции
if(k2||!p2)return 0;
int t=p1->d;p1->d=p2->d;p2->d=t; // обмен данными
return 1;
}
int get(elem*ph,int k) // получить значение и-того элемента
{
elem*p=ph;
while(p&&k)p=p->n,k--; // поиск элемента с переданным номером
if(k||!p)return -1;
return p->d;
}
int swaplinks(elem**ph,int k1,int k2) // поменять местами, корректируя связи
{
if(!*ph)return 0;
if(k1==k2)return 1;
if(k2<k1){int t=k2;k2=k1;k1=t;} // коррекция позиций обмена
elem**p1=ph,**p2;
while(*p1&&k1)p1=&((*p1)->n),k1--,k2--; // поиск первой позиции
if(k1||!*p1)return 0;
p2=p1;
while(*p2&&k2)p2=&((*p2)->n),k2--;// поиск второй позиции
if(k2||!*p2)return 0;
if(&((*p1)->n)==p2){ // если идут друг за другом
elem*p=*p1;
*p1=*p2;
p->n=(*p2)->n;
(*p2)->n=p;
}
else {
elem*p=*p1,*pn=(*p1)->n; // в общем случае
*p1=*p2;
p->n=(*p2)->n;
*p2=p;
(*p1)->n=pn;
}
return 1;
}
int del(elem**ph,int k) // удалить элемент из списка
{
if(!ph||!*ph)return 0;
if(!k){*ph=(*ph)->n;return 1;}
elem*pr=*ph;
while(pr->n&&--k){pr=pr->n;} // поиск элемента
if(k||!pr->n)return 0;
elem*p=pr->n; // вырезание элемента из списка
pr->n=pr->n->n;
free(p);
return 1;
}
void show(elem*ph){ // Показать все элементы списка
if(!ph){printf("Empty\n");return;}
while(ph){printf("%d,",ph->d);ph=ph->n;} // просмотр каждого элемента и вывод его значения
printf("\n");
}
int main(){
elem*ph=0; // Указатель на головной элемент
load("c:\\list.txt",&ph); // Чтение из файла
show(ph);
ins(&ph,0,111);
ins(&ph,3,333);
ins(&ph,10,999);
show(ph);
swap(&ph,0,10);
swap(&ph,3,5);
show(ph);
swaplinks(&ph,0,10);
swaplinks(&ph,3,5);
show(ph);
for(int i=5;i>=0;i--){ // удаление 6 элементнов с середины
del(&ph,i);
show(ph);
}
for(int i=4;i>=0;i--){// остальных с конца
del(&ph,i);
show(ph);
}
return 0;
}
Исправлено GREY989 (25.12.07 19:42)
Offline

