Двусвязный список, добавление в указанное место - 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;
}