Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Diabolisk
30 / 2 / 1
Регистрация: 26.04.2012
Сообщений: 51
#1

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

05.09.2012, 01:59. Просмотров 1676. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2012, 01:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Линейный однонаправленный список (C++):

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

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

Линейный однонаправленный список
Есть программа, которая инициализирует, заполняет и удаляет список. При...

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

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

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

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

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

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

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
Diabolisk
30 / 2 / 1
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 02:55  [ТС] #5
неа не получилось получился первый список
0
Elboy
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 02:56 #6
Покажите, как вы выводите список слияния.
0
Diabolisk
30 / 2 / 1
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 02:59  [ТС] #7
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
Elboy
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:02 #8
Естественно выведется 1ый список, т.к. вы передаёте его в качестве параметра. Нужно
C
1
printNode (slivanie (s1, s2));
0
Diabolisk
30 / 2 / 1
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:03  [ТС] #9
Аа это из-за того что возвращаем return head_sl;?
0
Elboy
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:04 #10
Мы формируем новый список, голову которого мы и должны передать.
0
Diabolisk
30 / 2 / 1
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:06  [ТС] #11
хех сейчас вообще вышел вот такой результат 4 2 4 6 8
0
Elboy
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:09 #12
Подправил с учётом вашей функции вывода.

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
Diabolisk
30 / 2 / 1
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:18  [ТС] #13
так вообще выдал весьма интересный и не понятный ответ 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
Elboy
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:19 #14
Исправил косяк. Просто спать пора уже. =)
0
Diabolisk
30 / 2 / 1
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:21  [ТС] #15
хотя не совсем, добавились числа в конце вот скрин откуда они взялись не понятно(
0
Миниатюры
Линейный однонаправленный список  
Elboy
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:25 #16
Вот этот код откомпильте.

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
Diabolisk
30 / 2 / 1
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:28  [ТС] #17
не поверите точно такой же ответ включая не понятные числа
0
Elboy
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:37 #18
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
Diabolisk
30 / 2 / 1
Регистрация: 26.04.2012
Сообщений: 51
06.09.2012, 00:41  [ТС] #19
это вообще не работает
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.09.2012, 22:55 #20
Код
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
06.09.2012, 22:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2012, 22:55
Привет! Вот еще темы с решениями:

линейный однонаправленный список (вопрос по сути)
Не понимаю смысла линейного однонаправленного списка. Допустим есть список: ...

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

Считать числа из файла в линейный однонаправленный список
С++ Дан файл с цифрами. Надо занести их в линейный однонаправленный список и...

Однонаправленный линейный список абонентов телефонной станции
Построить однонаправленный линейный список абонентов телефонной станции,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru