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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2009, 16:47   #1
ecokot
Новичок
Джуниор
 
Регистрация: 09.09.2009
Сообщений: 1
По умолчанию Двусвязные списки(Язык С)

Здравствуйте. Прошу помочь мне разобраться с задание. Мне дали задание разработать программу для создания и работы с двусвязным списком, состоящим из структур. Для работы со списком создать меню со следующими пунктами.
1. Создание списка.
2. Просмотр списка.
3. Добавление в конец списка новой структуры.
4. Корректировка списка.
5. Выход.

Четвертое задание у каждого свое.

мне надо: Структура содержит фамилию, год рождения. Добавлять новые записи так, чтобы список был упорядочен по возрасту.

Вопрос: Как это сделать? Я пробовал упорядочить и потом добавить, но у меня не получается упорядочить. Или может я не так задание понял?

Вот код того что я сделал.

Код:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>

struct spis
{  char fio[20],godr[4];

  struct spis *v1;
  struct spis *v2;
};

void create(void);
void list(spis*);
void dob(void);
void zadan(void);

struct spis *head, *tail;
spis *p;
char j[4];
j='9999';
main()
{

char c;
while (1)
{clrscr ();
 puts("1 - Создать список (10 записей)\n");
 puts("2 - Просмотреть  список\n");
 puts("3 - Добавить структуру в конец списка\n");
 puts("4 - Добавить структуру с упорядочиванием по возрасту\n");
 puts("0 - Выход");
 c=getch();
 switch(c)
 {
  case '1':create();break;
  case '2':list(head);break;
  case '3':dob();break;
  case '4':zadan();break;
  case '0': {free(head); return 0;}
  default: puts("Неверный режим");
 }
}
}

void create(void)
{spis *pred;
  pred=NULL;
  do { p=(spis *)malloc(sizeof(spis));
    printf("Фамилия: ");
    scanf("%s",p->fio);
    printf("Год рождения");
    scanf("%s",p->godr);
    p->v1=pred;
    if (pred != NULL)
      pred->v2=p;
    else
      head=p;
    pred=p;
    puts(" завершить - <esc>");
}
while (getch()!=27);
  tail=p;
  tail->v2=NULL;
}
void list (spis *p)
{
clrscr();
while (p!=NULL)
    { printf("%20s %4s \n",p->fio,p->godr);
    p=p->v2;
    }
getch();
}
void dob(void)
{clrscr();
  spis *pn;
  pn=(spis *)malloc(sizeof(spis));
  printf("Фамилия: ");
  scanf("%s",pn->fio);
  printf("Год рождения");
  scanf("%s",pn->godr);
  pn->v1=tail;
  pn->v2=NULL;
  p->v2=pn;
  tail=pn;
}
void zadan (void)
{spis p1;
char i[4];
clrscr();


while (p!=NULL)
    {

      




    }
getch();
}
ecokot вне форума Ответить с цитированием
Старый 10.09.2009, 11:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я пробовал упорядочить и потом добавить, но у меня не получается упорядочить.
Я бы на твоем месте при добавлении вставлял в позицию первого максимального элемента.

Меня эта темка заинтересовала, поскольку я и сам Сю сейчас непрочь порулить. Так вот я тут сделал набросок своей идеи, и вот что получилось:
Код:
//---------------------------------------------------------------------------

#pragma hdrstop

#include <tchar.h>
#include <iostream.h>
//---------------------------------------------------------------------------

#pragma argsused
struct spis{ int i; struct spis *prev, *next;};
struct spis *first,*endspis;
//***** Находим минимальный с верху***********************************
spis *findmin(int per){
 spis *i=first;
 for ( ;i!=NULL; i=i->next){
  if (i->i<=per) {
   return i;
  }
 }
if (i==NULL) {return NULL;}
if (i->i=per) return i;
}
//***** Вставляем с сортировкой***********************************
void addsp(int s){
  if (first==NULL) {
   first=new spis;
   first->i=s;  first->prev=NULL;
   endspis=first;
  } else {
   spis *j=new spis;
   j->i=s;
   spis *mx=findmin(s);
   if (mx==NULL) {
	j->prev=endspis;
	endspis->next=j;
	endspis=j;
   } else {
	if (mx!=first) {
	 mx->prev->next=j;
	} else {j->prev=NULL; first=j;}
	 j->next=mx;
	 mx->prev=j;
   }
  }
}
//*** Выводим список на экран *************************************
void wri(spis *q=NULL){
 if (q==NULL) {
  for (spis *i = first; i!=NULL; i=i->next) {
   cout<<i->i<<"\n";
  }
 } else {
   cout<<q->i<<"\n";
 }
}

int _tmain(int argc, _TCHAR* argv[])
{
 first=NULL;
 addsp(0);
 addsp(10);
 addsp(26);
 addsp(3);
 addsp(2);
 addsp(8);
 wri();
 cin.get();
	return 0;
}
//---------------------------------------------------------------------------
Тут есть пара багов, так что код требует поправки, и я не уверен что он оптимален.
I'm learning to live...

Последний раз редактировалось Stilet; 10.09.2009 в 11:59.
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
двусвязные списки ai\ekcah^p Общие вопросы C/C++ 11 06.06.2009 19:13
Двусвязные списки Serp Помощь студентам 3 14.04.2009 16:13
Динамичесие списки. Язык Си. Bo2nik Помощь студентам 3 04.04.2008 20:56