nixp.ru v3.0

17 октября 2017,
вторник,
10:58:54 MSK

DevOps с компанией «Флант»
decvar написал 26 апреля 2004 года в 20:19 (379 просмотров) Ведет себя как мужчина; открыл 111 тему в форуме, оставил 1838 комментариев на сайте.

Что-то я походу запутался:

struct foo

{

char qwe;

char asd;

};

…..

…..

static void

bar

{

GList *list = NULL;

/* двухсязанный список

struct list{

gpointer data;

GList *next;

GList *prev;

}; */

struct foo my_struct;

my_struct.qwe=«qwe»;

my_struct.asd=«asd»;

list = g_list_append(list, &my_struct);

….

….

}

/* вообщем я добавил в список новый элемент, а теперь как мне его оттуда прочитать? Например я хочу получить значение поля my_struct.qwe */

decvar

struct GList {

gpointer data;

GList *next;

GList *prev;

};

GList* g_list_append (GList *list,gpointer data);

The return value is the new start of the list, which may have changed, so make sure you store the new value.

decvar

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

Uncle Theodore

Да я-то помню, как работать со связным списком, но у тебя ж GTK, а какие там реализации одному аллаху известно… Ну, например, как этот g_list_append работает?

Good Luck,

UT

decvar

GList* g_list_append (GList *list,gpointer data);

The return value is the new start of the list, which may have changed, so make sure you store the new value.

я же написал…

Тип GList — тоже написал…

Как мне в принципе прочитить из списка элемент?

Uncle Theodore

Да ты-то написал, а куда он добавляет новый элемент, в начало что ли?

В принципе, сам list обычно — указатель на свой первыъ элемент. По ссылке получаешб значение. А итерировав n раз — получаешь ссылку на n-й элемент.

Мне бежать надо, если хочешь, напишу подробнее через час.

Good Luck

UT

myst

Ну что непонятно? Ф-ция возвращает новое начало списка. Структуру ноды ты знаешь. Беги по списку пока не найдёшь свою структуру…

decvar

struct prog {

char text;

};

..

struct prog item;

struct prog back;

item.text=«asd»;

list=g_list_append(list, &item);

back.text=list.data.text;

Если list указатель на начало, то он указывает на то, что я записал…так? Тогда имея back.text я могу записать в него list.data.text? Или не так?

myst

Да. Вот рисунок, чтобы всё было окончательно ясно:

list --+

+—- | ————————--+

| v |

+-> GList <--> GList <--> Glist <-+

| | |

v v v

data data data

где

горизонтальные стрелки = GList*

вертикальные стрелки = gpointer

Рисунок, понятно, корявый, но понять, я думаю, можно.

decvar

Да знаю как устроен список связанный, меня другое интересует, почему этот код

struct prog {

char text;

};

..

struct prog item;

struct prog back;

item.text=«asd»;

list=g_list_append(list, &item);

back.text=list.data.text;

не компилится, с матом

request for member data in something not a structure or union

по теме:

http://developer.gnome.org/doc/API/2.0/glib/glib-Doubly-Linked-Lists.html

myst

list — это не struct GList, а struct GList *. data — не struct prog, а struct prog * (скорее всего) ==> пиши (*(*list).data).text или list->data->text.

decvar

а может кто-нить скажет, как мне устроить свой список, с функцией добавоениея в него, а?

ЗЫ

Полистал книжки — что-то лажа какая-то….

myst

Genric лучше чем GList, наврядли сделаешь.

Uncle Theodore

А чего тут делать-то?

#include 
using namespace std;
struct listitem{
  int data;
  struct listitem * previous;
  struct listitem * next;
};
listitem * addItemAtStart(listitem * item, listitem * listt)
{
  //adding item to the beginning of the listt
  item -> next = listt;
  listt -> previous = item;
  return item;
};
int main()
{
  listitem *original = new listitem;
  listitem *addition = new listitem;
  //two empty listitems
  original -> previous = NULL;
  addition -> previous = NULL;
  original -> next = NULL;
  addition-> next = NULL;
  original -> data = 25;
  addition -> data = 36;
  original = addItemAtStart(addition, original);
  cout << original -> data << " is the first element of the new list" << endl;
  cout << original -> next -> data << " is the second element of the new list"
       << endl;
};

Good Luck,

UT

decvar

C++ это хорошо, а на C разве нельзя?

Uncle Theodore

А что тут от C++? Только cout, потому что я не знаю форматов (лень). Я специально это классом не делал, хотя было бы проще… Ну да, еще new… malloc который…

Какой ты, однако, привередливый… :-) Ну ладно, здесь еще можно долго ковыряться, вот, примерно, идея.

#include 
#include 
struct listitem{
  int data;
  struct listitem * previous;
  struct listitem * next;
};
struct listitem * addItemAtStart(struct listitem * item,
                         struct listitem * listt)
{
  //adding item to the beginning of the listt
  item -> next = listt;
  listt -> previous = item;
  return item;
};
void main()
{
  struct listitem *original = malloc(sizeof(struct listitem));
  struct listitem *addition = malloc(sizeof(struct listitem));
  //two empty listitems
  original -> previous = NULL;
  addition -> previous = NULL;
  original -> next = NULL;
  addition-> next = NULL;
  original -> data = 25;
  addition -> data = 36;
  original = addItemAtStart(addition, original);
  printf("%d,%s", original -> data, " the first element of the new list\n");
  printf("%d,%s", original -> next -> data, " the second element of the new list\n");
  free(original);
  free(addition);
};

На PASCALэе писать не буду, даже и не проси! :-)

Good Luck,

UT

decvar

Дядя, я так понимаю мы примерно одно и тоже пишем….

Продолжая мытарства с GList:

struct prog{

int store;

};

GList *list=NULL;

struct prog *item = malloc(sizeof(struct prog));

struct prog *back = malloc(sizeof(struct prog));

item->store=1234;

g_print(«item: %d»,item->store);

list=g_list_append(list, item);

back=list->data;

g_print(«back: %d», back->store);

….

Это компилится и работает. Если кто наткнется — смотрите…

PS

Моя ошибки была в не выделении памяти для *item….

надо поспать хоть чуть-чуть…. Всем спасибо