Форум программистов, компьютерный форум CyberForum.ru

Динамический однонаправленный список - C++

Восстановить пароль Регистрация
 
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
26.06.2012, 00:18     Динамический однонаправленный список #1
Здравствуйте. Не могу понять что не так почему программа не выводит весь список?Помогите пожалуйста кто чем может
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
typedef struct Node
            {
              int ch;
              int it;
              struct Node *next;
            }pNode;
 
pNode *all,*first,*second;
 
int c, count = 0, z = 0;
int openfileandread(pNode **fir){
    FILE *f1;pNode *Last;
    clrscr();
 
//perviy spisok
 
Last = (pNode*)malloc(sizeof(pNode));
**fir=*Last;
printf("asdasd");
f1 = fopen("input.txt","r");
while ((fscanf(f1,"%d",&c))!=EOF)
{ fscanf(f1,"%d",&Last->it);
  (*Last).ch = c;
  //count++;
  Last->next = (pNode*)malloc(sizeof(pNode));
  Last = (*Last).next;
}
//(*Last).next = NULL;
//*fir=*Last;
return 0;
}
//vivod sch
void printNode(pNode *fir){
pNode *Curr;
Curr =fir;
while (Curr!=fir)
{ z++;
if(count+1!=z)
printf("\t%d\t%d",(*Curr).ch,(*Curr).it);
Curr = (*Curr).next;
}
}
main(){
       int openfileandread(pNode **fir);
       openfileandread(&first);
    printNode(first);
    return 0;
}
P.S программа ещё не вся решил начать только с чтения и вывода. а так ещё надо будет слияние двух списков и поиск и запись.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2012, 00:18     Динамический однонаправленный список
Посмотрите здесь:

однонаправленный список C++
C++ однонаправленный список
C++ однонаправленный список
Однонаправленный список C++
C++ Однонаправленный список
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.06.2012, 02:46     Динамический однонаправленный список #2
У меня при запуске на 22 строке нарушение прав доступа при записи. Если написать так: *fir = Last;, то проходит дальше. Распечатывает "asdasd". Потом не может выйти из цикла while.

Добавлено через 47 минут
Из цикла программа не выходила, потому что в файле были не числа. Сейчас выходит, но в функции printNode() нет захода в цикл while. И как он может быть, если условие работы цикла Curr != fir, а строкой выше Curr = fir.

Добавлено через 16 минут
Наверное, должно быть что-то такое: while (Curr != NULL)

Добавлено через 5 минут
count в 28 строке закоментирован, а должен считать. В 42 строке он используется.
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
26.06.2012, 02:58     Динамический однонаправленный список #3
Зачем в мейне этот прототип:
C++
1
      int openfileandread(pNode **fir);
в описании функции наверно лучше вот так:
C++
1
int openfileandread(pNode *fir){...}
Да только глянул у alsav22 есть логика в рассуждениях.... Нечего толком сверху я добавить быстро не смогу.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.06.2012, 03:03     Динамический однонаправленный список #4
В общем, так. Исправить 22 строку: *fir = Last; Раскомментировать 28 count++; и 32 (*Last).next = NULL; . 40 исправить: while (Curr != NULL) После этого работает.
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
26.06.2012, 09:44  [ТС]     Динамический однонаправленный список #5
Спасибо большое теперь работает!
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
26.06.2012, 10:19  [ТС]     Динамический однонаправленный список #6
Сейчас работаю над слиянием двух списков в один по не понятной причине получается вот такой результат http://www.cyberforum.ru/attachment....1&d=1340691305
притом что в одном файле лежит 1 2 3 4 а в другом 6 7 8 9
вот код функции создания возник вопрос как сделать так что бы оба списка были в другом списке при том что бы они не были уничтожены.
C++
1
2
3
4
5
6
7
8
9
10
void slivanie(pNode *fir,pNode  *Last){
    printf("\n\n");
    *fir=*first;
    *Last=*second;
    *(fir->next)=*Last;
    while(fir!=NULL){
        printf("\t%d\t%d",fir->ch,fir->it);
        fir=fir->next;
        }
       }
