Структура содержит фамилию, год рождения. Добавлять новые записи так, чтобы список был упорядочен по алфавиту. Есть в С++ нужно написать в Си
#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; } } }
|
|
|