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

Динамическая структура данных - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
20.05.2011, 00:35     Динамическая структура данных #1
Есть динамическая структура
Код
struct comp
{
	char num[10];
	comp* next; //Ссылка на следущий элемент списка
};

struct dyn_list
{
	comp* head; // Первый элемент списка
	comp* tail; // Последний элемент списка
};
есть поиск компонента в списке по имени
Код
comp* search(dyn_list l, char *n)
{
	while (l.head != NULL)
	{
		if (!strcmp(l.head->num,n))
			return l.head;
		l.head = l.head->next;
	}
	return l.head;
}
Код
int main()
{
	char* buf_num = new char[10];
        // Динамический список
	dyn_list vars;
	ifstream* inp = new ifstream("1.txt");
	// считали в vars
	constr_list(vars);
	while (!inp->eof())
	{
		inp->getline(buf_num, 10, ' ');
		comp_in(vars, buf_num);
	}
	inp->close();
// теперь ищем параметр со значением 111
	comp* p = new comp();
	p = search(vars, "111");
	if (p)
	{
Вопрос такой: как осуществить вывод найденного элемента?
а именно подскажите как этот вывод описать в отдельной функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
20.05.2011, 01:27     Динамическая структура данных #2
C++
1
2
3
4
void prin (comp * p) {
 printf ("%s\n", p->num);
 printf ("%x\n", p->next);
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.05.2011, 11:01     Динамическая структура данных #3
C++
1
2
3
4
5
6
7
8
9
10
comp* search(dyn_list l, char *n)
{
        while (l.head != NULL)
        {
                if (!strcmp(l.head->num,n))
                        return l.head;
                l.head = l.head->next;
        }
        return l.head;
}
неправильно, head нельзя перемещать
нужно создать указатель, присвоить ему значение из l.head, а потом перемещать его
иначе поиск меняет список
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
20.05.2011, 17:51  [ТС]     Динамическая структура данных #4
Код
comp* search(dyn_list l, char *n)
{
	comp* w = new comp();
	while (l.head != NULL)
	{
		if (!strcmp(l.head->num,n))
			return l.head;
		w=l.head;
		w=w->next;
	}
	return l.head;
}
так?
vlad_ltd
3 / 3 / 0
Регистрация: 30.04.2011
Сообщений: 51
20.05.2011, 18:05     Динамическая структура данных #5
Могу ошибаться, но помоему,
C++
1
2
w=l.head;
w=w->next;
точно так же и перемещает head, так как ты присваеваешь указателю адрес, а не значение пременной.
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
20.05.2011, 19:03  [ТС]     Динамическая структура данных #6
Цитата Сообщение от vlad_ltd Посмотреть сообщение
Могу ошибаться, но помоему,
C++
1
2
w=l.head;
w=w->next;
точно так же и перемещает head, так как ты присваеваешь указателю адрес, а не значение пременной.
а как исправить?
vlad_ltd
3 / 3 / 0
Регистрация: 30.04.2011
Сообщений: 51
20.05.2011, 21:17     Динамическая структура данных #7
C++
1
*w=l.head;
Так выглядит присвоение значения переменной указателю, а тебе надо присвоить весь список, извени, конкретнее не подскажу, уже еле соображаю, выходные начались ))
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
20.05.2011, 21:24  [ТС]     Динамическая структура данных #8
Цитата Сообщение от vlad_ltd Посмотреть сообщение
C++
1
*w=l.head;
w описана как
C++
1
comp* w = new comp();
вряд ли это верно
[BCC32 Error] File1.cpp(62): E2034 Cannot convert 'comp *' to 'comp'
vlad_ltd
3 / 3 / 0
Регистрация: 30.04.2011
Сообщений: 51
20.05.2011, 23:07     Динамическая структура данных #9
удалил пост
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.05.2011, 06:09     Динамическая структура данных #10
Цитата Сообщение от fen1ksss Посмотреть сообщение
Код
comp* search(dyn_list l, char *n)
{
	comp* w = new comp();
	while (l.head != NULL)
	{
		if (!strcmp(l.head->num,n))
			return l.head;
		w=l.head;
		w=w->next;
	}
	return l.head;
}
так?

C++
1
2
3
4
5
6
7
8
9
10
11
comp *search(dyn_list l, char *n)
{
    comp *w = l.head;
 
    while (w != NULL) {
        if (strcmp(w->num, n) == 0)
        return w;
    w = w->next;
    }
    return NULL;
}
vlad_ltd
3 / 3 / 0
Регистрация: 30.04.2011
Сообщений: 51
21.05.2011, 14:39     Динамическая структура данных #11
Нет, точно не так, потому что, *w имеет тип структуры comp, а l.head тип структуры dyn_list, и присвоить *w любое значение типа dyn_list нельзя. *w может принять значения только типа comp.
Попробуй так:

C++
1
dyn_list* w = new dyn_list();
И после уже присваивай значение l.head указателю w
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
21.05.2011, 15:35  [ТС]     Динамическая структура данных #12
записал так, все отлично работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
comp* search(dyn_list l, char *n)
    {
        comp* w = new comp();
        w=l.head;
        while (w != NULL)
        {
            if (!strcmp(w->num,n))
                return w;
            w = w->next;
        }
        return w;
    }
всем спасибо
vlad_ltd
3 / 3 / 0
Регистрация: 30.04.2011
Сообщений: 51
21.05.2011, 15:49     Динамическая структура данных #13
---------------------------------------------------------------------------------
Нет, точно не так, потому что, *w имеет тип структуры comp, а l.head тип структуры dyn_list, и присвоить *w любое значение типа dyn_list нельзя. *w может принять значения только типа comp.
Попробуй так:

C++
1
dyn_list* w = new dyn_list();
И после уже присваивай значение l.head указателю w

-------------------------------------------------------------
Посмотри как я нахожу первый элимент массива num[10] структуры comp, с помошью l.head структуры dyn_list, может поможет.
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
#include<iostream>
 
using namespace std;
 
struct comp
{
    char num[10];
    comp *p;
};
struct dyn_list
{
    char* head; // Первый элемент списка
        char* tail; // Последний элемент списка
};
 
int main()
{
    comp a;
    dyn_list l;
    l.head = new char;
    for (int i=0;i<10;i++)
        cin>>a.num[i];
//  a.p = new comp;
    l.head[0]=a.num[0];
    cout<<"p1="<<l.head[0]<<endl;
    system("pause");
    return 0;
}
В таком виде l.head не изменяет список
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.05.2011, 02:44     Динамическая структура данных #14
Цитата Сообщение от fen1ksss
записал так, все отлично работает
у тебя ошибка - утечка памяти
C++
1
2
    comp* w = new comp();
    w = l.head;
C++
1
    comp *w = l.head;
идентификатор и звёздочка являются частью описателя

Добавлено через 2 минуты
Цитата Сообщение от vlad_ltd
Нет, точно не так, потому что, *w имеет тип структуры comp, а l.head тип структуры dyn_list
l.head - указатель на структуру comp
прочитай объявление структуры dyn_list
fen1ksss
2 / 2 / 0
Регистрация: 16.09.2010
Сообщений: 71
22.05.2011, 15:11  [ТС]     Динамическая структура данных #15
Цитата Сообщение от accept Посмотреть сообщение
у тебя ошибка - утечка памяти

C++
1
    comp *w = l.head;
идентификатор и звёздочка являются частью описателя
то есть вот так правильно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2011, 02:32     Динамическая структура данных
Еще ссылки по теме:

C++ Динамическая структура данных Очередь
Динамическая структура данных (Стек) C++
C++ Динамическая структура данных в форме односвязного списка на основе указателей

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.05.2011, 02:32     Динамическая структура данных #16
не нужно выделять память
указатель - это переменная, хранящая адрес
в данном случае адрес будет меняться в ней, а не в l.head
следовательно, после вызова функции список останется в первоначальном виде
Yandex
Объявления
23.05.2011, 02:32     Динамическая структура данных
Ответ Создать тему
Опции темы

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