функция main теперь так выглядит
C++
1
2
3
4
5
6
7
8
9
main(){
       int openfileandread(pNode **fir);
       openfileandread(&first);
       openfileandread(&second);
       printNode(second);
    printNode(first);
    slivanie(first,second);
    return 0;
}
Миниатюры
Динамический однонаправленный список  
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
26.06.2012, 11:45  [ТС]     Динамический однонаправленный список #7
Что то я ничего не понимаю, если читать по отдельности списки то всё хорошо, если читать с писки по очереди то появляются не понятные числа не известного для меня происхождения
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.06.2012, 17:25     Динамический однонаправленный список #8
Цитата Сообщение от Diabolisk Посмотреть сообщение
притом что в одном файле лежит 1 2 3 4 а в другом 6 7 8 9
Насчёт двух файлов не пойму. Где у тебя второй?
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
26.06.2012, 18:45  [ТС]     Динамический однонаправленный список #9
Цитата Сообщение от Diabolisk Посмотреть сообщение
openfileandread(&second);
djn вот второй список читаемый


Цитата Сообщение от Diabolisk Посмотреть сообщение
openfileandread(&first);
вот первый я просто решил их так создавать. это же возможно?!

Добавлено через 17 минут
Аа забыл добавить что я в процедуру чтения из файла добавил несколько строк
C++
1
2
3
4
5
char filename[40];
   
printf("Write file open for read Note  ");
scanf("\t%s",&filename);
f1 = fopen(filename,"r")
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 00:06     Динамический однонаправленный список
Еще ссылки по теме:

однонаправленный список C++
C++ однонаправленный список
C++ Однонаправленный список

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2012, 00:06     Динамический однонаправленный список #10
С двумя файлами попозже разберусь. А пока, если написать функцию печати так:
C++
1
2
3
4
5
6
7
8
9
10
11
void printNode(pNode *fir)
{
    pNode *Curr;
    Curr = fir;
    while (count)
    { 
        printf("\t%d\t%d", (*Curr).ch, (*Curr).it);
        Curr = (*Curr).next;
        count--;
    }
}
, то должно работать. Но вызов функции openfileandread() и печать должны быть последовательны. То есть: openfileandread(&first); printNode(first);, потом openfileandread(&second); printNode(second);
Но мне кажется, что всё как-то не так должно делаться. Много непонятного в коде. Например, зачем вообще z?

Добавлено через 4 часа 29 минут
Вот этот код более правильный.
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
typedef struct Node
            {
              int ch;
              int it;
              struct Node *next;
            };
 
Node *s1;
Node *last_s1;
Node *s2;
Node *last_s2;
 
int openfileandread(Node **s, Node **s_last)
{
   FILE *f1;
   
   char filename[40];
   printf("Write file open for read Note  ");
   scanf("\t%s", &filename);
   f1 = fopen(filename, "r");
  
   Node *First = (Node*)malloc(sizeof(Node));
    
    if (!feof(f1))
    fscanf(f1, "%d%d", &(First -> ch), &(First -> it));
    First -> next = NULL;
    
    *s = First;
    
    Node *Last;
    Last = First;
    
    while (!feof(f1))
 { 
    Node *Next = (Node*)malloc(sizeof(Node));
    fscanf(f1, "%d%d", &(Next -> ch), &(Next -> it));
    Last -> next = Next;
    Last = Next;
}
   Last -> next = NULL;
   *s_last = Last;
   
   fclose(f1);
   return 0;
}
 
void printNode(Node *s)
{
    Node *Curr;
    Curr = s;
    while (Curr != NULL)
    { 
        printf("\t%d\t%d", Curr -> ch, Curr -> it);
        Curr = Curr -> next;
    }
    printf("\n");
}
 
void slivanie(Node *s1, Node  *s2, Node *last_s1, Node *last_s2)
{
    printf("\n\n");
    last_s1 -> next = s2;
    printNode(s1);
}
 
int main()
{
    openfileandread(&s1, &last_s1);
    openfileandread(&s2, &last_s2);
    printNode(s1);
    printNode(s2);
    
    slivanie(s1, s2, last_s1, last_s2);
    
    return 0;
}
Добавлено через 12 минут
Цитата Сообщение от Diabolisk Посмотреть сообщение
возник вопрос как сделать так что бы оба списка были в другом списке при том что бы они не были уничтожены.
Тут без копирования, наверное, не обойтись. Как вариант, можно организовать счётчики при создании элементов списка и, после слияния, при распечатке, выводить то количество данных, которое было в каждом списке. Адреса начала списков (откуда нужно будет начинать распечатку) сохранены в *s1, *s2.
Yandex
Объявления
27.06.2012, 00:06     Динамический однонаправленный список
Ответ Создать тему
Опции темы

Текущее время: 11:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru