Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <locale.h>
- typedef struct sp
- {
- char name[20];
- char model[20];
- char color[15];
- char power[6];
- char year[5];
- struct sp *next;
- }l_t;
- typedef struct list
- {
- char name[20];
- char model[20];
- char color[15];
- char power[6];
- char year[5];
- struct list *next;
- struct list *prior;
- }list_t;
- list_t *newBegin;
- list_t *newLast;
- list_t *find(char *);
- list_t *twoBegin; // преобразованный двусвязный список
- list_t *twoLast;
- l_t *oldBegin;
- l_t *oldLast;
- //ввод одного поля в элемент списка
- void inputs(char *prompt, char *s, int count)
- {
- char p[255];
- do
- {
- printf(prompt);
- fgets(p, 254, stdin);
- if(strlen(p) > count)
- printf("\nСлишком длинная строка\n");
- }
- while(strlen(p) > count);
- p[strlen(p)-1] = '\0'; /* удалить символ перевода строки */
- strcpy(s, p);
- }
- //добавление элемента в двусвязный список по алфавиту
- void dls_store(list_t *newEl, list_t **newBegin, list_t **newLast)
- {
- list_t *old, *p;
- if(*newLast==NULL)
- { /* первый элемент списка */
- newEl->next = NULL;
- newEl->prior = NULL;
- *newLast = newEl;
- *newBegin = newEl;
- return;
- }
- p = *newBegin; /* начать с начала списка */
- old = NULL;
- while(p!=NULL)
- {
- if(strcmp(p->name, newEl->name)<0)
- {
- old = p;
- p = p->next;
- }
- else
- {
- if(p->prior)
- {
- p->prior->next = newEl;
- newEl->next = p;
- newEl->prior = p->prior;
- p->prior = newEl;
- return;
- }
- newEl->next = p; /* новый первый элемент */
- newEl->prior = NULL;
- p->prior = newEl;
- *newBegin = newEl;
- return;
- }
- }
- old->next = newEl; /* вставка в конец */
- newEl->next = NULL;
- newEl->prior = old;
- *newLast = newEl;
- }
- //void dlstore(l_t *newEl, list_t **newLast)
- //{
- //
- // if(*newLast==NULL)
- // *newLast = newEl; /* вставка первого элемента */
- // else
- // (*newLast)->next = newEl;
- // newEl->next = NULL;
- // newEl->prior = *newLast;
- // *newLast = newEl;
- //}
- //ввод двусвязного списка
- void enter(void)
- {
- list_t *info;
- int i, n;
- puts("Введите количество элементов");
- scanf("%d", &n);
- getchar();
- for(i=0;i<n;i++)
- {
- info = (list_t*)malloc(sizeof(list_t)+sizeof(char)*62);
- if(info==NULL)
- {
- printf("\nОшибка выделения памяти");
- return;
- }
- inputs("Введите марку: ", info->name, 20);
- inputs("Введите модель: ", info->model, 20);
- inputs("Введите цвет: ", info->color, 15);
- inputs("Введите мощность: ", info->power, 6);
- inputs("Введите год выпуска: ", info->year, 5);
- dls_store(info, &newBegin, &newLast);
- }
- }
- int menu_select(void)
- {
- char s[80];
- int c;
- printf("1. Ввод имени\n");
- printf("2. Удаление имени\n");
- printf("3. Отображение содержимого списка\n");
- printf("4. Поиск\n");
- printf("5. Сохранить в файл\n");
- printf("6. Загрузить из файла\n");
- printf("7. Ввести односвязный список\n");
- printf("8. Вывести односвязный список\n");
- printf("9. Преобразовать в двусвязный список\n");
- printf("0. Выход\n");
- do
- {
- printf("\nВаш выбор: ");
- gets(s);
- c = atoi(s);
- } while(c<0 || c>9);
- return c;
- }
- void mldelete(list_t **start, list_t **last)
- {
- list_t *info;
- char s[80];
- inputs("Введите имя: ", s, 30);
- info = find(s);
- if(info!=NULL)
- {
- if(*start==info)
- {
- *start=info->next;
- if(*start) (*start)->prior = NULL;
- else *last = NULL;
- }
- else
- {
- info->prior->next = info->next;
- if(info!=*last)
- info->next->prior = info->prior;
- else
- *last = info->prior;
- }
- free(info); /* освободить память */
- }
- }
- list_t *find( char *name)
- {
- list_t *info;
- info = newBegin;
- while(info!=NULL)
- {
- if((strcmp(name, info->name))==0)
- return info;
- info = info->next;
- }
- printf("Имя не найдено.\n");
- return NULL;
- }
- void display(list_t *info)
- {
- printf("%s\n", info->name);
- printf("%s\n", info->model);
- printf("%s\n", info->color);
- printf("%s\n", info->power);
- printf("%s\n", info->year);
- printf("\n\n");
- }
- void list()
- {
- list_t *info;
- info = newBegin;
- while(info!=NULL)
- {
- display(info);
- info = info->next; /* перейти к следующему адресу */
- }
- printf("\n\n");
- }
- void search(void)
- {
- char name[40];
- list_t *info;
- printf("Введите имя: ");
- gets(name);
- info = find(name);
- if(info==NULL)
- printf("Не найдено\n");
- else
- display(info);
- }
- void save(void)
- {
- list_t *info;
- FILE *fp;
- fp = fopen("list.txt", "wb");
- if(fp==NULL)
- {
- printf("Невозможно открыть файл.\n");
- exit(1);
- }
- printf("\nСохранение в файл\n");
- info = newBegin;
- while(info!=NULL)
- {
- fwrite(info, sizeof(list_t), 1, fp);
- info = info->next; /* перейти к следующему адресу */
- }
- fclose(fp);
- }
- void load()
- {
- list_t *info;
- FILE *fp;
- fp = fopen("list.txt", "rb");
- if(fp==NULL)
- {
- printf("Невозможно открыть файл.\n");
- exit(1);
- }
- /* освободить память, если в памяти уже есть список */
- while(newBegin!=NULL)
- {
- info = newBegin->next;
- free(info);
- newBegin = info;
- }
- /* сбросить указатели на начало и конец */
- newBegin = newLast = NULL;
- printf("\nЗагрузка из файла\n");
- while(!feof(fp))
- {
- info = (list_t*) malloc(sizeof(list_t));
- if(info==NULL)
- {
- printf("Нет свободной памяти");
- return;
- }
- if(1 != fread(info, sizeof(list_t), 1, fp))
- break;
- dls_store(info, &newBegin, &newLast);
- }
- fclose(fp);
- }
- //сортировка односвязного списка
- void dls_store_od(l_t *newEl, l_t **oldBegin, l_t **oldLast)
- {
- l_t *p, *old;
- if(*oldLast==NULL)
- { /* первый элемент списка */
- newEl->next = NULL;
- //newEl->prior = NULL;
- *oldLast = newEl;
- *oldBegin = newEl;
- return;
- }
- p = *oldBegin; /* начать с начала списка */
- old = NULL;
- while(p!=NULL)
- {
- if(strcmp(p->name, newEl->name)<0)
- {
- old = p;
- p = p->next;
- }
- else
- {
- if(old)
- {
- old->next = newEl;
- newEl->next = p;
- return;
- }
- newEl->next = p; /* новый первый элемент */
- old = newEl;
- *oldBegin = newEl;
- return;
- }
- }
- old->next = newEl; /* вставка в конец */
- newEl->next = NULL;
- //newEl->prior = old;
- *oldLast = newEl;
- }
- void enter_od(void)
- {
- l_t *info;
- int i, n;
- puts("Введите количество элементов");
- scanf("%d", &n);
- getchar();
- for(i=0;i<n;i++)
- {
- info = (l_t*)malloc(sizeof(l_t)+sizeof(char)*62);
- if(info==NULL)
- {
- printf("\nНет свободной памяти");
- return;
- }
- inputs("Введите марку: ", info->name, 20);
- inputs("Введите модель: ", info->model, 20);
- inputs("Введите цвет: ", info->color, 15);
- inputs("Введите мощность: ", info->power, 6);
- inputs("Введите год выпуска: ", info->year, 5);
- dls_store_od(info, &oldBegin, &oldLast);
- }
- }
- void list_od()
- {
- l_t *info;
- info = oldBegin;
- while(info)
- {
- //display(info);
- printf("%s\n", info->name);
- printf("%s\n", info->model);
- printf("%s\n", info->color);
- printf("%s\n", info->power);
- printf("%s\n", info->year);
- printf("\n\n");
- info = info->next; /* перейти к следующему адресу */
- }
- printf("\n\n");
- }
- //l_t* new_list(int exc)
- //{
- // list_t *info;// *newEl;
- // l_t *newEl;
- // while(newBegin!=NULL)
- // {
- // info = newBegin->next;
- // free(info);
- // newBegin = info;
- // }
- // int i = 1;
- // newEl = info;
- // while (oldBegin != NULL)
- // {
- // if(i++ ==exc)
- // oldBegin = oldBegin->next;
- // else
- // {
- // dlstore(newEL, newLast);
- // oldBegin = oldBegin->next;
- // }
- //
- // }
- // return newBegin;
- //}
- //преобразуем элемент односвязного списка в двусвязный
- list_t *prisv(l_t *stp,l_t *left, l_t *right)
- {
- list_t *tm;
- tm = (list_t*)malloc(sizeof(list_t));
- strcpy(tm->name, stp->name);
- strcpy(tm->color, stp->color);
- strcpy(tm->power, stp->power);
- strcpy(tm->year, stp->year);
- strcpy(tm->model, stp->model);
- tm->prior = left;
- tm->next = right;
- free(stp);
- return tm;
- }
- //вывод преобразованного двусвязного списка
- void print_two_sp()
- {
- list_t *t = twoBegin;
- while (t != NULL)
- {
- display(t);
- t = t->next;
- }
- }
- //перевод односвязного списка в двухсвязный
- void transfer()
- {
- if (oldLast == NULL)
- {
- puts("Нет односвязного списка");
- return;
- }
- l_t *p = oldBegin->next;
- twoLast = prisv(oldBegin, oldBegin->next, NULL);
- list_t *l = twoLast, *tmp;
- while (p->next != NULL )
- {
- tmp = l->prior;
- tmp = prisv(p, p->next, l);
- l = tmp;
- p = p->next;
- }
- twoBegin = prisv(p, NULL, l);
- printf("Преобразование завершено успешно\n");
- print_two_sp();
- return;
- }
- int main(void)
- {
- setlocale(LC_CTYPE,"Russian");
- newLast = newBegin = NULL;
- oldBegin = oldLast = NULL;
- for(;;)
- {
- switch(menu_select())
- {
- case 1:
- enter();
- break;
- case 2:
- mldelete(&newBegin, &newLast);
- break;
- case 3:
- list();
- break;
- case 4:
- search();
- break;
- case 5:
- save();
- break;
- case 6:
- load();
- break;
- case 7:
- enter_od();
- break;
- case 8:
- list_od();
- break;
- case 9:
- transfer();
- break;
- case 0:
- exit(0);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment