Здравствуйте. Программа работает с двусвязным списком. Функция Search должна перемещать элемент на n позиций назад. Она работает только, если элемент перемещается в середину (т.е. не на первое место и не на последнее). Подскажите как написать правильно функцию Search
Код:
#include <stdlib.h>
#include <stdio.h>
struct student
{
char name[20];
char sort[20];
int count;
struct post
{
char name[20];
char addres[20];
char tel[20];
}postavka;
};
struct List // Элемент списка
{
struct student element;
struct List *next, *prev;
};
struct List *add(struct List *end)
{
struct List *new;
new = malloc(sizeof(struct List));
printf("Наименование овощи : ");
scanf("%15s", new->element.name);
printf("сорт овощи: ");
scanf("%s", &new->element.sort);
printf("Количество: ");
scanf("%d", &new->element.count);
printf("Название поставщика: ");
scanf("%s", &new->element.postavka.name);
printf("Адрес поставщика: ");
scanf("%s", &new->element.postavka.addres);
printf("Телефон поставщика: ");
scanf("%s", &new->element.postavka.tel);
new->next = NULL;
new->prev = end;
if (end != NULL) end->next = new;
return new;
}
void ShowList(struct List *fs)
{
int k = 0;
struct List *ls = NULL;
if (fs == NULL) puts("List is empty");
puts("| N | Название | Сорт | Количество | Назв. пос. | Адрес пост.| Тел. пост.|");
puts("|___|____________|__________|____________|____________|____________|___________|");
ls = fs;
while (ls != NULL)
{
printf("|%-3d|%-12s|%-10s|%-12d|%-12s|%-12s|%-11s\n", ++k, ls->element.name, ls->element.sort, ls->element.count, ls->element.postavka.name, ls->element.postavka.addres, ls->element.postavka.tel);
puts("|___|____________|__________|____________|____________|____________|___________|");
ls = ls->next;
}
}
void Search(struct List *fs, int count)
{
struct List *fsearch = NULL,*fcur=NULL;
if (fs == NULL)
{
printf("Список пуст!"); return;
}
fsearch = fs;
int max = 0, k = 0,n,N;
printf("Какой элемент будем переносить? ");
scanf("%d", &N);
printf("Введите n: ");
scanf("%d", &n);
if (n > count)
{
printf("Элемента с таким номером не существует!");
return;
}
while (fsearch != NULL)
{
if (k == N-1 ) break;//добрались до элемента N
fsearch = fsearch->next;
k++;
}
fsearch->prev->next = fsearch->next;
fsearch->next->prev = fsearch->prev;
//переместимся на n позиций назад
k = 0;
fcur = fsearch;
while (fsearch != NULL)
{
if (k == n) break; //дошли до элемента перед которым будем вставлять элемент N
fcur = fcur->prev;
k++;
}
//перенастроим указатели
fsearch->next = fcur;
fsearch->prev = fcur->prev;
fcur->prev->next = fsearch;
fcur->prev = fsearch;
}
int main(int argc, char *argv[])
{
struct List *fcur = NULL, *fstart = NULL, *fend = NULL;
char menu, file[50], s;
int ball, count = 0, k;
do
{
system("cls");
puts("1.Добавить запись");
puts("2.Просмотр списка");
puts("3.Перемещение элемента с текущей позиции на n позиций назад по списку");
puts("4.Выход");
menu = getchar();
switch (menu)
{
case '1': system("cls");
if ((fcur = add(fend)) != NULL)
{
fend = fcur;
if (fstart == NULL)
fstart = fend;
count++;
}
else puts("Запись не добавлена");
system("pause");
break;
case '2': system("cls");
ShowList(fstart);
system("pause");
break;
case '3': //поиск
Search(fstart, count);
case '4': system("cls");
}
} while (menu != '4');
system("cls");
while (fstart != NULL){
fcur = fstart->next;
free(fstart);
fstart = fcur;
}
system("PAUSE");
return 0;
}