#include <iostream>
struct slist {
int val;
slist* next;
};
void slist_remrep(slist*& lst);
void slist_copy(slist*& lst, const int* fa, const int* la);
void slist_clear(slist* lst);
int main(void){
slist* L = NULL;
int a[] = {0,0,0,0,1,1,2,2,2,3,4,4,4,4,5,5,6,7,7,7};
slist_copy(L, a, a + sizeof(a)/sizeof(a[0]));
slist_remrep(L);
for(const slist* p = L; p != NULL; p = p->next)
std::cout << p->val << ' ';
std::cout << std::endl;
slist_clear(L);
return 0;
}
//удаление подряд идущих одинаковых значений
void slist_remrep(slist*& lst){
slist* t, *i, *j, *p = lst;
while(p != NULL){
i = p->next;
while((i != NULL) && (i->val == p->val))
i = i->next;
if(i != p->next){
j = p->next;
while(j != i){
t = j;
j = j->next;
delete t;
}
p = p->next = i;
continue;
}
p = p->next;
}
}
//копирование массива
void slist_copy(slist*& lst, const int* fa, const int* la){
slist* p, *t = NULL;
lst = NULL;
while(fa != la){
p = new (std::nothrow) slist();
if(p == NULL)
break;
p->val = *fa++;
p->next = NULL;
if(lst == NULL)
lst = t = p;
else {
t->next = p;
t = p;
}
}
}
//удаление всех
void slist_clear(slist* lst){
slist* t;
while(lst != NULL){
t = lst;
lst = lst->next;
delete t;
}
}