Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с задачей, Динамические списки 
:(
    Опции темы
PNNA
Дата 20.12.2015, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.10.2015

Репутация: нет
Всего: нет



Скажите где ошибка(не выводит второй prosmotr)


Код
#include <iostream>
using namespace std;
struct spisok
{
    char file[25];
    int day;
    int month;
    int year;
    int turns;
    spisok* next;
};
void insert(spisok* Q)
{
    spisok* Item= new spisok;
    printf("Введите имя файла =  ");
    scanf("%s",Item->file);
    printf("Введите дату создания =  ");
    scanf("%d.%d.%d",&Item->day,&Item->month,&Item->year);
    printf("Введите количество просмотров =  ");
    scanf("%d",&Item->turns);
    Item->next=Q->next;
    Q->next=Item;
}

void create(spisok* &first,int N)
{
    spisok* pray=new spisok;
    first=pray;    
    printf("------------\n");
    printf("Запись №1\n");
    printf("Введите имя файла =  ");
    scanf("%s",pray->file);
    printf("Введите дату создания =  ");
    scanf("%d.%d.%d",&pray->day,&pray->month,&pray->year);
    printf("Введите количество обращений к файлу =  ");
    scanf("%d",&pray->turns);
    printf("------------\n");
    for(int i=1; i<N; i++)
    {
        printf("Запись №%d\n",i+1);
        insert(pray);
        pray=pray->next;    
        printf("------------\n");
    }
}

void prosmotr(spisok* first)
{    
    printf("------------\n");
    printf("          ПРОСМОТР\n");    
    spisok* first1 = first;    
    while(first1!=NULL)
    {
        printf("Файл: %s     ; Дата создания: %d.%d.%d     ; Просмотры: %d\n", first1->file,first1->day,first1->month,first1->year,first1->turns);
        first1=first1->next;
        
    }
    printf("------------\n");
}
int main()
{
    setlocale(LC_ALL,".1251");
    int n;
    spisok* first=NULL;    
    cout << "Количество записей =  ";
    cin >> n;
    create(first,n);    
    prosmotr(first);
    prosmotr(first);
}


Модератор: Не забываем пользоваться кнопочкой "Код"

Это сообщение отредактировал(а) bsa - 22.12.2015, 18:11
PM MAIL   Вверх
bsa
Дата 22.12.2015, 18:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Чему равен указатель next последнего элемента (учти, что insert у тебя вставляет в начало списка)?
Чтобы таких проблем не было, а так же не было дублирования кода, рекомендую сделать функцию create, которая выделяет память, инициализирует поля структуры (обязательно: next = NULL) и возвращает указатель на нее. А функция insert принимает указатель на список и на добавляемую структуру.
PM   Вверх
feodorv
Дата 23.12.2015, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(bsa @  22.12.2015,  18:19 Найти цитируемый пост)
Чему равен указатель next последнего элемента (учти, что insert у тебя вставляет в начало списка)?

В коде хитро вызывается insert для последнего элемента в списке, поэтому insert вставляет элемент в конец списка. Но вот, действительно, в начале функции create поле next у самого первого создаваемого элемента списка не инициализирован никак:
Цитата(PNNA @  20.12.2015,  13:12 Найти цитируемый пост)
    spisok* pray=new spisok;
    first=pray;    
    printf("------------\n");
    printf("Запись №1\n");
    printf("Введите имя файла =  ");
    scanf("%s",pray->file);
    printf("Введите дату создания =  ");
    scanf("%d.%d.%d",&pray->day,&pray->month,&pray->year);
    printf("Введите количество обращений к файлу =  ");
    scanf("%d",&pray->turns);
    pray->next = 0;
    printf("------------\n");

А значение этого поля наследуется каждым новым вставляемым элементом:
Цитата(PNNA @  20.12.2015,  13:12 Найти цитируемый пост)
    Item->next=Q->next;

В результате получаем ответ на поставленный вопрос - Чему равен указатель next последнего элемента - мусором. Список с конца не закрыт.



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Toyamatokanava
Дата 30.12.2015, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.10.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Как вариант можно так.


Код

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;
struct spisok
{
    char file[25];
    int day;
    int month;
    int year;
    int turns;
    spisok * next;
    
};
 spisok *head;
void insert( spisok *&first)
{
    spisok* Item = new spisok;
    printf("Введите имя файла = ");
    scanf("%s", Item->file);
    printf("Введите дату создания");
    scanf("%d.%d.%d", &Item->day, &Item->month, &Item->year);
    printf("Введите количество просмотров = ");
    scanf("%d", &Item->turns);
    Item->next = head;
    head = Item;
    first = Item;
}
void create(spisok * &first, int N)
{
    spisok * pray = new spisok;

    head = NULL;
    pray->next = head;
    head = pray;

    printf("--------\n");
    printf("Запись №1\n");
    printf("Введите имя файла = ");
    scanf("%s", pray->file);
    printf("Введите дату создания");
    scanf("%d.%d.%d", &pray->day, &pray->month, &pray->year);
    printf("Введите количество обращений к файлу = ");
    scanf("%d", &pray->turns);
    printf("-------------\n");
    for (int i = 1; i<N; i++)
    {
        printf("Запись №%d\n", i + 1);
        insert( first);

        printf("---------------\n");
    }

}
void prosmotr(spisok *&first)
{
    printf("--------------\n");
    printf("                 Просмотр\n");

    for (int i = 0; first;i++)
    {
    
        printf("Файл: %s     ; Дата содания:  %d.%d.%d   ;  Просмотры:  %d\n",
            first->file, first->day, first->month, first->year, first->turns);
        first = first->next;
    }
    


}
int main(int argc, _TCHAR* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int n;
    spisok * first = NULL;
    cout << "Количество записей = : ";
    cin >> n;
    create(first, n);
    prosmotr(first);
    system("pause");
    return 0;
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1863 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.