Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51

Линейный однонаправленный список

05.09.2012, 01:59. Показов 3304. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем доброго времени не получается создать функцию слияния двух списков методом расчесок( допустим первый список 1 3 5 второй 2 4 6 а после слияния получилось 1 2 3 4 5 6) вот код программы посмотрите пожалуйста и подскажите что не так?
функция слияние называется сливание

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
        {
          //int ch;
          int it;
          struct Node *next;
        };
Node *fuck;
Node *s1;
Node *last_s1;
Node *s2;
Node *last_s2;
 
int openfileandread(Node **s, Node **s_last)
{
   FILE *f1;
 
   char filename[40];
   printf("Write file open for read Note  ");
   scanf("\t%s", &filename);
   f1 = fopen(filename, "r");
 
   Node *First = (Node*)malloc(sizeof(Node));
 
    if (!feof(f1))
    fscanf(f1, "%d", //&(First -> ch),
     &(First -> it));
    First -> next = NULL;
 
    *s = First;
 
    Node *Last;
    Last = First;
 
    while (!feof(f1))
 {
    Node *Next = (Node*)malloc(sizeof(Node));
    fscanf(f1, "%d", //&(Next -> ch),
    &(Next -> it));
    Last -> next = Next;
    Last = Next;
}
   Last -> next = NULL;
   *s_last = Last;
 
   fclose(f1);
   return 0;
}
 
void printNode(Node *s)
{
    Node *Curr;
    Curr = s;
    while (Curr != NULL)
    {
    printf("\t%d", //Curr -> ch,
    Curr -> it);
    Curr = Curr -> next;
    }
    printf("\n");
}
 
void slivanie(Node *s1, Node  *s2) ///Node *last_s1, Node *last_s2)
{    while(s1->next!=NULL){
    s1->next=s2;
    s2=s2->next;
    s1=s1->next;
    s1=s1->next;}}
 
 
 
 
 
 
 
 
 
    //last_s1 -> next = s2;
    //printNode(s1);
 
 
int main()
{
    openfileandread(&s1, &last_s1);
    openfileandread(&s2, &last_s2);
    printNode(s1);
    printNode(s2);
 
    slivanie(s1, s2);
    printNode(fuck);
 
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.09.2012, 01:59
Ответы с готовыми решениями:

Однонаправленный линейный список
здравствуйте! помогите помочь написать задача или киньте ссылку по её решению. &quot;однонаправленный линейный список. максимальный...

Линейный однонаправленный список
Есть программа, которая инициализирует, заполняет и удаляет список. При компиляции появляется ошибка, что c и m в функции main() не...

Линейный однонаправленный список
Добрый вечер! Задача: L – линейный однонаправленный список Проверить, упорядочены ли элементы списка по алфавиту. Подскажите...

19
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 02:25
Рассмотрим ваш же пример (1,3,5 и 2,4,6 -> 1,2,3,4,5,6,).

Есть 2 списка по 3 узла каждый. Вы пытаетесь слить всё в один список s1, но места не хватит. Можно создать ещё один список, в котором в итоге будет 6 узлов.
0
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 02:29  [ТС]
попробовал варианты были такие что либо один элемент из 1 списка все остальные из второго либо писал нул поинт асигмент

Добавлено через 1 минуту
вообще я хотел как но не получилось, так что бы в 1 список просто добавлять элементы второго и всё
0
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 02:51
Функция возвращает головной указатель на список слияния. Заметьте, что голова этого списка не содержит информации.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Node *slivanie (Node *s1, Node *s2){
   Node *cur_sl, *head_sl;
   
   head_sl = (Node *) malloc (sizeof (Node));
   head_sl -> next = NULL;
   cur_sl = head_sl;
   
   while (s1 != NULL || s2 != NULL){
      cur_sl -> next = (Node *) malloc (sizeof (Node));
      cur_sl = cur_sl -> next;
      cur_sl -> next = NULL;
      
      if (s1 == NULL)
         if (s2 != NULL)
            cur_sl -> it = s2 -> it;
      
      if (s2 == NULL)
         if (s1 != NULL)
            cur_sl -> it = s1 -> it;
      
      if (s1 -> it >= s2 -> it)
         cur_sl -> it = s1 -> it;
      else
         cur_sl -> it = s2 -> it;
         
      s1 = s1 -> next;
      s2 = s2 -> next;
   }
   
   return head_sl;
}
Проверьте, не компилил.
0
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 02:55  [ТС]
неа не получилось получился первый список
0
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 02:56
Покажите, как вы выводите список слияния.
0
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 02:59  [ТС]
printNode(s1);

Добавлено через 29 секунд
где printnode
C++
1
2
3
4
5
6
7
8
9
10
11
12
void printNode(Node *s)
{
    Node *Curr;
    Curr = s;
    while (Curr != NULL)
    {
    printf("\t%d", //Curr -> ch,
    Curr -> it);
    Curr = Curr -> next;
    }
    printf("\n");
}
0
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:02
Естественно выведется 1ый список, т.к. вы передаёте его в качестве параметра. Нужно
C
1
printNode (slivanie (s1, s2));
0
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:03  [ТС]
Аа это из-за того что возвращаем return head_sl;?
0
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:04
Мы формируем новый список, голову которого мы и должны передать.
0
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:06  [ТС]
хех сейчас вообще вышел вот такой результат 4 2 4 6 8
0
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:09
Подправил с учётом вашей функции вывода.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Node *slivanie (Node *s1, Node *s2){
   Node *list_sl;
   
   list_sl = (Node *) malloc (sizeof (Node));
   list_sl -> next = NULL;
   
   while (s1 != NULL || s2 != NULL){
      if (s1 == NULL)
         if (s2 != NULL)
            list_sl -> it = s2 -> it;
      
      if (s2 == NULL)
         if (s1 != NULL)
            list_sl -> it = s1 -> it;
      
      if (s1 -> it < s2 -> it){
         list_sl -> it = s1 -> it;
         s1 = s1 -> next;
      }
      else{
         list_sl -> it = s2 -> it;
         s2 = s2 -> next;
      }
         
      list_sl -> next = (Node *) malloc (sizeof (Node));
      list_sl = cur_sl -> next;
      list_sl -> next = NULL;      
   }
   
   return list_sl;
}
1
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:18  [ТС]
так вообще выдал весьма интересный и не понятный ответ 2 4 6 8 23841

Добавлено через 5 минут
Ура получилось, а зныете что добавил? что и пробовал раньше только с вашими маллоками и функция стала выглядить так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Node *slivanie (Node *s1, Node *s2){
   Node *cur_sl, *head_sl;
 
   head_sl = (Node *) malloc (sizeof (Node));
   head_sl -> next = NULL;
   cur_sl = head_sl;
 
   while (s1 != NULL || s2 != NULL){
     cur_sl->it=s1->it;
 
      cur_sl -> next = (Node *) malloc (sizeof (Node));
      cur_sl = cur_sl -> next;
      cur_sl -> next = NULL;
   cur_sl->it=s2->it;
   cur_sl -> next = (Node *) malloc (sizeof (Node));
      cur_sl = cur_sl -> next;
      cur_sl -> next = NULL;
      s1=s1->next;
      s2=s2->next;
 
   }
0
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:19
Исправил косяк. Просто спать пора уже. =)
0
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:21  [ТС]
хотя не совсем, добавились числа в конце вот скрин откуда они взялись не понятно(
Миниатюры
Линейный однонаправленный список  
0
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:25
Вот этот код откомпильте.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Node *slivanie (Node *s1, Node *s2){
   Node *list_sl;
   
   list_sl = (Node *) malloc (sizeof (Node));
   list_sl -> next = NULL;
 
   if (s1 != NULL || s2 != NULL)
       puts ("empty lists");
   
   while (1){
      if (s1 == NULL)
         if (s2 != NULL)
            list_sl -> it = s2 -> it;
      
      if (s2 == NULL)
         if (s1 != NULL)
            list_sl -> it = s1 -> it;
      
      if (s1 -> it <= s2 -> it){
         list_sl -> it = s1 -> it;
         s1 = s1 -> next;
      }
      else{
         list_sl -> it = s2 -> it;
         s2 = s2 -> next;
      }
      
      if (s1 -> next != NULL || s2 -> next != NULL){
          list_sl -> next = (Node *) malloc (sizeof (Node));
          list_sl = list_sl -> next;
          list_sl -> next = NULL;      
      }
      else
          break;
}
   
   return list_sl;
}
1
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:28  [ТС]
не поверите точно такой же ответ включая не понятные числа
0
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:37
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Node *slivanie (Node *s1, Node *s2){
   Node *list_sl;
   
   list_sl = (Node *) malloc (sizeof (Node));
   list_sl -> next = NULL;
 
   if (s1 == NULL && s2 == NULL){
       puts ("empty lists");
       return NULL;
   }
   
   while (1){
      if (s1 == NULL)
         if (s2 != NULL)
            list_sl -> it = s2 -> it;
      
      if (s2 == NULL)
         if (s1 != NULL)
            list_sl -> it = s1 -> it;
      
      if (s1 -> it <= s2 -> it){
         list_sl -> it = s1 -> it;
         s1 = s1 -> next;
      }
      else{
         list_sl -> it = s2 -> it;
         s2 = s2 -> next;
      }
      
      if (s1 -> next != NULL || s2 -> next != NULL){
          list_sl -> next = (Node *) malloc (sizeof (Node));
          list_sl = list_sl -> next;
          list_sl -> next = NULL;      
      }
      else
          break;
}
   
   return list_sl;
}
1
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
06.09.2012, 00:41  [ТС]
это вообще не работает
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2012, 22:55
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include<stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
 
struct Node
{
   int it;
   struct Node *next;
};
 
Node *front1 = NULL; // начало первого списка
Node *rear1  = NULL; // конец  первого списка
Node *front2 = NULL; // начало второго списка
Node *rear2  = NULL; // конец  второго списка
 
bool openfileandread(Node *&front, Node *&rear)
{
   string filename;
   cout << "Введите имя файла для чтения данных в список\n";
   getline(cin, filename);
   
   ifstream f(filename.c_str());
   if (!f.is_open()) 
   {
        cout << "Error 1!"; 
        return false;
   }
   
   while (!f.eof())
   {
        Node *add = new Node; // новый элемент списка
        if (add == NULL) // если память не выделена
        {
            cout << "Error 2!" << endl;
            return false;
        } 
 
        f >> add -> it;
        add -> next = NULL;
        
        if (front == NULL) // если список пустой, то в начало
        {
            front = add; // front начало списка
            rear = front; // rear пока начало и конец
        }
        else
            rear -> next = add; // если список не пустой, то в конец
        rear = add; // rear конец списка
    }
   
   f.close();
   return true;
}
 
void printNode(Node *front)
{
    Node *Curr;
    Curr = front;
    cout << '\n';
    while (Curr != NULL)
    {
        cout << Curr -> it << endl;
        Curr = Curr -> next;
    }
}
 
void sliyanie(Node *fr1, Node  *fr2) 
{    
    while (fr1 != NULL && fr2 != NULL)
    {
        Node *temp1 = fr1 -> next;
        fr1 -> next = fr2;
        if (temp1 == NULL) break;
                              Node *temp2 = fr2 -> next;
                              fr2 -> next = temp1;
        fr1 = temp1;
        fr2 = temp2;
    }
}
 
void ydalenie(Node *front)
{
    Node *temp;
    while (front != NULL)
    {
        temp = front -> next;
        delete front;
        front = temp;
    }
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    openfileandread(front1, rear1);
    openfileandread(front2, rear2);
    
    printNode(front1);
    printNode(front2);
 
    sliyanie(front1, front2);
    printNode(front1);
 
    ydalenie(front1);
 
system("pause");
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.09.2012, 22:55
Помогаю со студенческими работами здесь

Линейный однонаправленный список
ПОМОГИТЕ СДЕЛАТЬ ПОЖАЛУЙСТА Читая целые числа из текстового файла, создать линейный односвязный список а) добавлением нового элемента...

Линейный циклический однонаправленный список
Задание организовать очередь с приоритетом (у каждого элемента свой приоритет). Элементы с наивысшим приоритетом ставятся в начало очереди,...

линейный однонаправленный список (вопрос по сути)
Не понимаю смысла линейного однонаправленного списка. Допустим есть список: struct Node { int d; //хранимое...

Линейный однонаправленный список; ошибка сегментации
Инициализируется всего одна структура данных, затем система пишет: &quot;Ошибка сегментации&quot;. Подскажите, в чём проблема. ...

Линейный однонаправленный список. Удаление элементов
Создать линейный однонаправленный список. Удалить из него все символы 'p' перед символом 'a'. Вывести список после ввода символов и после...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru