Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2010, 19:20   #1
klykovka
Пользователь
 
Регистрация: 14.04.2010
Сообщений: 33
По умолчанию двусвязный список

разработать программу для создания и работы с двусвязным списком, состоящим из структур. для работы со списком создать меню со следующими пунктами:
1. Создание списка.
2. Просмотр списка.
3. Добавление в конец списка новой структуры.
4. Корректировка списка.
5. Выход.
Структура содержит название книги, автора, год издания. п4.- Удалить издания с годом меньше заданного.
Код:
//============================/////////=====
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <io.h>

//=============================//////=====

struct Book
{
  char nazv[10];
  char avtor[20];
  int godizd;
  Book* next;
  Book* prev;
};

struct list
{
  Book* first;
  Book* last;
};

void menu();
void addBook(list&);
void delBook(list&);
void printlist(list*);
void createlist(list*&);
list* thelist=0;

int main()
{
list* first=0;
list* last=0;

menu();
getche();
return 0;
}
void menu()
{char quit;
enum{false,true);
 quit = false;
while(true)
 {
 int choice;
 printf("\n -----MENU-----\n");
 printf("(1) vvedite spisok \n");
 printf("(2) prosmotr \n");
 printf("(3) dobavlenie \n");
 printf("(4) ydalenie \n");
 printf("(5) exit \n");

 scanf("%d", &choice);

 switch (choice)
 {
 case(1): if (!thelist)
 {
  createlist(thelist );
    printf(" the list has been created succesfully... \n");
        }
        else
            printf(" the list is already created...\n" );
        break;
    case(2):
        if (thelist)
            printlist(thelist);
        else
            printf(" the list is not created...\n");
        break;
    case(3):
        if (thelist)
            addBook(*thelist);
        else
            printf(" the list is not created...\n");
        break;
    case 4:
        if (thelist)
            delBook(*thelist);
        else
            printf(" the list is not created... \n");
        break;
    case(5):
        quit = true;
    }
    if (quit == true)
        break;
    }
}
//==============================/////////====

void addBook(list& thelist)
{
    printf("\n *** dobavit' novuy knigy *** \n");
    printf(" vvedite nazvanie: ");
    Book* newBook = new Book;
    scanf("%s",&newBook->nazv);
    printf(" vvedite avtora: ");
    scanf("%s",&newBook->avtor);
    printf(" vvedite god izdania: ");
    scanf("%d",&newBook->godizd);
    if (thelist.last)
    {
        thelist.last->next = newBook;
        newBook->prev = thelist.last;
    }
    else
    {
        thelist.first = newBook;
        newBook->prev = 0;
    }
    thelist.last = newBook;
    newBook->next = 0;
    printf("*** book was added successfully *** \n");
}

//=======================================///////////////======
void createlist (list*& thelist)
{
   thelist = new list;
   thelist->first = NULL;
   thelist->last = NULL;
   Book *p,*k=NULL;

   do
    {
    p = new Book;
  printf( "*** vvedite knigy *** \n");
  printf(" vvedite nazv: ");
  scanf("%s", &p->nazv);
  printf( " vvedite avtora: " );
  scanf("%s", &p->avtor);
  printf(" vvedite god izdania: ");
  scanf( "%d",&p->godizd);

    if(thelist->first==NULL) thelist->first = p;

    p->next = NULL;
    if(k)
     {
      p->prev = k;
      k->next = p;
     }
     else
      {
       p->prev = NULL;
      }

    k = p;

    puts(" Zakonchit' - <esc>");
    }
 while (getch()!=27);

    thelist->last=p;
}

//=======================================================///////////====
void printlist(list* thelist)
{
    printf("\n *** prosmotr knig *** \n");
    Book* curBook = thelist->first;
    while (curBook)
    {
       // printf("%s\n",curBook->nazv);
      //  printf("%s\n",&curBook->avtor);
       // printf("%d\n",&curBook->godizd);
      //  curBook = curBook->next;
     printf("\n   %s   %s   %d ",curBook->nazv,curBook->avtor,curBook->godizd);
      curBook = curBook->next;
    }
    printf("\n *** end *** \n" );
}

//===============================================//
void delBook(list& thelist)
{
    Book* curBook = thelist.first;
    int Pos;
    printf( " Enter the godizdania for deleted Book: \n");
    scanf("%d",&Pos);
    printf("%d",Pos);
    for (int i=0; i<Pos ; i++)
    {
        if (curBook)
            curBook = curBook->next;
    }
    if (curBook && (Pos >= 0))
    {
        if (curBook->prev)
        {
            curBook->prev->next = curBook->next;
        }
        else
        {
            thelist.first = curBook->next;
        }
        if (curBook->next)
        {
            curBook->next->prev = curBook->prev;
        }
        else
        {
            thelist.last = curBook->prev;
        }
        delete curBook;
        printf("Book ? ", Pos ," has been deleted successfully..." );
    }
    else
        printf("Book ? ", Pos , " not found..." );

}
Помогите исправить ошибки и устранить недочеты

Последний раз редактировалось klykovka; 04.05.2010 в 15:42.
klykovka вне форума Ответить с цитированием
Старый 04.05.2010, 15:43   #2
klykovka
Пользователь
 
Регистрация: 14.04.2010
Сообщений: 33
По умолчанию

не могу разобраться с пунктом удаление, подскажите.
klykovka вне форума Ответить с цитированием
Старый 04.05.2010, 15:45   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

удаление всего списка или конкретного элемента?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 04.05.2010, 15:56   #4
klykovka
Пользователь
 
Регистрация: 14.04.2010
Сообщений: 33
По умолчанию

Удалить издания с годом меньше заданного.
klykovka вне форума Ответить с цитированием
Старый 04.05.2010, 16:00   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

давай я скину удаление элементов больше заданного из любого места списка, а там адаптируешь под себя
Код:
procedure ListCont.RemoveAll(var start:PList;x:integer);  //процедру удления элементов больших по значению(информационное поле)
//если такого значения инф поля нет то список оставлять таким?
var
  p,q,t:PList;
begin
  p:=first;
  t:=GetByValue(x);
  if t=nil then writeln('element not find')
  else
  begin
    while (p<>nil) do
    begin
      if p^.inf > x then 
      begin //нашли нужные значения
        if p = first then
        begin //если удаляем первый элемент
          first := p^.next; //то редактируем указатель начала
          first^.prior := nil;
          //удалить
        end
        else
        if p^.next = nil then p^.prior^.next := nil
        else//если последний, то редактируем предпоследний
        begin //если где-то в середине
          p^.prior^.next := p^.next;//редактируем
          p^.next^.prior := p^.prior;//соседнии элементы
        end;
        q := p; //указатель на удаляемый элемент
        p := p^.next;
        dispose(q);//удаляем
        continue
    end;
    p:=p^.next;
  end;
  end;
end;
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 04.05.2010, 17:23   #6
klykovka
Пользователь
 
Регистрация: 14.04.2010
Сообщений: 33
По умолчанию

спасибо! буду пробовать.
klykovka вне форума Ответить с цитированием
Старый 04.05.2010, 18:26   #7
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

будут вопросы пиши
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 04.05.2010, 19:42   #8
klykovka
Пользователь
 
Регистрация: 14.04.2010
Сообщений: 33
По умолчанию

после ввода года выпуска открыть цикл while до конца списка. в нем сравниваем текущее изд. с введенным изданием? Как то так?
klykovka вне форума Ответить с цитированием
Старый 22.05.2010, 18:58   #9
klykovka
Пользователь
 
Регистрация: 14.04.2010
Сообщений: 33
По умолчанию

Код:
//============================/////////============================
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <io.h>

//=============================//////===============================

struct Book
{
  char nazv[10];
  char avtor[20];
  int godizd;
  Book* next;
  Book* prev;
};

struct list
{
  Book* first;
  Book* last;
};

void menu();
void addBook(list&);
void delBook(list&);
void printlist(list*);
void createlist(list*&);
list* thelist=0;

int main()
{


menu();
getch();
return 0;
}
void menu()
{ char quit;
enum{false,true};
 quit = false;
while(true)
 {
 int choice;
 printf("\n -----MENU-----\n");
 printf("(1) vvedite spisok \n");
 printf("(2) prosmotr \n");
 printf("(3) dobavlenie \n");
 printf("(4) ydalenie \n");
 printf("(5) exit \n");

 scanf("%d", &choice);

 switch (choice)
 {
 case(1): if (!thelist)
 {
  createlist(thelist );
    printf(" the list has been created succesfully... \n");
        }
        else
            printf(" the list is already created...\n" );
        break;
    case(2):
        if (thelist)
            printlist(thelist);
        else
            printf(" the list is not created...\n");
        break;
    case(3):
        if (thelist)
            addBook(*thelist);
        else
            printf(" the list is not created...\n");
        break;
    case 4:
        if (thelist)
            delBook(*thelist);
        else
            printf(" the list is not created... \n");
        break;
    case(5):
        quit = true;
    }
    if (quit == true)
        break;
    }
}
//==============================/////////===================================

void addBook(list& thelist)
{
    printf("\n *** dobavit' novuy knigy *** \n");
    printf(" vvedite nazvanie: ");
    Book* newBook = new Book;
    scanf("%s",&newBook->nazv);
    printf(" vvedite avtora: ");
    scanf("%s",&newBook->avtor);
    printf(" vvedite god izdania: ");
    scanf("%d",&newBook->godizd);
    if (thelist.last)
    {
        thelist.last->next = newBook;
        newBook->prev = thelist.last;
    }
    else
    {
        thelist.first = newBook;
        newBook->prev = 0;
    }
    thelist.last = newBook;
    newBook->next = 0;
    printf("*** book was added successfully *** \n");
}

//=======================================///////////////==========================
void createlist (list*& thelist)
{
   thelist = new list;
   thelist->first = NULL;
   thelist->last = NULL;
   Book *p,*k=NULL;

   do
    {
    p = new Book;
  printf( "*** vvedite knigy *** \n");
  printf(" vvedite nazv: ");
  scanf("%s", &p->nazv);
  printf( " vvedite avtora: " );
  scanf("%s", &p->avtor);
  printf(" vvedite god izdania: ");
  scanf( "%d",&p->godizd);

    if(thelist->first==NULL) thelist->first = p;

    p->next = NULL;
    if(k)
     {
      p->prev = k;
      k->next = p;
     }
     else
      {
       p->prev = NULL;
      }

    k = p;

    puts(" Zakonchit' - <esc>");
    }
 while (getch()!=27);

    thelist->last=p;
}

//=======================================================///////////============================
void printlist(list* thelist)
{
    printf("\n *** prosmotr knig *** \n");
    Book* curBook = thelist->first;
    while (curBook)
    {
       // printf("%s\n",curBook->nazv);
      //  printf("%s\n",&curBook->avtor);
       // printf("%d\n",&curBook->godizd);
      //  curBook = curBook->next;
     printf("\n   %s   %s   %d ",curBook->nazv,curBook->avtor,curBook->godizd);
      curBook = curBook->next;
    }
    printf("\n *** end *** \n" );
}

//=================//======================//=======================//
void delBook(list& thelist)
{Book* cur=thelist.first;
	Book* temp;
	int year;
	cur =thelist. first;

	printf( " Enter the godizdania for deleted Book: \n");
        scanf("%d",&year);

	while (cur != NULL) {
		if(cur->godizd < year) {
			if (cur->prev == NULL) {	//если удаляем первый элемент
				thelist.first = cur->next;	//первым будет второй элемент в списке
                                thelist.first->prev = NULL;
				free(cur);	//высвободили память
				cur = thelist.first;	//перевели указатель на второй элемент
			}else {//если элемент не первый
				temp = cur;
				cur->prev->next = cur->next;	//с предыдущего элемета указали на последующий
				cur->next->prev = cur->prev;	//со следующего элнемента указали на предыдущий
				cur= cur->prev; //текущий будет тот, который стоит перед удаляемым
				free(temp);
			}
		} else cur = cur->next;	
	}
После выбора пункта меню все идет сплошным текстом в одном и том же окне. как исправить?
klykovka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать двусвязный список "POSTAL" Помощь студентам 1 21.04.2010 02:04
Двусвязный список kruserg Паскаль, Turbo Pascal, PascalABC.NET 1 28.04.2009 10:37