Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатели, помогите с программой 
:(
    Опции темы
ConverterDU
Дата 18.2.2011, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



уважаемые прграммисты, помогите разобраться с указателями в С++. общий принцип я понимаю, но совместно с преподавателемнаписали программу, создающую список, все на указателях, не могу разобраться никак, начинающий я... пожалуйста напишите комментарии к каждой строке программы, чтои как происходит!!! 

Код
#include<stdio.h>
#include<stdlib.h>

typedef struct List
{
    float L_element; 
    struct List *next; 
} List_t ;


void fun_List (List_t **list) {
    List_t *
    a=(List_t *)malloc(sizeof(List_t));
    a->L_element=30; 
    a->next=NULL;
    List_t *p ;
    p=(List_t *)malloc(sizeof(List_t));
    p->L_element=20; 
    p->next=a;
    List_t *erste;
    erste=(List_t *)malloc(sizeof(List_t));
    erste->L_element=10; 
    erste->next=p;
    
    *list = erste; 
}
void fun_Print (List_t *head) {
    List_t *r = head;
    int j = 1;
     while(r != NULL) {
        printf("\n Element %d ist gleich %2.0f ", j++, r->L_element);
        r = r->next;
    }
}
int main(){
    List_t *list = NULL;
    fun_List (&list);
    fun_Print(list);
}



Модератор: не забываем пользоваться кнопочкой "Код"

Это сообщение отредактировал(а) bsa - 22.2.2011, 00:34
PM MAIL   Вверх
Игорь1024
Дата 18.2.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

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



Код

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

typedef struct List//однонапраленный список
{
    float L_element; 
    struct List *next;//указатель на следующий член
} List_t ;


void fun_List (List_t **list) {//Зачем указатель на указатель??
    List_t * a=(List_t *)malloc(sizeof(List_t));
    a->L_element=30; //здесь создаётся структура самого списка, со ссылками на члены и далее
    a->next=NULL;
    List_t *p ;
    p=(List_t *)malloc(sizeof(List_t));
    p->L_element=20; 
    p->next=a;
    List_t *erste;
    erste=(List_t *)malloc(sizeof(List_t));
    erste->L_element=10; 
    erste->next=p;
    
    *list = erste; 
}
void fun_Print (List_t *head) {//просто печатаем
    List_t *r = head;
    int j = 1;
     while(r != NULL) {
        printf("\n Element %d ist gleich %2.0f ", j++, r->L_element);
        r = r->next;
    }
}
int main(){
    List_t *list = NULL;
    fun_List (&list);
    fun_Print(list);
}


Добавлено через 9 минут и 29 секунд
Как-то это всё корявенько...

Это сообщение отредактировал(а) Игорь1024 - 18.2.2011, 15:29
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
borisbn
Дата 18.2.2011, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Код

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

// структура однонаправленного списка
// каждый элемент списка - это float-овское значение и указатель на точно такой же элемент,
// т.е. на следующий элемент списка.
// если следующего элемента списка нет (конец списка), то указатель на следующий равен 0
typedef struct List
{
    float L_element; 
    struct List *next; // указатель на следующий элемент в списке
} List_t ;


void fun_List (List_t **list) {
    List_t *
    a=(List_t *)malloc(sizeof(List_t)); // выделить память под один элемент списка.
    a->L_element=30; // заполнить значение
    a->next=NULL; // это - последний элемент списка. больше нет. конец. поэтому = 0
    List_t *p ;
    p=(List_t *)malloc(sizeof(List_t)); // выделить память под предыдущий элемент (предпоследний)
    p->L_element=20; // заполнить значение
    p->next=a; // следующий после предыдущего - последний, т.е. a типа List_t*
    List_t *erste;
    erste=(List_t *)malloc(sizeof(List_t)); // выделить память под пред-предыдущий элемент (пред-предпоследний)
    erste->L_element=10; // заполнить значение
    erste->next=p; // следующий после пред-предпоследнего - предпоследний, т.е. p типа List_t*
    
    *list = erste; // т.к. в списке всего 3 элемента, 
                        // то erste - по совместительству является первым элементом списка. Или иначе - голова списка
}
void fun_Print (List_t *head) {
    List_t *r = head; // начинаем с головы
    int j = 1; // просто счётчик
     while(r != NULL) { // если следующего элемента нет, т.е. мы в хвосте списка, то выходим
        printf("\n Element %d ist gleich %2.0f ", j++, r->L_element); // распечатать счётчик и значение элемента
        r = r->next; // перейти к следующему элементу
    }
}
int main(){
    List_t *list = NULL; // создать указатель на элемент.
    fun_List (&list); // передать адрес этого указателья (т.е. указатель на указатель)
                           // в ф-цию создания/заполнения списка
    fun_Print(list);
}

пользуйся кнопкой Код

и ещё, у тебя нигде не освобождается память, выделенная под каждый элемент ф-цией malloc. А надо бы

Цитата(Игорь1024 @  18.2.2011,  15:24 Найти цитируемый пост)
Как-то это всё корявенько...

IMHO вполне нормально. что именно то не понравилось ?


P.S.
> Element %d ist gleich %2.0f
на фрицев работаешь ? тогда делись. я BMW предпочитаю smile

Добавлено через 2 минуты и 22 секунды
и ещё.
Цитата(ConverterDU @  18.2.2011,  13:54 Найти цитируемый пост)
уважаемые прграммисты, помогите разобраться с указателями в С++

твой код написан на чистом Си, а не на Си++

Это сообщение отредактировал(а) borisbn - 18.2.2011, 16:04


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Игорь1024
Дата 18.2.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

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



Чисто по читаемости. Можно было бы объявления a, p, erste сгруппировать вместе для лучшей читаемости.
IMHO так удобнее. Но как говорится: на вкус и цвет фломастеров нет. 
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
ConverterDU
Дата 21.2.2011, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо всем огромное, очень помогли! у меня еще один вопрос! а могу язаполнеие каждой из трех структур записать в отдельные функции,а потом вызывать их в fun_List??
PM MAIL   Вверх
borisbn
Дата 21.2.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(ConverterDU @  21.2.2011,  13:13 Найти цитируемый пост)
а могу язаполнеие каждой из трех структур записать в отдельные функции,а потом вызывать их в fun_List??

 smile 
вообще-то, так и надо было делать.


Цитата(Игорь1024 @  18.2.2011,  16:30 Найти цитируемый пост)
Чисто по читаемости. Можно было бы объявления a, p, erste сгруппировать вместе для лучшей читаемости.

ааа... в этом смысле. тогда соглашусь.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ConverterDU
Дата 21.2.2011, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



можешь написать как это сделать, хотя бы примерно, плз? smile 

Это сообщение отредактировал(а) ConverterDU - 21.2.2011, 17:15
PM MAIL   Вверх
borisbn
Дата 21.2.2011, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Код

List_t * make_node( float elem, List_t * next ) {
    List_t * result = (List_t *)malloc( sizeof( List_t ) );
    result->L_element = elem;
    result->next = next;
    return result;
}

List_t * make_a() {
    return make_node( 30, 0 );
}

List_t * make_p( List_t * next ) {
    return make_node( 20, next );
}

List_t * make_erste( List_t * next ) {
    return make_node( 10, next );
}

void fun_List (List_t **list) {
    List_t * a = make_a();
    List_t * p = make_p( a );
    List_t * erste = make_erste( p );
    *list = erste; 
// а можно так, хотя настоятельно не рекомендую
// *list = make_erste( make_p( make_a() ) );
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ConverterDU
Дата 22.2.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо огромное, все работает!!!
borisbn, помогите, пожалуста, разобраться с указателями до конца! Отвечаю, сутками сижу над книжками, но так хочется все это понять и знать!
Вот смотрите:

Код

List_t * make_node( float elem, List_t * next ) { // здесь мы объявили функцию make_node с параметрами 1.elem и 
//2.УКАЗАТЕЛЬ next с типом структуры List_t - верно я написал или нет?
    List_t * result = (List_t *)malloc( sizeof( List_t ) ); - здесь понятно. 
    result->L_element = elem; 
    result->next = next;
    return result;
}

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


Модератор: исправил ширину сообщения

Это сообщение отредактировал(а) bsa - 22.2.2011, 00:37
PM MAIL   Вверх
bsa
Дата 22.2.2011, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ConverterDU, а зайти в ответы на часто задаваемые вопросы не судьба?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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