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


Автор: Zaulyx 28.12.2008, 14:29
Код

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>

#define FALSE 0
#define TRUE 1

typedef struct item
{
    int data;
    struct item *next;
}
Item;

void Add(void);
void DeleteAll(void);
void Del_Element(void);
void Display(void);
void Clear(void);

Item *head = NULL, *tail = NULL;

main()
{
    int done = FALSE;
    char c;

    while (!done) {
        printf("\n\nAdd.................(A)\nClear...............(C)\nDelete_Element......(D)\nDisplay.............(S)\nQuit................(Q)\n");
        c = getch();
        switch (toupper(c)) {
            case 'A':
                Add();
                break;
            case 'C':
                DeleteAll();
                break;
            case 'Q':
                done = TRUE;
                break;
            case 'D':
                 Del_Element();
                 break;
            case 'S' :
                 Display();
                 break;
        }
    }
    printf("\n");
    Clear();
    return 0;
}

void Add(void)
{
    Item* p;
    int dtt;
    p = (Item *)malloc(sizeof(Item));
    printf("vvedite data: ");
    scanf("%d", &dtt);
    p->data = dtt;
    p->next = NULL;
    if (head == NULL)
        head = p;
    else
        tail->next = p;
    tail = p;
}

void DeleteAll(void)
{
    Item* p = head;

    if (head != NULL) {
        head = head->next;
        if (head = NULL)
            tail = NULL;
        free(p);
    }
}


void Display(void)
{
    Item* p = head;

    if (p == NULL)
        printf("\nQueue is empty");
    else
        printf("\nQueue: ");
    while (p != NULL) {
        printf("\n%d", p->data);
        p = p->next;
    }
}

void Clear(void)
{
    Item *p = head;

    while (head != NULL) {
        head = head->next;
        free(p);
        p = head;
    }

}

void Del_Element(void)
{
Item* p = head;
if (head != NULL)
head=head->next;
}



как мне сделать так чтобы работать можно с любым количеством очередей??Хелп плз. Завтра сдавать

Автор: mes 28.12.2008, 14:44
Цитата(Zaulyx @  28.12.2008,  14:29 Найти цитируемый пост)
как мне сделать так чтобы работать можно с любым количеством очередей??


Item *head = NULL, *tail = NULL; - упаковать в структуру,  и передавать ее инстанцию в качестве аргумента в функции.

Автор: pan2004 28.12.2008, 14:46
Цитата(Zaulyx @  28.12.2008,  14:29 Найти цитируемый пост)
как мне сделать так чтобы работать можно с любым количеством очередей

Наверно, для начала избавиться от глобальных переменных и сделать так, чтобы функции принимали нужные им параметры, и возвращали результат например:
Код

Item* Enqueue(Item* tail = NULL)
{
    Item* p;

    p = (Item *)malloc(sizeof(Item));
    p->data = rand();
    p->next = NULL;
    if (tail)
        tail->next = p;
    return p;
}


Добавлено через 1 минуту и 55 секунд
PS
Код

void Del_Element(void)
{
Item* p = head;
if (head != NULL)
head=head->next;
}

Утечка памяти. Упс...

Автор: Zaulyx 28.12.2008, 15:13
т.е мне во все функции запихать вместо void     Item* tail = NULL  ?? и возвращать p ?? 

Автор: pan2004 28.12.2008, 15:19
Цитата(Zaulyx @  28.12.2008,  15:13 Найти цитируемый пост)
во все функции

С умом конечно надо делать, а не от балды. Посмотреть, каким функциям что для работы надо - соответственно и писать аргументы. Посмотреть, что из них имеет смысл возвращать. Приведенная мной функция - только в качестве примера, и простым копипастом тут наврятли обойдешься.
Потом, после проведенного рефакторинга, я думаю реально будет сделать еще один массив(список) этого списка. Вот собственно и все.

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