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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5
Похожие ответы