Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Ульяниус
1 / 1 / 0
Регистрация: 15.08.2013
Сообщений: 132
1

Ошибка при добавлении записи по возрастанию в двусвязный список

25.09.2013, 01:58. Просмотров 1011. Ответов 2
Метки нет (Все метки)

Здравствуйте. Задание следующее: Добавлять новые записи в двусвязный список так, чтобы список был упорядочен по возрасту.
Ниже приведен код. Код работает некорректно, вот начало:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
struct spis
 {char name [15];
 int god;
  struct spis *v1;
  struct spis *v2;
 };
 
 void sort (struct spis *);
 struct spis * head, * tail;
 main()
 {
  sort (head); 
  free (head); 
 }
 
void  sort (struct spis *p)
{
  char key;
  struct spis *ps;
  ps=NULL;
  do
    {
     ps=(struct spis *) malloc(sizeof(struct spis)); 
     printf("\n Фамилия: ");
     gets (ps->name);
     printf("\n Год рождения: ");
     scanf ("%d",&ps->god);
     fflush(stdin);
 
     if (p==NULL)
      {
    ps->v2=p;
    ps->v1=NULL;
    p->v2=ps;
    head=ps;
    tail=ps;
       }
а отсюда код не работает, просто вылетает в конец кода на печать на экране, ничего не анализируя, и не опускаясь по всем если:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
else if (p->god<=ps->god)
       p=p->v2;
      else if (p==head)
          {
        ps->v1=NULL;
        ps->v2=p;
        p->v1=ps;
        head=ps;
          }
          else if(p==tail)
           {
            ps->v1=tail;
            ps->v2=NULL;
            p->v2=ps;
            tail=ps;
           }
          else
           {
            ps->v1=p->v1;
            ps->v2=p;
            p->v1=ps;
           }
    printf("\n Продолжить ввод? <Esc> \n");
   }
   while (getch()!=27);
   getch();
 
     }
Помогите, пожалуйста, найти ошибки.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2013, 01:58
Ответы с готовыми решениями:

При добавлении в существующий список, новые записи добавлять в начало
Как сделать так, чтобы при добавлении в существующий список, новые записи...

Ошибка при добавлении нового элемента в список
Есть код для односвязного списка. Без функций всё работает, при попытке...

Двусвязный список с итератором - ошибка доступа
\\Модератору огромная просьба перенести тему в раздел по си, на автоматизме...

Нарушение прав доступа при записи по адресу 0х00000000 при добавлении элемента структуры
прошу помощи, выбивает эту ошибку при добавлении элемента структуры, также...

При добавлении одного элемента в список head и tail остаются NULL
LIST *head=NULL,*tail=NULL; void add(LIST * l,LIST * head,LIST * tail) {...

2
anmartex
...
1711 / 1204 / 908
Регистрация: 12.02.2013
Сообщений: 1,978
25.09.2013, 05:05 2
Лучший ответ Сообщение было отмечено Ульяниус как решение

Решение

Ульяниус, по кускам кода очень сложно определить, что не работает. Ниже привожу пример своего варианта:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct node_t
{
    char name[15];
    size_t years;
 
    struct node_t* prev;
    struct node_t* next;
}   TList;
 
//----------------------------------------------------------------------------
TList* Push(TList** list, const char* name, size_t years)
{
    TList* node = malloc(sizeof(TList));
    strncpy(node->name, name, sizeof(node->name) - 1);
    node->years = years;
 
    TList head;
    head.next = *list;
    TList* cur = &head;
 
    for (; cur->next && (cur->next->years <= years); cur = cur->next) { ; }
 
    node->next = cur->next;
    node->prev = cur;
 
    if (cur->next)
    {
        cur->next->prev = node;
    }
    cur->next = node;
 
    if (cur == &head)
    {
        *list = cur->next;
    }
 
    return *list;
}
//----------------------------------------------------------------------------
void Print(const TList* list)
{
    for (; list; list = list->next)
    {
        printf("%s\t%u\n", list->name, list->years);
    }
}
//----------------------------------------------------------------------------
 
int main()
{
    TList* list = NULL;
 
    Push(&list, "Ivanov", 22);
    Push(&list, "Petrov", 20);
    Push(&list, "Pavlov", 21);
    Push(&list, "Avdeev", 19);
 
    Print(list);
 
    return 0;
}
Ошибка при добавлении записи по возрастанию в двусвязный список


Результат выполнения на codepad.org
0
Ульяниус
1 / 1 / 0
Регистрация: 15.08.2013
Сообщений: 132
26.09.2013, 01:25  [ТС] 3
for (; cur->next && (cur->next->years <= years); cur = cur->next) { ;}
я не понимаю этого кода, а именно, почему после скобок стоит точка с запятой?
зачем в конце стоит { ;}?
откуда взялась переменная cur?
Я так поняла, что эта программа сортирует существующий список? а мне нужно, чтобы вновь добавленная строка, введенная с клавиатуры была вставлена по возрасту в порядке возрастания...
если у вас есть время, посмотрите мой дополненный код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
struct spis
 {char name [15];
 int god;
  struct spis *v1;//предыдущий
  struct spis *v2;//последующий
 };
 void create (void);
 void scan (struct spis *); 
 void sort (struct spis *);
 struct spis * head, * tail; 
 main()
 {
  char k;
  while(1)
  {
    clrscr ();
   puts ("1 - создать");
   puts ("2 - просмотр");
  puts ("4 - добавлять записи в порядке возрастания");
   puts ("0 - выход");
   k = getch ();
   switch (k)
   {
    case '1':create (); break;
    case '2':scan (head); break;
    case '4': sort (head); break;
    case '0': {free (head); return 0;}
    default: puts ("*Ошибка");
   }
  }
 }
 void create (void)
 {
  char key;
  struct spis *p, *pred;
  pred=NULL;
  do
    {
     p=(struct spis *) malloc(sizeof(struct spis));
     printf("\n Фамилия: ");
     gets (p->name);
     printf("\n год рождения: ");
     scanf ("%d",&p->god);
     fflush(stdin);
     p->v1=pred;
     if (pred!=NULL)
       pred->v2=p;  
     else   
       head=p; 
     pred=p;
     printf("\n закончить ввод? <Esc> \n");
    }
  while (getch()!=27);
  tail=p;
  tail->v2=NULL;
 }
void scan (struct spis *p)
{int i=0;
 clrscr();
 printf ("\n N     фамилия");
 printf ("\n год рождения");
 if (p==head)
  {
   while (p!=NULL)
    {i++;
     printf ("\n %d",i);
     printf(" %15s %4d", p->name, p->god);
     p=p->v2;
    }
   }
  else
   if (p==tail)
     while (p!=NULL)
       {
    i++;
    printf ("\n %d",i);
    printf("\n %15s  %4d", p->name, p->god);
    p=p->v1;
       }
   else
    printf("\n ЌҐўҐа*л© *¤аҐб ");
 getch();
}
 void  sort (struct spis *p)
{
  char key;
  struct spis *ps;
  ps=NULL;
  do
    {
     ps=(struct spis *) malloc(sizeof(struct spis)); 
     printf("”*¬Ё«Ёп: ");
     gets (ps->name);
     printf("ѓ®¤ ஦¤Ґ*Ёп: ");
     scanf ("%d",&ps->god);
     fflush(stdin);
 
     if (p==NULL)
      {
    ps->v2=p;
    ps->v1=NULL;
    p->v2=ps;
    head=ps;
    tail=ps;
       }
     else if (p->god<=ps->god)
       p=p->v2;
      else if (p==head)
          {
        ps->v1=NULL;
        ps->v2=p;
        p->v1=ps;
        head=ps;
          }
          else if(p==tail)
           {
            ps->v1=tail;
            ps->v2=NULL;
            p->v2=ps;
            tail=ps;
           }
          else
           {
            ps->v1=p->v1;
            ps->v2=p;
            p->v1=ps;
           }
    printf("\n закончить ввод? <Esc> \n");
   }
   while (getch()!=27);
   getch();
   scan(head);
  }
Добавлено через 2 минуты
TList* Push(TList** list, const char* name, size_t years)
Что означает здесь двойная звездочка? я знаю что это ссылка на указатель, но не совсем понимаю указатель чего, на что ссылается и как это работает.
Зачем здесь переменная size_t years? Вы хотите сказать, что в конечном списке надо выводить на экран не год рождения, а возраст?

Добавлено через 45 минут
почему после скобок стоит точка с запятой?
вот здесь разобралась, потому как начального условия в операторе цикла нет

Добавлено через 4 часа 26 минут
в общем, помощь уже не нужна, нашла ошибки...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2013, 01:25

Переделать двусвязный список в односвязный список
//--------------------------------------------------------------------------- ...

Ошибка сегментации при добавлении узла бинарного дерева
делал реализацию добавления узла в бинарное дерево, но ловлю сегфолт, почему ?...

Двусвязный список
Нужно &quot;склеить&quot; 2 списка в третий список по следующему правилу: сначала идет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru