Новые сообщения · Правила  
  • Страница 1 из 1
  • 1
Модератор форума: Berestovskiy  
Динамические структуры данных
Структура содержит фамилию, год рождения. Добавлять новые записи так, чтобы список был упорядочен по алфавиту.
Есть в С++ нужно написать в Си

#include<cstdlib>
#include <iostream>
using namespace std;
structspis {
charfam[20]; // фамилия
intyyyy; // год
structspis *pred; // pred – указательнапредыдущуюструктуру
structspis *next;}; // next – указатель на следующую структуру

void create(void); // создание
void list(spis *); // просмотр
void del(void); // удаление
void add(void); // добавление

structspis *head, // указатели на начало и конец списка
*tail;

int main(intargc, char *argv[])
{
system("chcp 1251 >nul"); //пишем по-русски
system("CLS");
cout<< "Сейчас начнётся создание списка\n";
create();
cout<< "Просмотр списка, начиная с начала\n";
list(head); // просмотр с начала списка
cout<< "Просмотр списка, начиная с конца\n";
list(tail); // просмотр с конца списка
cout<< "Удаление элемента\n";
del();
cout<< "Просмотр списка, начиная с начала\n";
list(head);
cout<< "Добавление\n";
add(); // добавить элемент по алфавиту
cout<< "Просмотр списка, начиная с начала\n";
list(head);
free(head);
system("PAUSE");
}

void create(void) {
spis *p,*pred; // текущий и предыдущийэлементы
charx = '0'; // закончить или продолжить ввод
pred=NULL; // поканетэлементов
do { p=(spis *)malloc(sizeof(spis));
cout<< "Фамилия: "; cin>> p->fam;
cout<< "Год: "; cin>> p->yyyy;
p->pred=pred;
if (pred != NULL) // есть ли предыдущий элемент
pred->next=p;
else
head=p; // илинет
pred=p;
cout<< "Закончить - <0><Enter>"
<<endl
<< "Продолжить - <A-Z><Enter>: ";
cin>> x; }
while (x!='0');
tail=p; // хвост - новый созданный элемент
tail->next=NULL; // нет следующего элемента после хвоста
}

voidlist(spis *p) {
if (p==head) // перебирать с головы списка
while (p != NULL) {
cout<< p->fam<< " " << p->yyyy<<endl;
p=p->next; }
else if (p==tail) // перебирать с хвоста
while ( p!= NULL) {
cout<< p->fam<< " " << p->yyyy<<endl;
p=p->pred; }
else // если нет ни одного элемента
cout<< "Неверныйадрес " <<endl;
system("PAUSE");
}

void del(void) {
spis *p,*temp;
charf[20]; // строка для удаляемой фамилии
cout<< "Фамилия: "; cin>>f;
p=head; // голова списка
while (p!=NULL) {
if (strcmp((p->fam),f)==0) {// если найдена заданная фамилия
if (p==head) { // если найденная запись - первая
head=p->next;
head->pred=NULL;
free(p);
p=head; }
elseif (p==tail) { // если найденная запись - последняя
tail=p->pred;
tail->next=NULL;
free(p);
p=tail; }
else { // удаление из середины списка
p->next->pred=p->pred;
p->pred->next=p->next;
temp=p;
p=p->next;
free(temp); } }
else // если заданная фамилия не найдена – продвигаемся по списку
p=p->next; }
}

void add(void) {
spis *p, *pn;
intx = 0; // условие выхода из while
pn=(spis *)malloc(sizeof(spis));
cout<< "Фамилия: "; cin>>pn->fam;
cout<< "Год: "; cin>>pn->yyyy;
p = head;
while (p!=NULL&&x==0) { // ищем первую фамилию, у которой первый символ
if ((p->fam[0]) > (pn->fam[0])) // больше, чем у нового элемента
x=1;
else
p=p->next; }; // продвигаемся по списку
if (p==head) { // если найденная запись - первая
pn->pred=NULL;
pn->next=p;
p->pred=pn;
head=pn; }
else {
if (p==NULL) { // если все элементы перебрали
pn->pred=tail;
pn->next=NULL;
tail->next=pn;
tail=pn; }
else { // добавление в середину списка
pn->pred=p->pred;
pn->next=p;
p->pred->next=pn;
p->pred=pn; }
}
}
1 | Автор: StudentUstal | 2012-12-13, 12:44   |  Репутация: [ + 0 ]
  • Страница 1 из 1
  • 1
Поиск: