Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
oinari
5 / 5 / 3
Регистрация: 18.10.2009
Сообщений: 69
#1

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

16.05.2010, 00:14. Просмотров 1411. Ответов 8
Метки нет (Все метки)

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

Двунаправленный список
Помогите пожалуйста удалить заданный элемент из двунаправленного списка......

Двунаправленный список
Вставка элемента в список. Удалениеэлемента из списка Сортировка списка. Поиск...

двунаправленный список
Используя двунаправленный список, написать программу сложения двух длинных...

Двунаправленный список
Люди, объясните пжлст, что такое двунаправленный список?

двунаправленный список
Двунаправленный список.Найти сумму первого и последнего элементарных.Заранее...

СД Двунаправленный список
Ребят помогите пожалуйста понять что значит сделать двунаправленный список...

8
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
16.05.2010, 00:40 #2
oinari, сначала структуру объявите, а потом функцию.
1
Monte-Cristo
2794 / 1380 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
16.05.2010, 00:41 #3
опоздал
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
16.05.2010, 00:45 #4
Monte-Cristo, в каком смысле?
Функция принимает указатель на строку и возвращает указатель на структуру. В этом плане всё нормально. Просто объявление типа данных (в этом случае структуры) должно быть перед объявлением функции, возвращающей указатель на этот тип данных.
1
oinari
5 / 5 / 3
Регистрация: 18.10.2009
Сообщений: 69
16.05.2010, 10:30  [ТС] #5
easybudda, работает! странно как-то, я думал компилятору не важно... впредь больше не буду допускать таких ошибок. Спасибо!
0
oinari
5 / 5 / 3
Регистрация: 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;
                }
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
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;
...
0
oinari
5 / 5 / 3
Регистрация: 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;
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
23.05.2010, 16:26 #9
oinari, когда удаляется весь список, этим можно не заморачиваться. Если удаляется один элемент из списка, происходит следующее:
C
1
2
if ( b->prev )
  b->prev->next = b->next;
если элемент не первый в списке, его поле prev указывает на предыдущий объект. Поле next предыдущего объекта указывает на удаляемый. Нужно, чтобы после предыдущего объекта шёл тот, на который указывает поле next удаляемого. Аналогично с объектом после удаляемого (если он есть)...
0
23.05.2010, 16:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2010, 16:26
Привет! Вот еще темы с решениями:

Двунаправленный список!
Не Класс! Помогите создать список (Двунаправленный хоронящий int a ) сама...

двунаправленный список.
Доброго времени суток. Прощу помочь с заданием которое звучит так : Построить...

Двунаправленный список
Чемпион мира по футболу. Страна, год последней победы, число побед. Сортировка...

Двунаправленный список
Как в этом списке поменять ввод элементов с ручного на рандомный, помогите...


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

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

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