[ create a new paste ] login | about

Link: http://codepad.org/iqgCw7nv    [ raw code | output | fork ]

C++, pasted on Dec 13:
#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;
	}
}


Output:
1
0 1 2 3 4 5 6 7 


Create a new paste based on this one


Comments: