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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2012, 17:17   #1
svkpro
Пользователь
 
Регистрация: 22.11.2012
Сообщений: 52
По умолчанию из структуры в стек С++

Здравствуйте всем. мне необходимо собрать стек из структуры которая приведена в коде ниже. обратится к одному полю не составляет труда а вот взять сразу все поля и добавить в стек как один элемент что то не получается(( помогите кто нить, пожалуйста.

#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;

typedef struct kniga {
char name[100];
char name1[100];
char name2[100];
struct kniga* next;
} Kniga;

Kniga* top = NULL;

void push(char* name)
{
Kniga* ptr = (Kniga *)malloc(sizeof(Kniga));
strcpy(ptr->name,name);
ptr->next = top;
top = ptr;
}

void pop()
{
if(top != NULL)
{
Kniga* ptr = top->next;
printf("%s - deleted\n",top->name);
free(top);
top = ptr;
}
}

void show_stack()
{
Kniga* ptr = top;
while(ptr != NULL)
{
printf("%s\n",ptr->name);
ptr = ptr->next;
}
}


int _tmain(int argc, _TCHAR* argv[])
{
char str[100];
for(int i = 0;i < 5;i++) {
sprintf(str,"Object %d",i+1);
push(str);
}
show_stack();
while(top != NULL) pop();
system("pause");
return 0;
}
заранее спасибо!

Последний раз редактировалось svkpro; 25.11.2012 в 18:06.
svkpro вне форума Ответить с цитированием
Старый 25.11.2012, 18:29   #2
Andrew1961
Новичок
Джуниор
 
Регистрация: 25.11.2012
Сообщений: 4
По умолчанию

Не понял - в функции push() через malloc Вы выделяете память под всю структуру kniga (через sizeof) поэтому в стек Вы можете заносить все поля через полученный ptr - Вы же заносите только первое поле. Ну, а в функции pop() получив ptr на всю структуру Вы можете выводить все поля - Вы же выводите только первое. Только должно быть так:

void push(char* name, char* name1, char* name2)
{
Kniga* ptr = (Kniga *)malloc(sizeof(Kniga));
strcpy(ptr->name,name);
strcpy(ptr->name1,name1);
strcpy(ptr->name2,name2);
ptr->next = top;
top = ptr;
}
Ну и соответственно:

void pop()
{
if(top != NULL)
{
Kniga* ptr = top->next;
printf("%s - deleted\n",top->name);
printf("%s - deleted\n",top->name1);
printf("%s - deleted\n",top->name2);
free(top);
top = ptr;
}
}

Ну и естественно push должна вызываться с тремя аргументами.
Andrew1961 вне форума Ответить с цитированием
Старый 25.11.2012, 18:36   #3
Andrew1961
Новичок
Джуниор
 
Регистрация: 25.11.2012
Сообщений: 4
По умолчанию

Не забудьте изменить _tmain().

Последний раз редактировалось Andrew1961; 25.11.2012 в 18:40.
Andrew1961 вне форума Ответить с цитированием
Старый 25.11.2012, 19:36   #4
svkpro
Пользователь
 
Регистрация: 22.11.2012
Сообщений: 52
По умолчанию

большое спасибо!
svkpro вне форума Ответить с цитированием
Старый 25.11.2012, 21:46   #5
svkpro
Пользователь
 
Регистрация: 22.11.2012
Сообщений: 52
По умолчанию

всем огромное спасибо! я понял в чем дело. если кому интересно вот рабочий код:

#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;

typedef struct kniga {
char shifr[10];
char avtor[10];
char nazv[10];
char izdat[10];
char god[10];
struct kniga* next;
} Kniga;

Kniga* top = NULL;

void push(char* shifr, char* avtor, char* nazv, char* izdat, char* god)
{
Kniga* ptr = (Kniga *)malloc(sizeof(Kniga));
strcpy(ptr->shifr,shifr);
strcpy(ptr->avtor,avtor);
strcpy(ptr->nazv,nazv);
strcpy(ptr->izdat,izdat);
strcpy(ptr->god,god);
ptr->next = top;
top = ptr;
}

void pop()
{
if(top != NULL)
{
Kniga* ptr = top->next;
printf("%s ",top->shifr);
printf("%s ",top->avtor);
printf("%s ",top->nazv);
printf("%s ",top->izdat);
printf("%s - deleted\n",top->god);
free(top);
top = ptr;
}
}

void show_stack()
{
Kniga* ptr = top;
while(ptr != NULL)
{
printf("%s ",ptr->shifr);
printf("%s ",ptr->avtor);
printf("%s ",ptr->nazv);
printf("%s ",ptr->izdat);
printf("%s \n",ptr->god);

ptr = ptr->next;
}
}


int main()
{
locale::global(locale("Rus"));
char str1[10];
char str2[10];
char str3[10];
char str4[10];
char str5[10];

for(int i=0;i<3;i++) {
sprintf(str1,"запись %d",i+1);
sprintf(str2,"запись %d",i+1);
sprintf(str3,"запись %d",i+1);
sprintf(str4,"запись %d",i+1);
sprintf(str5,"запись %d",i+1);

push(str1,str2,str3,str4,str5);

}
show_stack();
while(top != NULL) pop();
system("pause");
return 0;
}

Последний раз редактировалось svkpro; 26.11.2012 в 00:53.
svkpro вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структуры данных "стек" 777Aidar777 Помощь студентам 5 26.11.2012 11:26
Динамические структуры данных, списковые структуры (надо разобраться что делает программа) _4Alex4_ Помощь студентам 1 14.11.2012 07:39
Написание программ (древовидные структуры, структуры неспециального вида и т.д.) Green Gin Фриланс 2 27.04.2012 15:26
Стек, структуры, С++! HELP!!!!!!! Vikylik Помощь студентам 0 22.04.2009 14:40