Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
akalji
3 / 3 / 2
Регистрация: 10.03.2014
Сообщений: 51
1

Связный список. Необходимо создать новый связный список только из положительных элементов

30.03.2014, 14:54. Просмотров 791. Ответов 1
Метки нет (Все метки)

Задача: Прочитать из файла связный список. Потом из этого списка создать еще один, в котором будут только положительные значения из исходного и вывести его в файл.
Все время ошибка выход за пределы памяти.
Заранее спасибо.

Вот мой код:
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
#include <stdio.h>
#include <stdlib.h>
 
typedef struct Node_s{
    Node_s* Next;
    int Value;
 
}Node_t;
 
void newlist(int N, char* fname);
void readList(Node_t* G, char* fname);
void SaveList(Node_t* G, char* fname);
void onlyPositive(Node_t* G, Node_t* Pos);
 
int main(){
    int N=10;
    char *INfname = {"input.txt"};
    char *OUTfname = {"output.txt"};
    newlist(N, INfname);
    Node_t G;
    Node_t Positive;
    readList(&G, INfname);
    SaveList(&G, OUTfname);
    onlyPositive(&G, &Positive);
    
 
    return 0;
}
 
 
void newlist(int N, char* fname){
    FILE* f = fopen(fname,"w");
    int i;
    for(i=0; i<N; i++){
        fprintf(f, "%d\n", rand()-RAND_MAX/2);
    }
}
 
void readList(Node_t* G, char* fname){
    FILE* f = fopen(fname,"r");
    Node_t *list = (Node_t*)malloc(sizeof(Node_t));
    int tmp;
    fscanf(f, "%d\n", &tmp);
    list->Value=tmp;
    list->Next=NULL;
    G=list;
 
    while(!feof(f)){
        list->Next = (Node_t*)malloc(sizeof(Node_t));
        fscanf(f, "%d\n", &tmp);
        list -> Next->Value=tmp;
        list = list->Next;      
    }
 
}
 
void onlyPositive(Node_t* G, Node_t* Pos){
    Node_t* currentG = G;
    Node_t* currentP = Pos;
    while(currentG){   
        if(currentG->Value>0){
            currentP->Value = currentG->Value;
            if(currentG->Next){currentP->Next = (Node_t*)malloc(sizeof(Node_t));}else{currentP->Next=NULL;}
            if(currentP->Next){currentP=currentP->Next;}
        }
        currentG = currentG->Next; 
      
    }
}
 
void SaveList(Node_t* G, char* fname){
    FILE* f = fopen(fname,"w");
    Node_t* current = G;
    while(current) 
    { 
        fprintf(f, "%d\n", current->Value);
        current = current->Next; 
    }  
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2014, 14:54
Ответы с готовыми решениями:

Написать функцию, которая добавляет новый элемент в связный список
Доброго времени суток, продолжаю изучать самостоятельно Си по книге Кочана...

Связный список: вставить в список перед каждым вхождением элемента K элемент L
Разработать программу, которая создает список, элементами которого являются...

Инициализация, добавление и удаление элементов в СТЕКЕ через связный список
День добрый, нужна помощь со стеками. Передо мною стоит задача: 1)...

Запись в связный список из файла
Описание списков: typedef struct name { char first_name; char...

Связный список, объясните ошибки
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt; string.h &gt; #include...

1
anmartex
...
1711 / 1204 / 908
Регистрация: 12.02.2013
Сообщений: 1,978
30.03.2014, 19:03 2
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
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
typedef struct node_t {
    int value;
    struct node_t* next;
}   TList;
 
//-----------------------------------------------------------------------------
void Push(TList** list, int value) {
    TList* node = malloc(sizeof(TList));
    node->value = value;
    node->next = *list;
    *list = node;
}
//-----------------------------------------------------------------------------
void Write(FILE* f, const TList* list) {
    for (; list; list = list->next) {
        fprintf(f, "%d ", list->value);
    }
}
//-----------------------------------------------------------------------------
TList* Read(FILE* f) {
    TList* list = NULL;
    int value;
 
    while (fscanf(f, "%d", &value) == 1) {
        Push(&list, value);
    }
 
    return list;
}
//-----------------------------------------------------------------------------
TList* OnlyPositive(const TList* list) {
    TList* newList = NULL;
 
    for (; list; list = list->next) {
        if (0 <= list->value) {
            Push(&newList, list->value);
        }
    }
 
    return newList;
}
//-----------------------------------------------------------------------------
 
int main() {
    TList* all, * positive;
    FILE* fin, * fout;
 
    assert((fin = fopen("input.txt", "r")) != NULL);
    assert((fout = fopen("output.txt", "w")) != NULL);
 
    all = Read(fin);
    positive = OnlyPositive(all);
 
    Write(stdout, positive);
    Write(fout, positive);
 
    return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 19:03

Ввод элементов в связный список, пока не будет введено "q"
Здраствуйте! При создании масива нужно, чтобы он создавал новый элемент пока...

Удалить связный список и освободить память
Вот так создаю связный список typedef struct { comp el; void* next; }...

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


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

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

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