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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2013, 11:25   #1
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию Си. Списки. Передача указателя на список в функции

доброго времени суток. Столкнулся в Си с проблемой передачи указателя на списки в функции. Список двусвязный, динамическое распределение памяти. Задание, демонстрация работы со списком, создание, добавление узлов, вывод, количество элементов и т.д...
Код:
#include <stdio.h>
#include <stdlib.h>

typedef struct spisok
    {
        int num;        /* номер узла */
        float val;      /* значение элемента                */
        struct spisok * next; /* указатель на следующий элемент   */
        struct spisok * prev; /* указатель на предыдующий элемент */
    } Spisok;
    
void create_spis(Spisok *uk);
void print_spis(Spisok *uk);

int main()
{
    int menu; /*Для выбора пункта меню*/
    Spisok *ukaz = NULL;
    
    do{         
        // менюшка
        scanf("%d", &menu); 
        
        switch(menu){
            case 1  : create_spis(ukaz);           break;
            case 2  : /*добавление узла*/          break;
            case 3  : print_spis(ukaz);            break;
            case 4  : /*вывести число элементов*/   break;
            case 5  : /*Удалить элемент их списка*/ break;
            case 6  : /*Создание списка*/           break;
            default : printf("\n\tNeverno vybran punkt meny. Povtorite vvod."); break;   
            }
            
        } while (menu != 6);
          
  system("PAUSE");	
  return 0;
}

void create_spis(Spisok* uk)
{ 
    Spisok *buf; /*буферный указатель*/
    Spisok *head = NULL; /*буферный указатель на голову списка*/   

    printf("\n\t\t Sozdanie spiska.");
    int vybor; /*для выбора действия*/        

        do{
            buf = malloc(sizeof(Spisok)); /*выделяем память под структуру*/            
            
            if (uk == NULL){ /*если первая запись в списке*/
                buf->num = 1;
                buf->prev = NULL;
                head = buf;
                }
            else{ /*если не последняя*/
                while ( uk->next != NULL ) 
                    uk = uk->next;
                buf->num = uk->num + 1;
                buf->prev = uk;
                uk->next = buf;               
                }
                
            buf->next = NULL;
            printf("\n\t Vvedite znachenie elementa spiska:  ");
            scanf("%f", &buf->val); 
            uk = buf;         
            printf("\n\t Dlua prodolzenia sozdania spiska nazmite 1 ");
            scanf("%d", &vybor);
          }while (vybor == 1);
        uk = head;
       // print_spis(head); // но если сразу передавать то выводит 
}

void print_spis(Spisok* uk){
    printf("\n\t\t Vyvod spiska.");

    // переходим в начало списка
    if (uk != NULL){
        while (uk->prev != NULL)
            uk = uk->prev;
            
        while (uk != NULL){
            printf("\n %f | %d \t", uk->val, uk->num);
            uk = uk->next;
            }        
        }
    else
        printf("\n\tSpisok pust\n");   
}
и так собственно проблема.
Передать в create_spis указатель на функцию и что бы вернулся указатель на созданный список. (можно конечно и через return, но хотелось бы разобраться через void, что не так...)
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 28.02.2013, 11:32   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Переменная uk, формальный параметр функции create_spis, есть некоторый адрес в памяти. Он (сам адрес) передаётся по значению: изменения, которые Вы произведёте в адресуемом блоке, останутся видны "снаружи", а вот изменения самой переменной uk - нет. Если Вы хотите, чтобы при вызове вида create_spis(ukaz) изменилось значение переменной ukaz, её надо передавать не по значению, а по ссылке:
Код:
create_spis(&ukaz) // передаём адрес ukaz - ukaz может быть изменена
//...
void create_spis(Spisok** pUk){
  //...
  *pUk = head; //меняем то, на что указывает pUk
}
Abstraction вне форума Ответить с цитированием
Старый 28.02.2013, 11:45   #3
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Переменная uk, формальный параметр функции create_spis, есть некоторый адрес в памяти. Он (сам адрес) передаётся по значению: изменения, которые Вы произведёте в адресуемом блоке, останутся видны "снаружи", а вот изменения самой переменной uk - нет. Если Вы хотите, чтобы при вызове вида create_spis(ukaz) изменилось значение переменной ukaz, её надо передавать не по значению, а по ссылке:
Код:
create_spis(&ukaz) // передаём адрес ukaz - ukaz может быть изменена
//...
void create_spis(Spisok** pUk){
  //...
  *pUk = head; //меняем то, на что указывает pUk
}
спасибо... помогло...
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача указателя массива в фунцию. firephenix Общие вопросы C/C++ 4 09.07.2011 06:07
Передача указателя на объект CodeNOT Общие вопросы C/C++ 7 06.01.2011 20:01
Передача указателя по цепочке (Си) mutabor Общие вопросы C/C++ 3 29.05.2010 16:29
Передача указателя из Си++ в dll на delphi VladimirFF Общие вопросы C/C++ 0 22.02.2010 19:56
передача указателя в функцию arturka Помощь студентам 3 06.07.2008 00:25