работа со списками

Тема в разделе "LANGS.C", создана пользователем BreakHeart, 2 мар 2009.

  1. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    пытался вспомнить как со списками работать и немного запутался уж оч давно это было(
    подскажите плз в каких местах ошибки в сл коде
    Код (Text):
    1. typedef struct node2 {
    2.     char *FID;
    3.     char *TID;
    4.     char *action;
    5.     char *path;
    6.     char *mask;
    7.     char *date;
    8.     struct node2 *prev, *next;
    9.  } *LIST2;
    10.  
    11. /* Инициализация списка, как пустого */
    12.  LIST2 init(LIST2 *l)
    13.  {
    14.     return *l=NULL;
    15.  }
    16.  
    17.   /* Добавление элемента в голову списка */
    18.   LIST2 cons (char *f,char *t,char *a,char *p,char *m,char *d,LIST2 l)
    19.  {
    20.  LIST2 n=(LIST2)malloc(sizeof(struct node2));
    21.  n->FID=f;
    22.  n->TID=t;
    23.  n->action = a;
    24.  n->path = p;
    25.  n->mask = m;
    26.  n->date = d;
    27.   n->next=l;
    28.   n->prev=NULL;
    29.   l->prev=n;
    30.   return n;
    31.  }
    32.  
    33. /* Печать списка целых */
    34. void printlist(LIST2 l)
    35. {
    36.     printf("\n");
    37.     while (l!=NULL)
    38.     {          
    39.         printf("%s",l->FID);
    40.         l=l->next;
    41.     }
    42. }
    43.  
    44. /* Добавление элемента в конец списка */
    45.  LIST2 last(char *f,char *t,char *a,char *p,char *m,char *d,LIST2 l)
    46.  {
    47.      LIST2 head;
    48.      if (!l)
    49.      {
    50.          l=(LIST2)malloc(sizeof(struct node2));
    51.          l->FID=f;
    52.          l->TID=t;
    53.          l->action=a;
    54.          l->path=p;
    55.          l->mask=m;
    56.          l->date=d;
    57.          l->next=NULL;
    58.          l->prev=NULL;
    59.          return l;
    60.      }
    61.      else
    62.      {
    63.          head=l;
    64.          while (l->next!=NULL) l==l->next;
    65.          l->next=(LIST2)malloc(sizeof(struct node2)) ;
    66.          l->next->prev=l;
    67.          l=l->next;
    68.          l->FID=f;
    69.          l->TID=t;
    70.          l->action=a;
    71.          l->path=p;
    72.          l->mask=m;
    73.          l->date=d;
    74.          l->next=NULL;
    75.          return head;
    76.      }
    77.  }
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    А чем ты все это время занимался? :))
     
  3. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    ну как-то не нужны мне были списки в том что я писал последнее время...другими вещами обходился
     
  4. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    подскажите плз в чем тут ошибка?второй малок не отрабатывает
    Код (Text):
    1. LIST2 last(wchar_t *f,wchar_t *t,wchar_t *a,wchar_t *p,wchar_t *m,wchar_t *d,LIST2 l)
    2.  {
    3.      LIST2 head;
    4.      size_t sos1 = sizeof(struct node2);
    5.      size_t sos = sizeof(struct node2);
    6.  
    7.      if (!l)
    8.      {
    9.         l=(LIST2)malloc(sos);
    10. #ifdef VC80
    11.         wcscpy_s(l->FID,sizeof(l->FID),f);
    12.         wcscpy_s(l->TID,sizeof(l->TID),t);
    13.         wcscpy_s(l->action,sizeof(l->action),a);
    14.         wcscpy_s(l->path,sizeof(l->path),p);
    15.         wcscpy_s(l->mask,sizeof(l->mask),m);
    16.         wcscpy_s(l->date,sizeof(l->date),d);
    17. #else
    18.         wcscpy(l->FID,f);
    19.         wcscpy(l->TID,t);
    20.         wcscpy(l->action,a);
    21.         wcscpy(l->path,p);
    22.         wcscpy(l->mask,m);
    23.         wcscpy(l->date,d);
    24. #endif
    25.          l->next=NULL;
    26.          l->prev=NULL;
    27.          return l;
    28.      }
    29.      else
    30.      {
    31.          head=l;
    32.          while (l->next!=NULL) l=l->next;
    33.          l->next=(LIST2)malloc(sos1);
    34.          
    35.          //l->next = new struct node2;
    36.          l->next->prev=l;
    37.          l=l->next;
    38. #ifdef VC80
    39.         wcscpy_s(l->FID,sizeof(l->FID),f);
    40.         wcscpy_s(l->TID,sizeof(l->TID),t);
    41.         wcscpy_s(l->action,sizeof(l->action),a);
    42.         wcscpy_s(l->path,sizeof(l->path),p);
    43.         wcscpy_s(l->mask,sizeof(l->mask),m);
    44.         wcscpy_s(l->date,sizeof(l->date),d);
    45. #else
    46.         wcscpy(l->FID,f);
    47.         wcscpy(l->TID,t);
    48.         wcscpy(l->action,a);
    49.         wcscpy(l->path,p);
    50.         wcscpy(l->mask,m);
    51.         wcscpy(l->date,d);
    52. #endif
    53.         l->next=NULL;
    54.         return head;
    55.      }
    56.  }
    сама структура
    Код (Text):
    1.  typedef struct node2 {
    2.     wchar_t FID[MAX_LEN];
    3.     wchar_t TID[20];
    4.     wchar_t action[7];
    5.     wchar_t path[_MAX_PATH];
    6.     wchar_t mask[MAX_LEN];
    7.     wchar_t date[11];
    8.     struct node2 *prev;
    9.     struct node2 *next;
    10.  } *LIST2;
     
  5. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Енто, если ты не можешь отладить код одно/двух-связного списка это просто клиника...

    Для начала поубирай переменные sos, sos1, и поменяй typedef так, что б были видны типы/указатели:

    Код (Text):
    1. typedef struct node2 {
    2.     wchar_t FID[MAX_LEN];
    3.     wchar_t TID[20];
    4.     wchar_t action[7];
    5.     wchar_t path[_MAX_PATH];
    6.     wchar_t mask[MAX_LEN];
    7.     wchar_t date[11];
    8.     struct node2 *prev;
    9.     struct node2 *next;
    10. } node_t;
    11.  
    12. node_t *last()
    13. {
    14.     node_t *head;
    15.  
    16.     head = (node_t *)malloc(sizeof(node_t));
    17.     head->...
    Ну а т.к. на дворе 2009 год и у тебя есть С++ компилер, то можно не париться с указателями и сделать так:

    Код (Text):
    1. struct node_t
    2. {
    3.     std::wstring    FID,
    4.             TID,
    5.             action,
    6.             path[_MAX_PATH],
    7.             mask[MAX_LEN];
    8. };
    9.  
    10. std::list<node_t> g_list;
    11. void add()
    12. {
    13.     node_t node;
    14.     node.path = L"Wide string";
    15.  
    16.     g_list.push_back(node);
    17. }
    18.  
    19. void print_head()
    20. {
    21.     for (std::list<node_t>::iterator i = g_list.begin();
    22.      i != g_list.end();
    23.      ++i)
    24.     {
    25.     std::wcout << L"Item: " << i->path << std::endl;
    26.     }
    27. }