Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 01:59     Линейный однонаправленный список #1
всем доброго времени не получается создать функцию слияния двух списков методом расчесок( допустим первый список 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Elboy
131 / 112 / 4
Регистрация: 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 узлов.
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 02:29  [ТС]     Линейный однонаправленный список #3
попробовал варианты были такие что либо один элемент из 1 списка все остальные из второго либо писал нул поинт асигмент

Добавлено через 1 минуту
вообще я хотел как но не получилось, так что бы в 1 список просто добавлять элементы второго и всё
Elboy
131 / 112 / 4
Регистрация: 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;
}
Проверьте, не компилил.
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 02:55  [ТС]     Линейный однонаправленный список #5
неа не получилось получился первый список
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 02:56     Линейный однонаправленный список #6
Покажите, как вы выводите список слияния.
Diabolisk
30 / 2 / 0
Регистрация: 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");
}
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:02     Линейный однонаправленный список #8
Естественно выведется 1ый список, т.к. вы передаёте его в качестве параметра. Нужно
C
1
printNode (slivanie (s1, s2));
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:03  [ТС]     Линейный однонаправленный список #9
Аа это из-за того что возвращаем return head_sl;?
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:04     Линейный однонаправленный список #10
Мы формируем новый список, голову которого мы и должны передать.
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:06  [ТС]     Линейный однонаправленный список #11
хех сейчас вообще вышел вот такой результат 4 2 4 6 8
Elboy
131 / 112 / 4
Регистрация: 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;
}
Diabolisk
30 / 2 / 0
Регистрация: 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;
 
   }
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
05.09.2012, 03:19     Линейный однонаправленный список #14
Исправил косяк. Просто спать пора уже. =)
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:21  [ТС]     Линейный однонаправленный список #15
хотя не совсем, добавились числа в конце вот скрин откуда они взялись не понятно(
Миниатюры
Линейный однонаправленный список  
Elboy
131 / 112 / 4
Регистрация: 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;
}
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 03:28  [ТС]     Линейный однонаправленный список #17
не поверите точно такой же ответ включая не понятные числа
Elboy
131 / 112 / 4
Регистрация: 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;
}
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
06.09.2012, 00:41  [ТС]     Линейный однонаправленный список #19
это вообще не работает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2012, 22:55     Линейный однонаправленный список
Еще ссылки по теме:

C++ Линейный циклический однонаправленный список
Линейный однонаправленный список C++
C++ Переписать слова предложения в однонаправленный линейный список

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 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;
}
Yandex
Объявления
06.09.2012, 22:55     Линейный однонаправленный список
Ответ Создать тему
Опции темы

Текущее время: 23:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru