Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- //создаем звено
- typedef struct Node{
- void *value;
- struct Node *next;
- struct Node *prev;
- } Node;
- //создаем двусвязный список
- typedef struct DblLinkedList{
- size_t size;
- Node *head;
- Node *tail;
- };
- //добавление в конец
- void pushBack(DblLinkedList *list, void *data){
- Node *tmp = (Node*)malloc(sizeof(Node));
- if (tmp == NULL){
- exit(3);
- }
- tmp->value = data;
- tmp->next = NULL;
- tmp->prev = list->tail;
- if (list->tail){
- list->tail->next = tmp;
- }
- list->tail = tmp;
- if (list->head == NULL){
- list->head = tmp;
- }
- list->size++;
- }
- //создаем экземпляр структуры
- DblLinkedList* createDblLinkedList(){
- DblLinkedList *tmp = (DblLinkedList*)malloc(sizeof(DblLinkedList));
- tmp->size = 0;
- tmp->head = tmp->tail = NULL;
- return tmp;
- }
- //удаляем структуру
- void DeleteDblLinkedList(DblLinkedList **list){
- Node *tmp = (*list)->head;
- Node *next = NULL;
- while (tmp){
- next = tmp->next;
- free(tmp);
- tmp = next;
- }
- free(*list);
- (*list) = NULL;
- }
- //получение н-ого ??
- Node* getNthq (DblLinkedList *list, size_t index){
- Node *tmp = NULL;
- size_t i;
- if (index < list->size / 2){
- i = 0;
- tmp = list->head;
- while(tmp && i < index){
- tmp = tmp ->next;
- i++;
- }
- } else {
- i = list->size - 1;
- tmp = list ->tail;
- while(tmp && i > index){
- tmp = tmp->prev;
- i--;
- }
- }
- return tmp;
- }
- //удаление из н-ого места
- void* deleteNth(DblLinkedList *list, size_t index){
- Node *elm = NULL;
- void *tmp = NULL;
- elm = getNthq(list, index);
- if (elm == NULL){
- exit(1);
- }
- if (elm->prev){
- elm->prev->next = elm->next;
- }
- if (elm->next){
- elm->next->prev = elm->prev;
- }
- if (!elm->prev){
- list->head = elm->next;
- }
- if (!elm->next){
- list->tail = elm->prev;
- }
- free(elm);
- list->size--;
- return tmp;
- }
- // Удаление введеного с клавиатуры
- Node* getNth(DblLinkedList *list, void* n) {
- Node *tmp = list->head;
- size_t i = 0;
- while (tmp) {
- if (*((float*)tmp->value) != *((float*)(n))){
- tmp = tmp->next;
- i++;
- } else {
- Node *tmp2 = tmp->next;
- deleteNth(list, i);
- if (!tmp2){
- break;
- }
- tmp = tmp2->next;
- i++;
- //break;
- }
- }
- return tmp;
- }
- //печать
- void printDblLinkedList(DblLinkedList *list, void (*fun)(void*)) {
- Node *tmp = list->head;
- while (tmp){
- fun(tmp->value);
- tmp = tmp->next;
- }
- cout<<endl;
- }
- void printFloat (void *value){
- cout<<*(float*) value<<" ";
- }
- //создание списка из массива
- DblLinkedList* fromArray(void *arr, size_t n, size_t size) {
- DblLinkedList *tmp = NULL;
- size_t i = 0;
- if (arr == NULL){
- exit(2);
- }
- tmp = createDblLinkedList();
- while (i < n){
- pushBack(tmp, ((char*)arr+i*size));
- return tmp;
- }
- }
- int main() {
- DblLinkedList *list = createDblLinkedList();
- float a, b, c, d, e, f,g;
- a = 10;
- b = 20;
- c = 30;
- d = 40;
- e = 50;
- f = 60;
- g = 0;
- pushBack(list, &a);
- pushBack(list, &b);
- pushBack(list, &c);
- pushBack(list, &d);
- pushBack(list, &e);
- pushBack(list, &f);
- printDblLinkedList(list, printFloat);
- cout<<"Vvedi chislo: ";
- cin>>g;
- getNth(list, &g);
- printDblLinkedList(list, printFloat);
- cout<<"length "<<list->size<<endl;
- cout<<"head "<<*((float*)(list->head->value))<<endl;
- cout<<"tail "<<*((float*)(list->tail->value))<<endl;
- DeleteDblLinkedList(&list);
- /*char c;
- float a;
- for (;;) {
- cout << "Vvesti element? (y/n) ";
- cin>>c;
- if (c == 'n') break;
- cout << "Vvedite chislo tipa float: ";
- cin >> a;
- pushBack(list, &a);
- } */
- return 0;
- }
- /*float a, b, c, d, e, f, g, h;
- a = 10.3;
- b = 20.9;
- c = 30.5;
- d = 40.6;
- e = 50.7;
- f = 60.8;
- g = 70.9;
- h = 80.4;
- pushBack(list, &d);
- pushBack(list, &e);
- pushBack(list, &f);
- printDblLinkedList(list, printFloat);
- cout<<"length "<<list->size<<endl;
- cout<<"nth 2 "<<*((float*)(getNthq(list, 2))->value)<<endl;
- cout<<"nth 5 "<<*((float*)(getNthq(list, 5))->value)<<endl;
- cout<<"head "<<*((float*)(list->head->value))<<endl;
- cout<<"tail "<<*((float*)(list->tail->value))<<endl;
- cout<<"legth "<<list->size<<endl;
- printDblLinkedList(list, printFloat);
- printDblLinkedList(list, printFloat);
- deleteNth(list, 0);
- printDblLinkedList(list, printFloat);
- DeleteDblLinkedList(&list); */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement