Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2010, 13:05   #1
ordoss
Пользователь
 
Регистрация: 03.01.2010
Сообщений: 41
По умолчанию [C] Однонаправленный список

Саму идею списка я понимаю, но вот как его реализовать программно? Например удаление елемента из однонаправленного списка?
Буду благодарен любой помощи
ordoss вне форума Ответить с цитированием
Старый 30.01.2010, 13:37   #2
Namolem
Oo
Форумчанин
 
Аватар для Namolem
 
Регистрация: 10.10.2009
Сообщений: 350
По умолчанию

начиная от указателя на первый элемент проходим по всему списку
если совпал номер/значение следующего элемента с удаляемым, то
следующий для текущего будет равен следующему для удаляемого
ptemp = curr->next; // запоминаем адрес удаляемого элемента
curr->next = curr->next->next;
delete ptemp ; // освобождаем память

как-то так

Последний раз редактировалось Namolem; 30.01.2010 в 13:39.
Namolem вне форума Ответить с цитированием
Старый 30.01.2010, 13:47   #3
ordoss
Пользователь
 
Регистрация: 03.01.2010
Сообщений: 41
По умолчанию

Я так понимаю, что curr - указатель на первые елемент списка, а ptemp - на удаляемый
Но вот как присвоить этим указателям нужные елементы?

Последний раз редактировалось ordoss; 30.01.2010 в 13:53.
ordoss вне форума Ответить с цитированием
Старый 30.01.2010, 14:01   #4
Namolem
Oo
Форумчанин
 
Аватар для Namolem
 
Регистрация: 10.10.2009
Сообщений: 350
По умолчанию

curr это указатель на текущий элемент. Вначале он равен указателю на первый, для перехода на следующий элемент нужно увеличить его значение на 1
curr++;
ptemp - временный элемент для хранения адреса памяти удаляемого элемента. после выполнения
curr->next = curr->next->next;
удаляемый элемент из списка пропал, но его память все еще помечена как занятая.
Namolem вне форума Ответить с цитированием
Старый 30.01.2010, 14:13   #5
ordoss
Пользователь
 
Регистрация: 03.01.2010
Сообщений: 41
По умолчанию

Цитата:
Сообщение от Namolem Посмотреть сообщение
curr это указатель на текущий элемент. Вначале он равен указателю на первый, для перехода на следующий элемент нужно увеличить его значение на 1
curr++;
а как огласить указатель на первый елемент?
ordoss вне форума Ответить с цитированием
Старый 30.01.2010, 14:22   #6
Namolem
Oo
Форумчанин
 
Аватар для Namolem
 
Регистрация: 10.10.2009
Сообщений: 350
По умолчанию

указатель на первый элемент создается вместе с списком и вместе с указателем на последний определяет список
Namolem вне форума Ответить с цитированием
Старый 30.01.2010, 14:22   #7
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
#include <iostream.h>

struct MyStruct
{
        int x;
        MyStruct *next;
};

int main()
{
        MyStruct *p = NULL, *first, *obj, *temp;

        first = NULL;

        for(int i = 1; i <= 3; i++)
                {
                        obj = new MyStruct;
                        obj->x = i;
                        obj->next = first;
                        first = obj;
                }

        p = first;
        while(p)
                {
                        cout << p->x << "\n";
                        p = p->next;
                }

        cout << "\n\n";

        p = first;
        while(p)
                {
                        if(p->x == 2)
                                temp->next = p->next;
                        temp = p;
                        p = p->next;
                }

        p = first;
        while(p)
                {
                        cout << p->x << "\n";
                        p = p->next;
                }

        cin.get();

        return 0;
}

Последний раз редактировалось profi; 30.01.2010 в 14:41.
profi вне форума Ответить с цитированием
Старый 30.01.2010, 14:35   #8
ordoss
Пользователь
 
Регистрация: 03.01.2010
Сообщений: 41
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Код:
#include <iostream.h>

struct MyStruct
{
        int x;
        MyStruct *next;
};

int main()
{
        MyStruct *p = NULL, *first, *obj;

        first = NULL;

        for(int i = 1; i <= 3; i++)
                {
                        obj = new MyStruct;
                        obj->x = i;
                        obj->next = first;
                        first = obj;
                }

        p = first;
        while(p)
                {
                        cout << p->x << "\n";
                        p = p->next;
                }

        cin.get();

        return 0;
}
Большое спасибо,насколько я понимаю *first - указатель на первый елемент, а на что указывают *p и *obj?
ordoss вне форума Ответить с цитированием
Старый 30.01.2010, 14:43   #9
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Да, указатель first указывает на первый элемент, я подправил пост, и добавил удаление элемента списка. p - с помощью этого указателя выводим список, obj - выделяем под этот указатель память для создание элемента списка.
profi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Однонаправленный неоднородный (гетерогенный) список с однородными подсписками. Chudo4258 Помощь студентам 22 08.03.2009 19:11
Данные-проверка-список (список на другом листе) Inbox Microsoft Office Excel 7 26.12.2008 01:43