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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
#1

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

05.09.2012, 01:59. Просмотров 1560. Ответов 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++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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 узлов.
0
Diabolisk
30 / 2 / 0
Регистрация: 26.04.2012
Сообщений: 51
05.09.2012, 02:29  [ТС] #3
попробовал варианты были такие что либо один элемент из 1 списка все остальные из второго либо писал нул поинт асигмент

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

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

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

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

Линейный, однонаправленный, связанный список для структур - C++
Всем привет! Помогите пожалуйста переделать эту программу, так чтобы в нем использовались не массивы структурных переменных, а линейный,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.09.2012, 03:21
Ответ Создать тему
Опции темы

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