Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2017, 01:37   #1
SanyaSid
Новичок
Джуниор
 
Регистрация: 24.04.2017
Сообщений: 1
Вопрос Функция в односвязном списке

Здравствуйте. На СИ реализовал функцию "perenos", которая переставляет N элементов из начала односвязного списка в конец.
Представил как происходит связывание ссылок и описал их в функции "perenos", но по факту, она делает не то, что надо: если 2 ввожу, то ничего не происходит, если 3/4/5, то удаляет вроде столько последних эл-тов. За сутки не понял что не так. В чем ошибка, когда я связываю ссылки, помогите, пожалуйста?
PHP код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>


typedef struct node
{
    
int data;
    
float fldata;
    
struct node *next;
ITEM;

typedef struct headd
{
    
ITEM *first;
    
ITEM *last;
}
HEAD;


ITEMadd_node(ITEMheadint new_datafloat new_fldata)
{
    
ITEM *new_item, *prev;
    
int n;
    
clrscr();
    
puts("Punct 1: vvod novogo elementa");

    
new_item=(ITEM *)malloc(sizeof(ITEM));
    if(
new_item==NULL)
    {
        
puts("Error of videleniya memory");
        return 
head;
    }
    
new_item->data=new_data;
    
new_item->fldata=new_fldata;
    if(
head==NULL)
    {
        
puts("Spisok sozdan");
        
new_item->next=NULL;
        
n++;
        
getch();
        return 
new_item;
    }
    if(
head->data<new_data)
    {
        
printf("Elementi %d i %f vstavlen v nachalo spicka\n",new_datanew_fldata);
        
new_item->next=head;
        
getch();
        
n++;
        return 
new_item;
    }
    
prev=head;
    while(
prev->next!=NULL)
    {
        if(
prev->next->data<new_data)
        {
            
printf("Elem. %d i %f vst. v sered. spiska\n",new_datanew_fldata);
            
new_item->next=prev->next;
            
prev->next=new_item;
            
getch();
            
n++;
            return 
head;
        }
        else
        {
            
prev=prev->next;
        }
    }
    
printf("Elementi %d i %f vst. v kon. spiska\n ",new_datanew_fldata);
    
prev->next=new_item;
    
new_item->next=NULL;
    
getch();
    
n++;
    return 
head;
}

ITEM *delete_node(ITEM *headint N)
{
    
ITEM *cur, *prev, *elem;
    
int i=0;
    
prev=NULL;
    for(
i=0;i<N-1;i++)
    {
        
cur=cur->next;
        
printf("Udalenie elementa %d i %f\n ",cur->datacur->fldata);
        
free(cur);
        
getch();
    }
    
elem=cur->next;
    
printf("Udalenie elementa %d i %f\n ",cur->datacur->fldata);
    
free(cur);
    
head=elem;
    
getch();
    return 
head;
}


ITEMfind_node(ITEMheadint find_data)
{
    
ITEM *cur;
    
cur=head;
    while(
cur!=NULL && cur->data>=find_data)
    {
        if(
cur->data==find_data)
        {
            
printf("Elem %d naiden\n",find_data);
            
getch();
            return 
cur;
        }
        
cur=cur->next;
    }
    
printf("Elem %d NE nauden \n",find_data);
    
getch();
    return 
NULL;
}


ITEMvivod_node(ITEMhead)
{
    
ITEM *cur;
    
cur=head;
    while(
cur!=NULL)
    {
        
printf("|%-4.d %-2.2f|\n",cur->datacur->fldata);
        
cur=cur->next;
    }
    
getch();
    return 
NULL;
}

ITEMperenos(ITEMheadHEADheaddint A)
{
    
ITEM *cur, *elem1;
    
HEADfpast=headd->first;
    
HEADlpast=headd->last;
    
int i=0;
    
cur=head;
    for(
i=0;i<A;i++)
        
cur=cur->next;
    
elem1=cur->next;
    
cur->next=NULL;
    
headd->first=elem1;
    
headd->last=cur;
    
lpast->next=fpast;
}




int main(int n)
{
    
ITEM *Head=NULL;
    
HEAD *Headd;
    
char key;
    
int a,N,a2,A;
    
float fl;
    while(
1)
    {
        
clrscr();
        
puts("1 - Dobavit");
        
puts("2 - Udalit");
        
puts("3 - Nauti");
        
puts("4 - Vivod");
        
puts("5 - Perenos N perv el-tov v konets");
        
puts("ESC - Vihod");
        
key=getch();
        switch(
key)
        {
        case 
'1':
            
puts("Vvedite tseloe i veshestv. chisla");
            
scanf("%d  %f",&a, &fl);
            
Head=add_node(Head,a,fl);
            break;
        case 
'2':
            
puts("Vvedite nomer elementa po kotoriy\nnujno udalit'(ne vkluchitelno)");
            
scanf("%d",&N);
            
Head=delete_node(Head,N);
            break;
        case 
'3':
            
puts("Vvedite chislo");
            
scanf("%d",&a2);
            
find_node(Head,a2);
            break;
        case 
'4':
            
puts("Vivod vseh elementov");
            
vivod_node(Head);
            break;
        case 
'5':
            
puts("Skolko el-tov perenesti v konets?");
            
scanf("%d",&A);
            
perenos(Head,Headd,A);
            break;
        case 
27:
            return 
0;
        }
    }
    return 
0;

SanyaSid вне форума Ответить с цитированием
Старый 27.04.2017, 12:42   #2
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Опустите мне веки, что за стиль кода...
Во-первых, нигде не устанавливаются указатели на первый и последний элементы списка в структуре Headd, там мусор какой-то, недостаточно просто объявить структуру с полями first и last, это так не работает.
Во-вторых, fpast=headd->first и lpast=headd->last не имеют типа HEAD *, скорее ITEM *.
В-третьих, функция переноса в таком виде (если поправить указатели) переносит не A элементов, а A+1.
Ну и вообще, код не очень. Хотя мне вот это понравилось
Код:
puts("Error of videleniya memory");
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 27.04.2017, 13:15   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от alexander13 Посмотреть сообщение
Хотя мне вот это понравилось
да, это однозначно шедевр!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
исправить код в односвязном списке svetik290895 Помощь студентам 0 13.05.2015 19:44
Удаление узлов в односвязном списке Niklitel Помощь студентам 1 01.03.2014 14:41
Последовательный поиск в односвязном списке vo0vka Помощь студентам 2 01.12.2012 23:49
Очистка памяти в односвязном списке Sigwey Помощь студентам 0 28.12.2010 17:02
Поиск в односвязном списке DOJ Общие вопросы C/C++ 6 04.10.2009 13:34