Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамичная память, помощь :(, стопка, LIFO. last input first output 
:(
    Опции темы
VitaL
  Дата 24.6.2006, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 24.6.2006

Репутация: нет
Всего: нет



Ребята, помогите неграмотному оболтусу  smile 

програма сохраняет структуру в разных адресах памяти, "сохраняет" и показывает потом всё введённые структуры. Проблема в том что прога не показывает всё введённые структуры, а только последнию. 
Думаю правильно объяснил мою проблему   smile 

Код

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>


struct datos
    {
    long int legajo;
      char nom[20];
    };
struct nodo
    {
    struct datos info;
    struct nodo * sigui;
   };

//compruebo que el nodo este vacio
int nodo_vacio(struct nodo *q)
    {
    int x=0;
      if(!q)x=1;
      return (x);
   }

//compruebo si el nodo esta lleno
struct nodo * nodo_lleno()
    {
    struct nodo * q;
      q=(struct nodo *)malloc(sizeof(struct nodo));
      return (q);
   }

//creo la pila
struct nodo * insertar(struct nodo * q, struct datos x)
    {
    struct nodo * nuevo;
      if((nuevo=nodo_lleno())==NULL)printf("Nodo lleno\n");
      else
       {
          nuevo->info=x;
            if(nodo_vacio(q))nuevo->sigui=q;
            q=nuevo;
         }
      return (q);
   }

//muestro la pila armada
void listar(struct nodo * q)
    {
   if(nodo_vacio(q))printf("Nodo vacio\n");
   else
    {
         while(q!=NULL)
          {
             printf("legajo: %ld\nNombre: %s",q->info.legajo,q->info.nom);
               q=q->sigui;
            }
      }
    }


void main()
{
struct nodo * pila=NULL;
struct datos x;
printf("Ingrese legajo (0 para finalizar): ");fflush(stdin);scanf("%ld",&x.legajo);
while(x.legajo!=0)
    {
    printf("Ingrese nombre: ");fflush(stdin);gets(x.nom);
      pila=insertar(pila,x);
      printf("Ingrese legajo (0 para finalizar): ");fflush(stdin);scanf("%ld",&x.legajo);
   }

listar(pila);

getch();
}
   

Это сообщение отредактировал(а) VitaL - 24.6.2006, 06:00
PM MAIL WWW Skype   Вверх
Fazil6
Дата 24.6.2006, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Код

#include <string.h>

...

struct datos info;

какой у тебя компилятор?

насколько я разбираюсь в медицине у тебя не будет запоминаться следующий элемент при вставке, потому, что проверка будет возвращать 0 для всех вставок после первой вот здесь
Код

struct nodo * insertar(struct nodo * q, struct datos x)    
    {    
    struct nodo * nuevo;    
      if((nuevo=nodo_lleno())==NULL)printf("Nodo lleno\n");    
      else    
       {    
          nuevo->info=x;    
            if(nodo_vacio(q))nuevo->sigui=q;  // проверка не проходит и присваивания нет     
            q=nuevo;    
         }    
      return (q);    
   }
 
PM MAIL   Вверх
AlanG
Дата 24.6.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



offtop
Приколный код smile .
Разбирал с удовольствие, аж 30 мин. smile 
Вопросик: А как у тебя сохраняются все адреса в адресной переменной sigui? С помощю чего,
ведь у тебя при каждом вызове insertar создается новая адресная переменная struct nodo * q; которая используется в дальнейшем? Может создается какойто стек? 

 
PM MAIL   Вверх
VitaL
Дата 24.6.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 24.6.2006

Репутация: нет
Всего: нет



Юзаю Borland C++ 5.02.

Можете помоч исправить ошибку плз smile

Добавлено @ 15:10 
Цитата(AlanG @ 24.6.2006,  15:05)
offtop
Приколный код smile .
Разбирал с удовольствие, аж 30 мин. smile 
Вопросик: А как у тебя сохраняются все адреса в адресной переменной sigui? С помощю чего,
ведь у тебя при каждом вызове insertar создается новая адресная переменная struct nodo * q; которая используется в дальнейшем? Может создается какойто стек?

я сам в этой теме не очень разбираюсь, этот пример дал учитель, дело в том, что в каждой структире сохраняется адрес предедущей введённой стректуры, а в первой введённой структуре, в  ячейке адресов, сохраняется NULL    

Это сообщение отредактировал(а) VitaL - 24.6.2006, 15:12
PM MAIL WWW Skype   Вверх
Fazil6
Дата 24.6.2006, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



честно говоря я просмотрел довольно бегло. Мне вообще не совсем понятен смысл этой строки. Может это просто преподский подвох... убери проверку перед присваиванием и все должно по идее заработать.
Код

struct nodo * insertar(struct nodo * q, struct datos x)     
    {     
    struct nodo * nuevo;     
      if((nuevo=nodo_lleno())==NULL)printf("Nodo lleno\n");     
      else     
       {     
          nuevo->info=x;     
          /*  if(nodo_vacio(q)) */ nuevo->sigui=q;  // проверка не проходит и присваивания нет      
            q=nuevo;     
         }     
      return (q);     
   }

Добавлено @ 16:27 
Цитата

Вопросик: А как у тебя сохраняются все адреса в адресной переменной sigui? С помощю чего,
ведь у тебя при каждом вызове insertar создается новая адресная переменная struct nodo * q; которая используется в дальнейшем? Может создается какойто стек? 

это классическая реализация списка на С.

Добавлено @ 16:33 
все сохраняется как надо. Наверно 30мин. оказалось недостаточно  smile 

еще совет в функции вывода списка на экран я заменил бы строку формата, будет выводится красивее
Код

printf("legajo: %ld\nNombre: %s",q->info.legajo,q->info.nom);

на
Цитата

printf("legajo: %ld\n     Nombre: %s\n",q->info.legajo,q->info.nom);
  

Это сообщение отредактировал(а) Fazil6 - 24.6.2006, 16:37
PM MAIL   Вверх
VitaL
Дата 24.6.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 24.6.2006

Репутация: нет
Всего: нет



домой прийду поверю, если что отпишусь сново. Спасибо за помощь

Странно одно что учительская прога не рулит  smile  
PM MAIL WWW Skype   Вверх
VitaL
Дата 24.6.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 24.6.2006

Репутация: нет
Всего: нет



ага, работает smile  респект smile 

я в эту тему буду выкладывать другие типы динамичных паметей так как уверен что там тоже есть ошибки. надеюсь на вашу помощь smile  
PM MAIL WWW Skype   Вверх
VitaL
Дата 25.6.2006, 03:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 24.6.2006

Репутация: нет
Всего: нет



Динамичная память... 2 рабочии версии
last input first output

Код

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>


struct datos
    {
    long int legajo;
      char nom[20];
    };
struct nodo
    {
    struct datos info;
    struct nodo * sigui;
   };

//compruebo que el nodo este vacio
int nodo_vacio(struct nodo *q)
    {
    int x=0;
      if(!q)x=1;
      return (x);
   }

//compruebo si el nodo esta lleno
struct nodo * nodo_lleno()
    {
    struct nodo * q;
      q=(struct nodo *)malloc(sizeof(struct nodo));
      return (q);
   }

//creo la pila
struct nodo * insertar(struct nodo * q, struct datos x)
    {
    struct nodo * nuevo;
      if((nuevo=nodo_lleno())==NULL)printf("Nodo lleno\n");
      else
       {
          nuevo->info=x;
            /*if(nodo_vacio(q))*/nuevo->sigui=q;
            q=nuevo;
         }
      return (q);
   }

//muestro la pila armada
void listar(struct nodo * q)
    {
   if(nodo_vacio(q))printf("Nodo vacio\n");
   else
    {
         while(q!=NULL)
          {
             printf("legajo: %ld\tNombre: %s\n",q->info.legajo,q->info.nom);
               q=q->sigui;
            }
      }
    }
//eliminacion de nodo
struct nodo * eliminar(struct nodo * q)
    {
    struct nodo * aux=q;
      printf("**Elemino**\n");
      while (q!=NULL)
       {
          printf("legajo: %ld\tNombre: %s\n",q->info.legajo,q->info.nom);
           if(nodo_vacio(q))printf("Nodo vacio\n");
           else
               {
                  q=q->sigui;
                 free(aux);
               }
         }
      return (q);
   }

void main()
{
struct nodo * pila=NULL;
struct datos x;
printf("Ingrese legajo (0 para finalizar): ");fflush(stdin);scanf("%ld",&x.legajo);
while(x.legajo!=0)
    {
    printf("Ingrese nombre: ");fflush(stdin);gets(x.nom);
      pila=insertar(pila,x);
      printf("Ingrese legajo (0 para finalizar): ");fflush(stdin);scanf("%ld",&x.legajo);
   }

listar(pila);
//punto c
pila=eliminar(pila);
listar(pila);
getch();
}



first input first output

Код

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>


struct datos
    {
    long int legajo;
      char nom[20];
    };
struct nodo
    {
    struct datos info;
    struct nodo * sigui;
   };

//compruebo que el nodo este vacio
int nodo_vacio(struct nodo *q)
    {
    int x=0;
      if(!q)x=1;
      return (x);
   }

//compruebo si el nodo esta lleno
struct nodo * nodo_lleno()
    {
    struct nodo * q;
      q=(struct nodo *)malloc(sizeof(struct nodo));
      return (q);
   }

//creo la coala
struct nodo * insertar(struct nodo * q, struct datos x, struct nodo ** p)
    {
    struct nodo * nuevo;
      if((nuevo=nodo_lleno())==NULL)printf("Nodo lleno\n");
      else
       {
          nuevo->info=x;nuevo->sigui=NULL;
            if(q)q->sigui=nuevo;
            else *p=nuevo;
            q=nuevo;
         }
      return (q);
   }

//muestro la cola armada
void listar(struct nodo * q)
    {
   if(nodo_vacio(q))printf("Nodo vacio\n");
   else
    {
         while(q)
          {
             printf("legajo: %ld\tNombre: %s\n",q->info.legajo,q->info.nom);
               q=q->sigui;
            }
      }
    }



//eliminacion de nodo
struct nodo * eliminar(struct nodo * q, struct nodo **p)
    {
    struct nodo * aux=q;
      printf("**Elemino**\n");
      while (q!=NULL)
       {
              printf("legajo: %ld\tNombre: %s\n",q->info.legajo,q->info.nom);
           if(nodo_vacio(q))printf("Nodo lleno\n");
           else
               {
                  q=q->sigui;
                 if(q==NULL)*p=NULL;
                 free(aux);
                    }
         }
      return (q);
   }


void main()
{
struct nodo * prim=NULL, * ult=NULL;
struct datos x;
printf("Ingrese legajo (0 para finalizar): ");fflush(stdin);scanf("%ld",&x.legajo);
while(x.legajo!=0)
    {
    printf("Ingrese nombre: ");fflush(stdin);gets(x.nom);
      ult=insertar(ult,x,&prim);
      printf("Ingrese legajo (0 para finalizar): ");fflush(stdin);scanf("%ld",&x.legajo);
   }

listar(prim);
//punto c
prim=eliminar(prim,&ult);
listar(prim);
getch();
}

 
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.