Двусвязный список, добавление в указанное место - C (СИ)
Формулировка задачи:
#include <stdio.h> #include <stdlib.h> #include "malloc.h" #include "locale.h" struct stack { int info; struct stack *next; } *start=0,*end=0; void dobavlenie(); void vivod(); void maximal(); void udalenie(); int main() { setlocale(LC_ALL,"rus"); int a; do { printf("\n"); printf("1.Добавить запись в указаное место\n"); printf("2.Удаленить запись из начала\n"); printf("3.Вывести список\n"); printf("4.Значение максимального элемента\n"); printf("5.Выход из программы\n"); printf("\n"); scanf("%d",&a); switch(a) { case 1:printf("\n");dobavlenie();;break; case 3:printf("\n");vivod();break; case 2:printf("\n");udalenie();break; case 4:printf("\n");maximal();break; }; } while(a!=5); free(start); return 0; } void dobavlenie() { struct stack *temp; int a; temp=(struct stack*) malloc(sizeof(struct stack)); if(end) { end->next=temp; } temp->next=NULL; printf("Запись: "); scanf("%d",&a); temp->info=a; end=temp; if(!start) start=end; } void vivod() { struct stack *temp; temp=start; while(temp) { printf("%d\n",temp->info); temp=temp->next; } } void maximal() { int max=start->info; for(struct stack *temp=start->next;temp;temp=temp->next) { if(max<temp->info) { max=temp->info; } } printf("%d\n",max); } void udalenie() { struct stack *temp; if(start) temp=start->next; else return; free(start); start=temp; }
void dobavlenie(int n) { struct stack *temp=start; for(;n && temp;n--) temp=temp->next; if(!temp) return;
Пардон, односвязный список
Решение задачи: «Двусвязный список, добавление в указанное место»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <locale.h> #define MAX_NODES 5 enum OPERATION { ADD, DELETE }; struct node//узлы списка, будут передаваться для удаления и добавления в любые места { int info; struct node* next; }; struct forward_list { struct node* begin_node;//начальный узел unsigned size;//размер списка }; void init(struct forward_list* const list) { list->begin_node = 0; list->size = 0; } struct node* add(struct forward_list* list,struct node* elem,const int value)//добавление в любое место,если передан нулевой адрес добавить в начало { struct node* new_node = (struct node*)malloc(sizeof(struct node)); new_node->info = value; if(elem)//передан валидный узел { new_node->next = elem->next; elem->next = new_node; } else { new_node->next = list->begin_node; list->begin_node = new_node; } ++list->size; return new_node; } unsigned del(struct forward_list* list,struct node* elem)//удаление следущего узла после elem, если elem == 0 удаляем первый узел { struct node* del_struct; if(elem) { del_struct = elem->next; if(del_struct) elem->next = del_struct->next; else return 0x0; } else { if(list->begin_node) { del_struct = list->begin_node; list->begin_node = list->begin_node->next; } else return 0x0; } --list->size; free(del_struct); return 0x1; } void print(struct forward_list* list)//распечатка всего списка { if(list->size) { for(struct node* temp = list->begin_node;temp;temp=temp->next) printf("%d\n",temp->info); } else printf("Список пуст!\n"); } void max(struct forward_list* const list) { if(list->size) { int max = list->begin_node->info; for(struct node* temp = list->begin_node;temp;temp=temp->next) { if(max<temp->info) max=temp->info; } printf("%d\n",max); } else printf("Список пуст!\n"); } void destroy(struct forward_list* const list) { struct node* temp = list->begin_node; while(temp) { struct node* current = temp->next; free(current); --list->size; temp = current; } } void ptr_offset(struct node** nodes,unsigned pos,unsigned size,const enum OPERATION operation) { if(operation)//удаление { for(;pos < size;++pos) nodes[pos] = nodes[pos+1]; } else//добавление { for(;pos != size;--size) nodes[size] = nodes[size-1]; } } void check_value(unsigned* value,unsigned min,unsigned max) { do { scanf("%d",value); getchar(); }while(*value < min || *value > max); } int main() { setlocale(LC_ALL,"RUS"); struct forward_list list; init(&list); struct node* nodes[MAX_NODES]; int answer; do { printf("\n"); printf("1.Добавить запись в указаное место\n"); printf("2.Удалить запись из указаного места\n"); printf("3.Вывести список\n"); printf("4.Значение максимального элемента\n"); printf("5.Выход из программы\n"); printf("\n"); scanf("%d",&answer); getchar(); switch(answer) { case 1: { if(list.size < MAX_NODES) { struct node* new_node = 0; int value; unsigned menu_count = 1; unsigned menu_select,num_of_nodes; num_of_nodes = 0; printf("1.Добавить запись в начало\n"); if(list.size) { printf("2.Добавить запись в указаное место\n"); ++menu_count; } check_value(&menu_select,1,menu_count); if(menu_select != 1) { printf("%u узла, введите номер узла(от 1 - до %u)после которого добавить:",list.size,list.size); check_value(&num_of_nodes,1,list.size); new_node = nodes[num_of_nodes-1]; } printf("Введите число для записи:"); scanf("%d",&value); getchar(); new_node = add(&list,new_node,value); ptr_offset(nodes,num_of_nodes,list.size-1,ADD); nodes[num_of_nodes] = new_node; } else printf("Массив узлов переполнен!\n"); break; } case 2: { if(list.size) { struct node* del_node = 0; unsigned menu_count = 1; unsigned menu_select,num_of_nodes; num_of_nodes = 0; printf("1.Удалить запись из начала\n"); if(list.size > 1) { printf("2.Удалить запись из указаного места\n"); ++menu_count; } check_value(&menu_select,1,menu_count); if(menu_select != 1) { printf("%u узла, введите номер узла(от 1 - до %u)после которого удалять:",list.size,list.size-1); check_value(&num_of_nodes,1,list.size-1); del_node = nodes[num_of_nodes-1]; } if(del(&list,del_node)) ptr_offset(nodes,num_of_nodes,list.size,DELETE); } else printf("Список пуст!\n"); break; } case 3: { printf("\n"); print(&list); break; } case 4: { printf("\n"); max(&list); break; } } }while(answer!=5); destroy(&list); return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д