Переписать код "Фонотека" с С++ - C (СИ)
Формулировка задачи:
код есть на С++, а мне нужно его переделать в С. Помогите пожалуйста, буду очень благодарна.
код:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
//односвязный список
struct elem {
char name[40]; //исполнитель
char style[40]; //стиль
int albums; //общее количество альбомов
int cd_of_year; //количество дисков проданных за последний год
elem *next; //указатель на следующий элемент
};
typedef elem *pelem; //тип-указатель
pelem HEAD = NULL; //"голова" списка
int NN=0; //текущее количество элементов
int N_MAX = 10; //максимум списка
pelem ad ()//добавление элемента
{
pelem neo = new elem;
//добавление элемента в начало
if (HEAD == NULL) {HEAD = neo;
neo->next = NULL;}
else {
neo->next = HEAD;
HEAD = neo;
}
NN++;
return neo;
}
void ed (pelem p)//редактирование элемента
{
//ввод данных
elem dan;
cout<<"Artist: "; cin>>dan.name;
cout<<"Style: " ; cin>>dan.style;
cout<<"Albums: "; cin>>dan.albums;
cout<<"CD za posledniy god: "; cin>>dan.cd_of_year;
//передача данных в элемент
dan.next = p->next;
*p = dan;
system("cls");
}
void rd (pelem p) //чтение элемента
{
if (p)
{
for(int i=0;i<80;i++) cout<<"_";
cout<<"Object: "<< p->name<<endl;
cout<<"Style: "<< p->style<<endl;
cout<<"Albums: "<< p->albums<<endl;
cout<<"CD za posledniy god:: "<< p->cd_of_year<<endl;
for(int i=0;i<80;i++) cout<<"_";
}
}
pelem find (char obj_name[]) //поиск элемента
{
pelem p = HEAD;
do
{
if (!strcmp(p->name, obj_name)) return p;
p=p->next;
} while (p) ;
cout<<"Ne naydenu"<<endl;
return p;
}
void del (char obj_name[])
{
if (HEAD)
{
pelem p = find(obj_name);
if (p)
{
if (p==HEAD) //если голова - и есть искомый объект
{
if (NN>1) HEAD=HEAD->next;
else HEAD = NULL;
}
else
{
pelem father = HEAD;
while (father->next!=p)
father = father->next;
father->next = p->next;
}
delete p;
NN--;
cout<<"Udaleno: "<<obj_name<<endl;
return;
}
}
}
void sort () //сортировка
{
for (int j=0; j<NN; j++)
{
pelem p = HEAD;
pelem son = p->next;
if (p->albums < son->albums)
{
p->next = son->next;
HEAD = son;
son->next = p;
}
p = HEAD;
while((p->next)->next)
{
pelem father = p;
p = p->next;
pelem son = p->next;
if (p->albums < son->albums)
{
father->next = son;
p->next = son->next;
son->next = p;
}
p=father->next;
}
}
}
int main ()
{
int i;
char c;
do {
cout<<"Menu"<<endl;
cout<<"Count:"<< NN<<"/"<<N_MAX <<endl;
cout<<"[1] add "<<endl;
cout<<"[2] list "<<endl;
cout<<"[3] edit "<<endl;
cout<<"[4] delete "<<endl;
cout<<"[5] search "<<endl;
cout<<"[6] best-seller "<<endl;
cout<<"[7] sort "<<endl;
cout<<"[0] exit " <<endl;
cout<<">>";
c = getch();
system("cls");
if (c=='1') //добавление элемента
{
if (NN<N_MAX) {
pelem p = ad();
ed(p);
}
else cout<<"List is full"<<endl;
}
if (c=='2') //просмотр списка
{
pelem p = HEAD;
if (p==NULL) cout<<"List is empty"<<endl; else
while(p!=NULL)
{
rd(p);
p=p->next;
}
}
if (c=='3') {
char obj[40];
cout<<"Edit object : ";
cin>>obj;
if (HEAD)
{
pelem p =find(obj);
if (p) ed(p);
}
else cout<<"List is empty"<<endl;
}
if (c=='4') {
char obj[40];
cout<<"Delete item : ";
cin>>obj;
if (HEAD) del(obj); else cout<<"List is empty"<<endl;
}
if (c=='5') {
char c_2;
do {
cout<<"Poisk"<<endl;
cout<<"[1] by name "<<endl;
cout<<"[2] by genre "<<endl;
cout<<"[0] <<back "<<endl;
cout<<">>";
c_2 = getch();
system("cls");
if (c_2=='1') {
char obj[40];
cout<<"Name : ";
cin>>obj;
if (HEAD) rd(find(obj));
else cout<<"List is empty"<<endl;
}
if (c_2=='2') {
char obj[40];
cout<<"Genre : ";
cin>>obj;
pelem p=HEAD;
if (HEAD)
while (p)
{
if (!strcmp(p->style, obj)) rd(p);
p = p->next;
}
else cout<<"List is empty"<<endl;
}
} while(c_2!='0');
}
if (c=='6') {
if (HEAD)
{
pelem p = HEAD;
pelem p_with_max = p;
while(p)
{ if (p->cd_of_year > p_with_max->cd_of_year) p_with_max = p;
p = p->next;
}
rd(p_with_max);
}
else cout<<"List is empty"<<endl;
}
if (c=='7') {
sort();
pelem p = HEAD;
if (p==NULL) cout<<"List is empty"<<endl; else
while(p!=NULL)
{
rd(p);
p=p->next;
}
}
} while(c!='0');
return 0;
}Решение задачи: «Переписать код "Фонотека" с С++»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
//односвязный список
typedef struct elem_t
{
char name[40]; //исполнитель
char style[40]; //стиль
int albums; //общее количество альбомов
int cd_of_year; //количество дисков проданных за последний год
struct elem_t* next; //указатель на следующий элемент
} elem;
typedef elem* pelem; //тип-указатель
pelem HEAD = NULL; //"голова" списка
int NN = 0; //текущее количество элементов
int N_MAX = 10; //максимум списка
pelem ad() //добавление элемента
{
pelem neo = (pelem) malloc(sizeof(elem));
//добавление элемента в начало
if (HEAD == NULL)
{
HEAD = neo;
neo->next = NULL;
}
else
{
neo->next = HEAD;
HEAD = neo;
}
NN++;
return neo;
}
void ed(pelem p) //редактирование элемента
{
//ввод данных
elem dan;
printf("Artist: ");
scanf("%s", dan.name);
printf("Style: ");
scanf("%s", dan.style);
printf("Albums: ");
scanf("%d", &dan.albums);
printf("CD za posledniy god: ");
scanf("%d", &dan.cd_of_year);
dan.next = p->next;
*p = dan;
system("cls");
}
void rd(pelem p) //чтение элемента
{
int i;
if (p)
{
for (i = 0; i < 80; i++)
{
printf("_");
}
printf("\n");
printf("Object: %s\n", p->name);
printf("Style: %s\n", p->style);
printf("Albums: %d\n", p->albums);
printf("CD za posledniy god: %d\n", p->cd_of_year);
for (i = 0; i < 80; i++)
{
printf("_");
}
printf("\n");
}
}
pelem find(char obj_name[]) //поиск элемента
{
pelem p = HEAD;
do
{
if (!strcmp(p->name, obj_name))
{
return p;
}
p = p->next;
}
while (p);
printf("Ne naydenu\n");
return p;
}
void del(char obj_name[])
{
if (HEAD)
{
pelem p = find(obj_name);
if (p)
{
if (p == HEAD) //если голова - и есть искомый объект
{
if (NN > 1)
{
HEAD = HEAD->next;
}
else
{
HEAD = NULL;
}
}
else
{
pelem father = HEAD;
while (father->next != p)
{
father = father->next;
}
father->next = p->next;
}
free(p);
NN--;
printf("Udaleno: %s\n", obj_name);
return;
}
}
}
void sort() //сортировка
{
int j;
for (j = 0; j < NN; j++)
{
pelem p = HEAD;
pelem son = p->next;
if (p->albums < son->albums)
{
p->next = son->next;
HEAD = son;
son->next = p;
}
p = HEAD;
while ((p->next)->next)
{
pelem father = p;
p = p->next;
pelem son = p->next;
if (p->albums < son->albums)
{
father->next = son;
p->next = son->next;
son->next = p;
}
p = father->next;
}
}
}
int main()
{
char c;
do
{
printf("Menu\n"
"Count: %d/%d\n"
"[1] add\n"
"[2] list\n"
"[3] edit\n"
"[4] delete\n"
"[5] search\n"
"[6] best-seller\n"
"[7] sort\n"
"[0] exit\n"
">>", NN, N_MAX);
c = getch();
system("cls");
if (c == '1') //добавление элемента
{
if (NN < N_MAX)
{
pelem p = ad();
ed(p);
}
else
{
printf("List is full\n");
}
}
if (c == '2') //просмотр списка
{
pelem p = HEAD;
if (p == NULL)
{
printf("List is empty\n");
}
else
while (p != NULL)
{
rd(p);
p = p->next;
}
}
if (c == '3')
{
char obj[40];
printf("Edit object : ");
scanf("%s", obj);
if (HEAD)
{
pelem p = find(obj);
if (p)
{
ed(p);
}
}
else
{
printf("List is empty\n");
}
}
if (c == '4')
{
char obj[40];
printf("Delete item : ");
scanf("%s", obj);
if (HEAD)
{
del(obj);
}
else
{
printf("List is empty\n");
}
}
if (c == '5')
{
char c_2;
do
{
printf("Poisk\n"
"[1] by name \n"
"[2] by genre \n"
"[0] <<back \n"
">>");
c_2 = getch();
system("cls");
if (c_2 == '1')
{
char obj[40];
printf("Name: \n");
scanf("%s", obj);
if (HEAD)
{
rd(find(obj));
}
else
{
printf("List is empty\n");
}
}
if (c_2 == '2')
{
char obj[40];
printf("Genre: \n");
scanf("%s", obj);
pelem p = HEAD;
if (HEAD)
while (p)
{
if (!strcmp(p->style, obj))
{
rd(p);
}
p = p->next;
}
else
{
printf("List is empty\n");
}
}
}
while (c_2 != '0');
}
if (c == '6')
{
if (HEAD)
{
pelem p = HEAD;
pelem p_with_max = p;
while (p)
{
if (p->cd_of_year > p_with_max->cd_of_year)
{
p_with_max = p;
}
p = p->next;
}
rd(p_with_max);
}
else
{
printf("List is empty\n");
}
}
if (c == '7')
{
sort();
pelem p = HEAD;
if (p == NULL)
{
printf("List is empty\n");
}
else
while (p != NULL)
{
rd(p);
p = p->next;
}
}
}
while (c != '0');
return 0;
}