Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Списки

66K
18 марта 2011 года
rowlot
9 / / 18.03.2011
Доброго времени суток !
Помогите разобратьс списком ..

Код:
#include <stdio.h>
#include <stdlib.h>
const int k=5;                                                                                                                              
struct spisok
{
  char name[3];        /* элемент списка                  */
struct spisok *next ;     /* указатель на последующий элемент*/
} info;

struct spisok *last;//последний                                                                                                                        

int vvod(struct spisok *i ,struct spisok **last )
{
  if (!*last) *last = i;
  else (*last)->next = i;
  i->next = NULL;
  *last = i ;
}

int main()
{
  // struct spisok info =NULL;                                                                                                                        
  last =NULL;
  struct spisok *info=NULL;
  int i;
  for (i=0;i<k;i++){
    printf("Enter:\n");
    scanf("%c",info->name);
    vvod(info, &last);
    info = (struct spisok *) malloc(sizeof(struct spisok));
    if (!info){
      printf("\n Нет свободной памяти");
      return;
    }
  }
}


При компиляции исходник отказывается работать . -
пишет следующее..

(gdb) run
Enter:

Program received signal SIGSEGV, Segmentation fault.
0x080484a8 in vvod ()

непонимаю в чем ошибка ....
ps:/предчувствую ..что maloc не правильно работает .. но не понимаю как заставить его иначе
397
18 марта 2011 года
SergPas
527 / / 03.02.2007
Цитата: rowlot
Доброго времени суток !
Помогите разобратьс списком ..

Код:
#include <stdio.h>
#include <stdlib.h>
const int k=5;                                                                                                                              
struct spisok
{
  char name[3];        /* элемент списка                  */
struct spisok *next ;     /* указатель на последующий элемент*/
} info;

struct spisok *last;//последний                                                                                                                        

int vvod(struct spisok *i ,struct spisok **last )
{
  if (!*last) *last = i;
  else (*last)->next = i;
  i->next = NULL;
  *last = i ;
}

int main()
{
  // struct spisok info =NULL;                                                                                                                        
  last =NULL;
  struct spisok *info=NULL;
  int i;
  for (i=0;i<k;i++){
    printf("Enter:\n");
    scanf("%c",info->name);
    vvod(info, &last);
    info = (struct spisok *) malloc(sizeof(struct spisok));
    if (!info){
      printf("\n Нет свободной памяти");
      return;
    }
  }
}


При компиляции исходник отказывается работать . -
пишет следующее..

(gdb) run
Enter:

Program received signal SIGSEGV, Segmentation fault.
0x080484a8 in vvod ()

непонимаю в чем ошибка ....
ps:/предчувствую ..что maloc не правильно работает .. но не понимаю как заставить его иначе


Вот по рукам вам за такое "понадавать" надо бы:

Цитата:
for (i=0;i<k;i++){
printf("Enter:\n");
scanf("%c",info->name);
vvod(info, &last);
info = (struct spisok *) malloc(sizeof(struct spisok));
if (!info){
printf("\n Нет свободной памяти");
return;
}
}



Вы пытаетесь что-то записать в недоступную память, на которую ссылается указатель info.
Нужно так:

Код:
for (i=0;i<k;i++){
    printf("Enter:\n");
    info = (struct spisok *) malloc(sizeof(struct spisok));
    if (!info){
      printf("\n Нет свободной памяти");
      return -1;
    }
    scanf("%c",info->name);
    vvod(info, &last);
  }
return 0;

P.S. Логические ошибки, если они есть конечно, ищите и исправляйте сами.
66K
18 марта 2011 года
rowlot
9 / / 18.03.2011
ой .. спасибо ...но это не помогло
С этого началась проблема ..
При запуске вводится всего 3 элемента,хотя k =5 -> ниже видно ,что функция выполняется 5 раз (По колличеству Enter:)

(gdb) run
Enter:e
Enter:
Enter:r
Enter:
Enter:t

Не понятно .. как массив char name[3] может повлиять ...)
Если указать просто char name (не как массив .. )то фукция просто распечатывает Enter : ...ошибка при записи в структуру и создании нового елемента
8.9K
18 марта 2011 года
Apach47
130 / / 14.06.2010
Покажи измененный код пожалуйста.
66K
19 марта 2011 года
rowlot
9 / / 18.03.2011
так код практически не изменился :

Код:
#include <stdio.h>
#include <stdlib.h>
const int k=5;                                                                                                                              
struct spisok
{
  char name[3];        /* элемент списка                  */
struct spisok *next ;     /* указатель на последующий элемент*/
} info;

struct spisok *last;//последний                                                                                                                      
int vvod(struct spisok *i ,struct spisok **last )
{
  if (!*last) *last = i;
  else (*last)->next = i;
  i->next = NULL;
  *last = i ;
}

int main()
{                                                                                                    
  last =NULL;
  struct spisok *info=NULL;
  int i;
for (i=0;i<k;i++){
    printf("Enter:\n");
    info = (struct spisok *) malloc(sizeof(struct spisok));
    if (!info){
      printf("\n Нет свободной памяти");
      return -1;
    }
    scanf("%c",info->name);
    vvod(info, &last);
  }
return 0;
297
19 марта 2011 года
koodeer
1.2K / / 02.05.2009
Во-первых, если не ошибаюсь, вместо %c нужно
 
Код:
scanf("%s",info->name);

Во-вторых, этот код чреват переполнением буфера.

В-третьих, занятую память нужно освобождать. Где free ?


[COLOR="gray"]P.S. Итить-колотить, второе десятилетие двадцать первого века! А программы по-прежнему текут памятью и переполняют буфера.
Наболело...[/COLOR]
66K
19 марта 2011 года
rowlot
9 / / 18.03.2011
1 ) да ..спасибо ...массив тута надо затереть .. да и вводить просто char -> поэтому "%c"
2 ) Поэтому тема была создана .. потому-что афтару не дошло понимание того как с этим бороться
3 ) struct spisok *info=NULL; разве это не равносильно free ?

P.S: ...в ожидании пинка к пути правильного решения..=)
8.9K
19 марта 2011 года
Apach47
130 / / 14.06.2010
Цитата: rowlot
так код практически не изменился :

Код:
#include <stdio.h>
#include <stdlib.h>
const int k=5;                                                                                                                              
struct spisok
{
  char name[3];        /* элемент списка                  */
struct spisok *next ;     /* указатель на последующий элемент*/
} info;

struct spisok *last [COLOR="#8b0000"]= NULL[/COLOR];//последний  
                                                                                                                     
[COLOR="red"]int vvod(struct spisok *i )[/COLOR]
{
  if (last==NULL)
        last = i;
  else
  {
        last->next = i;
        i->next = NULL;
        last = i ;
//Составной оператор был неверно определен
  }
}
//Почему функция не void?

int main()
{                                                                                                    
  struct spisok *info;
//NULL можно опустить

for (int i=0;i<k;i++){

    printf("Enter:\n");
    info = (struct spisok *) malloc(sizeof(struct spisok));

    if (!info){
      printf("\n Нет свободной памяти");
      return -1;
    }

    scanf("%c",info->name);
[COLOR="red"]    vvod(info);[/COLOR]
//Смысл передавать в функцию глобальную переменную?!
  }
return 0;
}



Попробуй вот так, хотя за корректность не ручаюсь. На Си не пишу, только на С++ пока

41K
20 марта 2011 года
kisssko
108 / / 28.10.2010
Цитата: rowlot

3 ) struct spisok *info=NULL; разве это не равносильно free ?



Никак нет! Таким образом только затирается указатель на выделенную память.
Выделенная память же остаётся закреплённой за процессом, и недоступна другим.

78K
15 декабря 2011 года
via_82
3 / / 15.12.2011
Помогите разобраться с реализацией связанных списков на базе массивов

Мне необходимо решить контрольную
Задание:
Структура данных – двусвязная, на базе массива с индексными указателями

Нашел в инете статью: http://www.rsdn.ru/article/alg/list.xml
но в ней пример на Visual Basic 6.0

Не могу найти пример на C++ для понимания данной задачи.
240
15 декабря 2011 года
aks
2.5K / / 14.07.2006
Что то лодыри совсем обнаглели.
78K
15 декабря 2011 года
via_82
3 / / 15.12.2011
Цитата: aks
Что то лодыри совсем обнаглели.



Почему сразу лодыри?
Я не специалист по C++, только начинаю.
Вместо того чтобы оскорблять человека, поделились бы опытом или ссылкой.

240
15 декабря 2011 года
aks
2.5K / / 14.07.2006
Ссылкой на что? Тут не надо быть специалистом по C++. Это основы. Основы даже программирования, алгоритмики вобще. А для реализации нужно знать минимальные основы языка. Без этого не имеет смысл вобще как то дальше двигаться в данном направлении. Почему вы не хотите разобраться с этим своими силами? Хотя бы пробовали или сразу на форум просить сделать все за вас? Если пробовали то что конкретно вам не понятно? Какой именно момент? Его и будем разбирать. Может что то непонятно в статье по приведенной выше ссылке?
Когда же человек говорит - мне это надо, но я в этом не понимаю иначе как лодырем не назовешь, уж извините.
78K
15 декабря 2011 года
via_82
3 / / 15.12.2011
Цитата: aks
Ссылкой на что? Тут не надо быть специалистом по C++. Это основы. Основы даже программирования, алгоритмики вобще. А для реализации нужно знать минимальные основы языка. Без этого не имеет смысл вобще как то дальше двигаться в данном направлении. Почему вы не хотите разобраться с этим своими силами? Хотя бы пробовали или сразу на форум просить сделать все за вас? Если пробовали то что конкретно вам не понятно? Какой именно момент? Его и будем разбирать. Может что то непонятно в статье по приведенной выше ссылке?
Когда же человек говорит - мне это надо, но я в этом не понимаю иначе как лодырем не назовешь, уж извините.



Я не прошу делать задачу за меня.
Я прошу пример реализации списка на базе массива с индексными указателями.
Или ссылку на источник где можно посмотреть.

240
15 декабря 2011 года
aks
2.5K / / 14.07.2006
Цитата: via_82
Я не прошу делать задачу за меня.
Я прошу пример реализации списка на базе массива с индексными указателями.


А вы видите разницу между этим?

41K
17 декабря 2011 года
kisssko
108 / / 28.10.2010
Как то так: :)

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

#define SYMS_IN_STRUCT 3

int k=5;
struct spisok
{
  char name[SYMS_IN_STRUCT];    /* элемент списка                  */
  struct spisok *prev;              /* указатель на предыдущий элемент*/
  struct spisok *next;              /* указатель на следующий элемент*/
};

struct spisok *first=NULL;   /* первый */
struct spisok *last=NULL;   /* последний */

void add_record(struct spisok *i)
{
  if(!first)first=i;
  if (!last){last=i;i->prev=NULL;}
  else {last->next=i; i->prev=last; last=i;}
  i->next=NULL;
}

int main(int argc, char **argv)
{                                                                                                    
  struct spisok *info;
  int i;
  char tmps[32];
  char ofmt[32];
  printf("Number of elements [5] : ");
  fgets(tmps, 30, stdin);
  k=atoi(tmps);
  if(k<1) k=5;
  sprintf(ofmt, "[%%u]=%%.%us\n", SYMS_IN_STRUCT); /* Создаём строку формата */
for (i=0;i<k;i++){
    printf("Enter: ");
    fgets (tmps, SYMS_IN_STRUCT+2, stdin);
    if(!(info = (struct spisok *)malloc(sizeof(struct spisok))))
      {printf("Нет свободной памяти! \n"); return -1;}
    memcpy((void*)&(info->name), (void*)tmps, SYMS_IN_STRUCT);
    add_record(info);
   }

/*           --- Вывод ---           */
  info=first;
  i=1;
  do{
    printf(ofmt, i, &(info->name));
        info=info->next; i++;
       }while(info);

/*           --- Освобождение памяти ---           */
  info=last;
  do{
       if(info->prev) {info=info->prev; free((void*)(info->next));}
       else {free((void*)info); info=NULL;}
      }while(info);
  return 0;
}
240
17 декабря 2011 года
aks
2.5K / / 14.07.2006
Цитата:
struct spisok


:facepalm::facepalm:

41K
17 декабря 2011 года
kisssko
108 / / 28.10.2010
Цитата: aks
:facepalm::facepalm:



Да ничего страшного. :) А то, если сделать typedef struct {...} spisok; - не получится объявить исходный тип внутри структуры.
Для себя я делаю в таких случаях члены структуры типа void*. А раз ТС захотел так, то и пусть будет. Это не принципиально.

7
18 декабря 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: kisssko
получится объявить исходный тип внутри структуры

Да что вы говорите?..Вот кусок кода из рабочей программы

 
Код:
#define TypeList(Type)\
struct tag ## Type ## List{\
    Type v ## Type;\
    struct tag ## Type ## List *pNext;\
}
typedef TypeList(Node) NodeList;
typedef TypeList(Elt) EltList;
typedef TypeList(Disp) DispList;
typedef TypeList(Load) LoadList;
41K
18 декабря 2011 года
kisssko
108 / / 28.10.2010
Цитата: @pixo $oft
Да что вы говорите?..Вот кусок кода из рабочей программы



Но опять же внутри структуры объявления типа struct Type, а не просто Type. :)
И как результат, в программе фигурируют два типа.

7
18 декабря 2011 года
@pixo $oft
3.4K / / 20.09.2006
Ох,ну так
 
Код:
typedef struct SomeType{
    int vSomeVal;
    SomeType *pvSomeType;
}SomeType;
260
18 декабря 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: aks
:facepalm::facepalm:



Естественно, надо:
[code=c++]
struct spisog
[/code]

41K
18 декабря 2011 года
kisssko
108 / / 28.10.2010
Цитата: @pixo $oft
Ох,ну так
 
Код:
typedef struct SomeType{
    int vSomeVal;
    SomeType *pvSomeType;
}SomeType;



Вот это уже не будет компилиться. В чистом C по крайней мере. А у ТС именно он. Прверил в PelesC, tcc, gcc.

240
18 декабря 2011 года
aks
2.5K / / 14.07.2006
Цитата: Ramon
Естественно, надо:
[code=c++]
struct spisog
[/code]


 
Код:
struct SpiSochEg

=)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог