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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
oinari
 Аватар для oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
16.05.2010, 00:14     Двунаправленный список #1
Вопросы:
Почему ругается при таком описании, говорит ; пропустил
C++
1
spis_fam * Create_first(char *); //формирование первого элемента
Сама программа:
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
//--------------------------------------------------
#include "stdafx.h"
#include <iostream>
//--------------------------------------------------
#define main_menu "MENU\n1.Create\n2.View\n3.Search\n4.Insert and remove of information\n5.Exit\nInput: "
//--------------------------------------------------
using namespace std;
//--------------------------------------------------
spis_fam * Create_first(char *); //формирование первого элемента
//--------------------------------------------------
struct spis_fam //шаблон структуры
{
    char fam[15];
    spis_fam * next;
    spis_fam * prev;
};
int main()
{
    char * input_fam = new char [15]; //созд-е динамической строки
    //опеределение указателей на начало и конец списка
    spis_fam * pbeg;
    spis_fam * pend;
    unsigned short choice; //переменная выбора
     while(true)
    {
        system("CLS"); //очистка экрана
        cout << main_menu;
        cin >> choice;
        switch(choice) //переключатель
        {
            case 1 : //формирование первого элемента
                cout << "Input family: ";
                gets(input_fam); //читаем строчку
                pbeg = Create_first(input_fam); //адрес полученной структуры присваиваем указателю на начало
                pend = pbeg; //ук-лю на начало списка, присваиваем конец, т.е. список заканчивается как только началался
            default : cout << "\nWatch the pressed keys!\n>";
        }
    } 
    
    delete [] input_fam; //освобождаем память
    return 0;
}
//--------------------------------------------------
spis_fam* Create_first(char * family) //формирование первого элемента
{
    spis_fam * pv = new spis_fam; //выделяем память под структуру, адрес присваиваем соотв. указателю
    strcpy(pv->fam, family);
    pv->next=0;
    pv->prev=0;
    return pv;
}
//--------------------------------------------------
/
Лог ошибок:
1>------ Build started: Project: test2, Configuration: Debug Win32 ------
1>Compiling...
1>test2.cpp
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(9) : error C2143: syntax error : missing ';' before '*'
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(9) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(9) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(21) : error C2065: 'pbeg' : undeclared identifier
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(22) : error C2065: 'pend' : undeclared identifier
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(34) : error C2065: 'pbeg' : undeclared identifier
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(35) : error C2065: 'pend' : undeclared identifier
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(35) : error C2065: 'pbeg' : undeclared identifier
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(44) : error C2143: syntax error : missing ';' before '*'
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(44) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(44) : error C2086: 'int spis_fam' : redefinition
1> c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(9) : see declaration of 'spis_fam'
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(45) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(46) : error C2065: 'pv' : undeclared identifier
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(46) : error C2061: syntax error : identifier 'spis_fam'
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(47) : error C2065: 'pv' : undeclared identifier
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(47) : error C2227: left of '->fam' must point to class/struct/union/generic type
1> type is ''unknown-type''
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(48) : error C2065: 'pv' : undeclared identifier
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(48) : error C2227: left of '->next' must point to class/struct/union/generic type
1> type is ''unknown-type''
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(49) : error C2065: 'pv' : undeclared identifier
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(49) : error C2227: left of '->prev' must point to class/struct/union/generic type
1> type is ''unknown-type''
1>c:\users\timur\documents\visual studio 2008\projects\test2\test2\test2.cpp(50) : error C2065: 'pv' : undeclared identifier
1>Build log was saved at "file://c:\Users\Timur\Documents\Visual Studio 2008\Projects\test2\test2\Debug\BuildLog.htm"
1>test2 - 21 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Объясните пожалуйста как исправить ошибки... Хотелось бы также всесторонние рекомендации услышать. Спасибо за внимание.

Добавлено через 7 часов 48 минут
так никто и не поможет? ...
может книги тогда посоветуете... по спискам...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2010, 00:14     Двунаправленный список
Посмотрите здесь:

C++ Двунаправленный список
Двунаправленный список C++
C++ Двунаправленный список!
Двунаправленный список C++
C++ двунаправленный список.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
16.05.2010, 00:40     Двунаправленный список #2
oinari, сначала структуру объявите, а потом функцию.
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
16.05.2010, 00:41     Двунаправленный список #3
опоздал
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
16.05.2010, 00:45     Двунаправленный список #4
Monte-Cristo, в каком смысле?
Функция принимает указатель на строку и возвращает указатель на структуру. В этом плане всё нормально. Просто объявление типа данных (в этом случае структуры) должно быть перед объявлением функции, возвращающей указатель на этот тип данных.
oinari
 Аватар для oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
16.05.2010, 10:30  [ТС]     Двунаправленный список #5
easybudda, работает! странно как-то, я думал компилятору не важно... впредь больше не буду допускать таких ошибок. Спасибо!
oinari
 Аватар для oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
22.05.2010, 13:35  [ТС]     Двунаправленный список #6
И снова здраствуйте, нужна помощь по функциям:
1) выводит мусор
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
//--------------------------------------------------
int remove_all(spis_fam * pbeg) //удаление всего списка
{
    spis_fam * tmp;
    while (pbeg != NULL)
        {
            tmp = pbeg->next;
            delete pbeg;
            pbeg = tmp;
        }
    cout << "\nDone!";
    return 0;
}
//--------------------------------------------------
spis_fam * fun_elements(spis_fam * b, char * delete_fam) //удаление из списка заданную фамилию
{
    spis_fam * d;
    if (strcmp(b->fam, delete_fam))
    {
        d=b;
        b=b->next;
        delete d;
        return b;
    }
    return b;
}
//--------------------------------------------------
Голова
C++
1
2
3
4
5
6
struct spis_fam //шаблон структуры
{
    char fam[15];
    spis_fam * next;
    spis_fam * prev;
};
Вызов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
case 6 : 
                {
                    system("CLS");
                    cout << "Input the Surname for search: ";
                    cin >> delete_fam;
                    pbeg=fun_elements(pbeg, delete_fam);
                    cout << "\nDone!";
                    break;
                }
            case 7 : 
                {
                    system("CLS");
                    remove_all(pbeg);
                    break;
                }
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
22.05.2010, 15:49     Двунаправленный список #7
Цитата Сообщение от oinari Посмотреть сообщение
if (strcmp(b->fam, delete_fam))
Во-первых функция strcmp() возвращает 0, если строки одинаковые. То есть условие должно выглядеть как-то так
C
1
if ( ! strcmp(b->fam, delete_fam) )
Во-вторых из двухсвязного списка элементы удаляются хитрее
C
1
2
3
4
5
6
7
8
...
if ( b->prev )
  b->prev->next = b->next;
if ( b->next )
  b->next->prev = b->prev;
delete b;
b = NULL;
...
oinari
 Аватар для oinari
5 / 5 / 0
Регистрация: 18.10.2009
Сообщений: 69
23.05.2010, 13:45  [ТС]     Двунаправленный список #8
Не получается реализовать... не знаю как. Ещё вопрос, на что указывает
C++
1
pbeg->prev->next
не понятно, если не сложно в картинках объяснить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int remove_all(spis_fam * pbeg) //удаление всего списка
{
 
 
    while (pbeg != NULL)
        {
            if ( pbeg->prev )
                pbeg->prev->next = pbeg->next;
            if ( pbeg->next )
                pbeg->next->prev = pbeg->prev;
            delete pbeg;
            pbeg = NULL;
        }
    cout << "\nDone!";
    return 0;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2010, 16:26     Двунаправленный список
Еще ссылки по теме:

Двунаправленный список C++
C++ Двунаправленный список

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.05.2010, 16:26     Двунаправленный список #9
oinari, когда удаляется весь список, этим можно не заморачиваться. Если удаляется один элемент из списка, происходит следующее:
C
1
2
if ( b->prev )
  b->prev->next = b->next;
если элемент не первый в списке, его поле prev указывает на предыдущий объект. Поле next предыдущего объекта указывает на удаляемый. Нужно, чтобы после предыдущего объекта шёл тот, на который указывает поле next удаляемого. Аналогично с объектом после удаляемого (если он есть)...
Yandex
Объявления
23.05.2010, 16:26     Двунаправленный список
Ответ Создать тему
Опции темы

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