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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
#1

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

26.06.2012, 00:18. Просмотров 616. Ответов 9
Метки нет (Все метки)

Здравствуйте. Не могу понять что не так почему программа не выводит весь список?Помогите пожалуйста кто чем может
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 программа ещё не вся решил начать только с чтения и вывода. а так ещё надо будет слияние двух списков и поиск и запись.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2012, 00:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамический однонаправленный список (C++):

Добавить в список элемент после элемента с заданным инф.полем [Однонаправленный список] - C++
Вообщем есть: Функция создание списка Функции вывода на экран Функция добавление элемента с номером k А нужно ввести...

однонаправленный список - C++
попалась веселая задачка. &quot;построить функцию преобразующую заданный однонаправленный список в аналогичный список где элементты...

однонаправленный список - C++
Помогиде дописать программу. Формируется однонаправленный список, заполняется (int). теперь надо как то передрать его и удалить все...

однонаправленный список - C++
Ребятушки милые мои :) Помогите решить задачу !!! Даны натуральное число n и однонаправленный список, содержащий действительные...

Однонаправленный Список - C++
Как написать ф-ю добавления в конец элемента в однонаправленном списке?

однонаправленный список - C++
чем отличаеться point *p; p=new(point); от p=new point; ???

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5419 / 4815 / 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 строке он используется.
0
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 есть логика в рассуждениях.... Нечего толком сверху я добавить быстро не смогу.
0
alsav22
5419 / 4815 / 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) После этого работает.
1
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
26.06.2012, 09:44  [ТС] #5
Спасибо большое теперь работает!
0
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;
}
0
Миниатюры
Динамический однонаправленный список  
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
26.06.2012, 11:45  [ТС] #7
Что то я ничего не понимаю, если читать по отдельности списки то всё хорошо, если читать с писки по очереди то появляются не понятные числа не известного для меня происхождения
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.06.2012, 17:25 #8
Цитата Сообщение от Diabolisk Посмотреть сообщение
притом что в одном файле лежит 1 2 3 4 а в другом 6 7 8 9
Насчёт двух файлов не пойму. Где у тебя второй?
0
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")
0
alsav22
5419 / 4815 / 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.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 00:06
Привет! Вот еще темы с ответами:

Однонаправленный список - C++
Задача:Создать линейный однонаправленный список из целых чисел.Вставить в список последний четный элемент после каждого нечетного элемента....

Однонаправленный список - C++
Есть задание - перегрузка операций. Дается 3 штуки Однонаправленный список с элементами типа char доступ к элементу в...

однонаправленный список - C++
point* make_point( int n) { point *begin,*posl; posl=NULL; int i; for(i=0;i&lt;n;i++) { if(posl==NULL) { posl=new point;

Однонаправленный список - C++
Организовать ввод в однонаправленный список. Узел списка состоит из двух полей: целое число и указатель. Необходимо удалить из списка...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.06.2012, 00:06
Ответ Создать тему
Опции темы

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