Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Двухсвязные списки?


Автор: Baton2007 11.9.2008, 20:47
Как удалить k узел ? Правильно я написал или нет? Подскажите как правильно!
Удаление узла
Код
#include <stdlib.h>
#include <windows.h>
#include <iostream>
struct Node {
char str[40];
int num;
Node *next;
};
Node st1 = { "xxx", 1 },
     st2 = { "yyy", 2 },
     st3 = { "zzz", 3 };
void DeleteNode(Node node) ;

int main()
{
    typedef Node *PNode;
    int q;
    printf("Vvedite nomep yzla posle kotorogo udalat");
    scanf("%d",&q);
    void Delete(PNode &Head,PNode &Tail,PNode OldNode);
}

M
bsa
Не забываем пользоваться кнопкой "код"

Автор: SHraybikus 11.9.2008, 21:16
Цитата(Baton2007 @ 11.9.2008,  20:47)
Как удалить k узел ? Правильно я написал или нет? Подскажите как правильно!
Удаление узла
#include <stdlib.h>
#include <windows.h>
#include <iostream>
struct Node {
char str[40];
int num;
Node *next;
};
Node st1 = { "xxx", 1 },
     st2 = { "yyy", 2 },
     st3 = { "zzz", 3 };
void DeleteNode(Node node) ;

int main()
{
    typedef Node *PNode;
    int q;
    printf("Vvedite nomep yzla posle kotorogo udalat");
    scanf("%d",&q);
    void Delete(PNode &Head,PNode &Tail,PNode OldNode);
}

Смысл будет очевиден если добавишь к листингу комментарии  smile !

Автор: IKM2007 11.9.2008, 21:36
Во первых это не двухсвязанный список.
Во вторых, используй кнопку КОД.
Цитата(Baton2007 @  11.9.2008,  20:47 Найти цитируемый пост)
Как удалить k узел ? Правильно я написал или нет? Подскажите как правильно!

А где определение функции 
Код

void DeleteNode(Node node) ;
?

Автор: vinter 11.9.2008, 21:47
Baton2007, кончено правильно, я доавили к твоему коду еще пару ф-ий
Код

#include <stdlib.h>
#include <windows.h>
#include <iostream>
struct Node {
char str[40];
int num;
Node *next;
};
Node st1 = { "xxx", 1 },
     st2 = { "yyy", 2 },
     st3 = { "zzz", 3 };
void DeleteNode(Node node) ;
void AddNode(Node node) ;
void PrintList(List list);
void EmptyList(List list);

int main()
{
    typedef Node *PNode;
    int q;
    printf("Vvedite nomep yzla posle kotorogo udalat");
    scanf("%d",&q);
    void Delete(PNode &Head,PNode &

Автор: Ches 12.9.2008, 07:30
1. Почему тема называется "Двусвязные списки"? Я вижу только односвязный
2. 
Цитата(vinter @  11.9.2008,  21:47 Найти цитируемый пост)
struct Node {char str[40];int num;Node *next;};Node st1 = { "xxx", 1 },     st2 = { "yyy", 2 },     st3 = { "zzz", 3 };void DeleteNode(Node node) ;void AddNode(Node node) ;void PrintList(List list);void EmptyList(List list);

Создание класса навязывается само собой, методы сделать статическими
3.
Код

int num;
Node *next;

Если num - "номер элемента", то зачем next?

Автор: monax 14.10.2008, 20:49
Цитата(Ches @  12.9.2008,  07:30 Найти цитируемый пост)
1. Почему тема называется "Двусвязные списки"? Я вижу только односвязный

Да нет списка вообще. Я вижу структуру с указателем, чтоб сделать список, нужно его сформировать.

Цитата(Ches @  12.9.2008,  07:30 Найти цитируемый пост)
Создание класса навязывается само собой, методы сделать статическими

Зачем статическими?

Цитата(Ches @  12.9.2008,  07:30 Найти цитируемый пост)
Если num - "номер элемента", то зачем next? 

А по списку (когда он будет создан) как перемещаться? Номер не поможет, перемещение по списку идёт при помощи указателя на следующий или предыдущий элемент.

Автор: XmdY 21.10.2008, 23:19
Двухсвязные(у нас их называют двунаправленные) списки в себе должны включать ссылку на предыдущий и последующий элементы.

что-то типа этого:



Код

struct Item {
    Item *next, *prev;
    int key;
};

Item *addItem(int key, Item *item) {
    if (key > 0) {
        Item *addItem = new Item;
        addItem->key = key;
        if (item == NULL) {
            return addItem;
        }
        Item *temp = item;
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = addItem;
        addItem->prev = temp;
    }
    return item;
}

Item *deleteItemByKey(int key, Item *item) {
    if (item == NULL) {
        return item;
    }
    Item *temp = item;
    while (temp->next != NULL) {
        if (temp->key == key) {
            if (temp->prev != NULL) {
                temp->prev->next = temp->next;
                delete temp;
                return item;
            } else {
                Item *fr = temp->next;
                delete temp;
                return fr;
            }
            break;
        } else {
            temp = temp->next;
        }
    }
    return item;
}

Item *deleteItemByPosition(int position, Item *item) {
    int i = 1;
    if (position > 0) {
        Item *temp = item;
        while (temp->next!=NULL) {
            if(position==i){
                item = deleteItemByKey(temp->key, item);
                break;
            }else{
                temp = temp->next;
                i++;
            }
        }
    }
    return item;
}


Проверять было лень на работоспособность, но нарушений логики кажется нигде нет))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)