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

Оставить в списке только первые вхождения одинаковых элементов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ описать функцию, которая заменяет все вхождения элемента http://www.cyberforum.ru/cpp-beginners/thread349233.html
В составе программы описать функцию, которая заменяет в списке все вхождения элемента E1, значение которого введено с клавиатуры, на эле-мент E2, значение которого также введено с клавиатуры.
C++ Определить, является ли матрица магическим квадратом Дана целая квадратная матрица n-го порядка. Определить, является ли она магическим квадратом, т.е. такой, в которой суммы элементов во всех строках и столбцах одинаковы. #include <stdio.h>... http://www.cyberforum.ru/cpp-beginners/thread349212.html
Запутался в флагах C++
Запутался в флагах, переменная rez вычисляется некорректно. Подскажите, как избавиться от ошибки, а ещё лучше, показать правильный код программы :-#include <iostream.h> #include <iomanip.h>...
C++ Принадлежит ли точка фигуре
Определить принадлежность точки областям, обозначенным прописными буквами A и B. Строчными буквами обозначены определяемые пользователем параметры рисунка. Координаты точки x и y и другие параметры...
C++ Небольшая проблема с классами http://www.cyberforum.ru/cpp-beginners/thread349167.html
Всем привет. Дано задание: Расширить иерархию классов с использованием виртуального абстактного класса в качестве основы иерархии. Определить в классе статическую компоненту - указатель на начало...
C++ Задача на суммарное количество В лавке у вампира стоит несколько банок с кровью, четные и не четные. Четные записываются по арифметической прогрессии, в зависимости от дней, а не четные - по формуле 2*d+1 где d - количество дней.... подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
08.09.2011, 11:15
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <stdio.h>
#include <stdlib.h>
 
#define FREE(PTR) free(PTR), (PTR) = NULL
 
struct node
{
    int data;
    struct node* next;
};
 
struct queue
{
    struct node* head;
    struct node* tail;
};
 
void create(struct queue*);
void delete(struct queue*);
void enqueue(struct queue*, int);
void unique(struct queue*);
int dequeue(struct queue*);
int empty(struct queue*);
void print(struct queue*);
 
int main(int argc, char* argv[])
{
    int i;
    int val;
 
    struct queue queue;
    
    if(argc == 1)
    fputs("No data\n", stderr), exit(1);
 
    create(&queue);
    
    for(i = 1; i < argc; ++i)
    {
    val = atoi(argv[i]);
    enqueue(&queue, val);
    }
    
    puts("Before removing duplicates:");
    print(&queue);
    unique(&queue);
    puts("After removing duplicates:");
    print(&queue);
    delete(&queue);
 
    exit(0);
}
 
void create(struct queue* l)
{
    l->head = l->tail = NULL;
}
 
void delete(struct queue* l)
{
    struct node* n;
    while(l->head != NULL)
    {
    n = l->head;
    l->head = l->head->next;
    FREE(n);
    }
}
 
void enqueue(struct queue* l, int elem)
{
    struct node* n;
    n = malloc(sizeof(struct node));
    n->data = elem;
    n->next = NULL;
    if(l->head == NULL)
    l->head = n;
    else
        l->tail->next = n;
    l->tail = n;
}
 
int dequeue(struct queue* l)
{
    struct node* n;
    int retval;
    n = l->head;
    if(n == NULL)
    abort();        /* тут обрабока случая с пустым списком */
    retval = n->data;
    l->head = l->head->next;
    FREE(n);
    return retval;
}
 
void unique(struct queue* l)
{
    struct node *p, *q, *last;
    p = l->head;
    while(p != NULL)
    {
    last = p;
    q = last->next;
    while(q != NULL)
    {
        if(q->data == p->data)
        {
        last->next = q->next;
        FREE(q);
        q = last->next;
        }
        else
        {
        last = q;
        q = q->next;
        }
    }
    p = p->next;
    }
}
 
int empty(struct queue* l)
{
    return l->head != NULL;
}
 
void print(struct queue* l)
{
    struct node* n;
    n = l->head;
    while(n != NULL)
    {
    printf("%d ", n->data);
    n = n->next;
    }
    
    putchar('\n');
}
Код
[nameless@desktop c]$ ./sample 1 2 3 4
Before removing duplicates:
1 2 3 4 
After removing duplicates:
1 2 3 4 
[nameless@desktop c]$ ./sample 2 2 2 2
Before removing duplicates:
2 2 2 2 
After removing duplicates:
2 
[nameless@desktop c]$ ./sample 1 2 3 3 2 4
Before removing duplicates:
1 2 3 3 2 4 
After removing duplicates:
1 2 3 4 
[nameless@desktop c]$
Обработку ошибочных ситуаций (невыделение памяти, удаление элементов из пустой очереди) сделаешь сам
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru