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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
art_stalker
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
#1

Односвязные списки - C++

02.04.2010, 13:40. Просмотров 1713. Ответов 8
Метки нет (Все метки)

Задача: добавить в список 1 узлы, содержащие слова в списке 2, не совпадающие со словами списка 1(линейный список 1 из слов хранится в файле А и список 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
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
struct node
{
string word;
node *next;
};
 
struct node2
{
string word2;
node2 *next2;
};
 
 
int main()
{
setlocale(LC_CTYPE, "");
ifstream ifp("g:\\12345.txt" , ios::app | ios::out);//чтение из файла
 
 
node *first = NULL, *last, *k, *tmp;
 
// считываем из файла слова и записываем их в список
while(ifp.good())
{
node *tmp = new node;
 
if(!first)
first = tmp;
else
last->next = tmp;
 
string word;
ifp >> word;
 
tmp->word = word;
tmp->next = NULL;
 
last = tmp;
}
 
// выводим на экран список
cout << "Слова в файле:\n";
node *curr = first;
while(curr)
{
cout << curr->word << "\n";
curr = curr->next;
}
cout << endl;
 
//_______________________________________________чтение 2-го файла
node2 *first2 = NULL, *last2, *k2, tmp2;
ifstream ifp2("g:\\123456.txt");//чтение из файла
 
// считываем из файла слова и записываем их в список
while(ifp2.good())
{
node2 *tmp2 = new node2;
 
if(!first2)
first2 = tmp2;
else
last2->next2 = tmp2;
 
string word2;
ifp2 >> word2;
 
tmp2->word2 = word2;
tmp2->next2 = NULL;
 
last2 = tmp2;
}
 
// выводим на экран список
cout << "Слова в файле:\n";
node2 *curr2 = first2;
while(curr2)
{
cout << curr2->word2 << "\n";
curr2 = curr2->next2;
}
cout << endl;
 
//_______добавляем в первый список слова из второго которых нет в первом
 
//_____цикл
    
    k=first;
    k2=first2;
    node *newnode;
    while(k!=NULL)
    {
    int fl=0;
 
    
    while(k2!=NULL)
    {
        if(k2->word2 == k->word)
        {
            fl++;
        }
        k2=k2->next2;
    }
 
    if(fl==0)
    {
        // !!!Добавление элемента из 2-го списка в первый!!!
        node *newnode = new node;
        newnode->next=last;
        last->next=newnode;
        //newnode=k2->word2;
        
    }
    last=last->next;
    }
    cout<< "получим: ";
    first = tmp;
    while(first!=NULL)
    {
        cout<< first->word << "/n";
        curr = curr->next;
    }
    cout<< endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2010, 13:40     Односвязные списки
Посмотрите здесь:

Односвязные списки - C++
Есть программа которая должна выводить координаты точки (x.y.z) Ввод должен выполняться путем считывания из файла, Сделал все кроме...

Односвязные списки - C++
Вот такая задачка Дан текстовый файл. Группы символов, разделенные пробелами, будем называть словами. В файле оставить только по...

Односвязные списки С++ - C++
Помогите пожалуйста с заданием: Необходимо создать список(из целых чисел) добавлением элемента в конец... Я написала программу,только...

Односвязные списки - C++
помогите написать функцию которая меняет местами два элемента списка, заданные значением информационной части. Node *peremena(Node...

Односвязные списки - C++
Всем доброго времени суток. Мне нужно реализовать вот эти операторы в односвязном списке: void gotoTail() void addToTail(Node* node) ...

односвязные списки - C++
Помогите пожалуста в проге нужно в методе класа List нужно вставить елементы с первого списка в второй после последнего вхождение...

Односвязные списки - C++
Помогите, никак не могу понять что делать.. Написал код самого линейного списка, а дальше завис.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт CЭксперт С++
9466 / 5479 / 927
Регистрация: 25.07.2009
Сообщений: 10,503
02.04.2010, 13:52     Односвязные списки #2
art_stalker, Точно на С++ нужно? Если да, то лучше для этого задания стандартный контейнер std::list<std::string> использовать. Это на С городить приходится...
art_stalker
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 14:05  [ТС]     Односвязные списки #3
Да надо на С++
Проблема в том что я не знаю как работать с std::list<std::string> =(
Да и мне хотелось бы доработать именно свою идею и код=)
easybudda
Эксперт CЭксперт С++
9466 / 5479 / 927
Регистрация: 25.07.2009
Сообщений: 10,503
02.04.2010, 15:23     Односвязные списки #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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <algorithm>
#include <iterator>
#include <windows.h>
    
int main(){
    std::list<std::string> la, lb;
    std::string buf;
    const char *na = "a.txt";
    const char *nb = "b.txt";
    
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    std::ifstream ifa(na);
    if ( !ifa.is_open() ){
        std::cerr << "Can't open file <" << na << "> for input!" << std::endl;
        return 1;
    }
    while ( ifa >> buf )
        la.push_back(buf);
    ifa.close();
    
    std::ifstream ifb(nb);
    if ( !ifb.is_open() ){
        std::cerr << "Can't open file <" << nb << "> for input!" << std::endl;
        return 1;
    }
    while ( ifb >> buf )
        lb.push_back(buf);
    ifb.close();
    
    std::cout << "Список A:" << std::endl;
    std::copy(la.begin(), la.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout << std::endl;
    
    std::cout << "Список B:" << std::endl;
    std::copy(lb.begin(), lb.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout << std::endl;
    
    for ( std::list<std::string>::const_iterator i = lb.begin(); i != lb.end(); ++i )
        if ( std::find(la.begin(), la.end(), *i) == la.end() )
            la.push_back(*i);
    
    std::cout << "Список A с уникальными словами из списка B:" << std::endl;
    std::copy(la.begin(), la.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout << std::endl;
    
    return 0;
}
Односвязные списки
art_stalker
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 16:00  [ТС]     Односвязные списки #5
Спасибо большое=)
Но мне надо доработать свою программу так как я сейчас изучаю односвязные списки и задание надо выполнить именно через них=(
easybudda
Эксперт CЭксперт С++
9466 / 5479 / 927
Регистрация: 25.07.2009
Сообщений: 10,503
02.04.2010, 17:06     Односвязные списки #6
Цитата Сообщение от art_stalker Посмотреть сообщение
Но мне надо доработать свою программу
Ну это Вы уж сами как-нибудь...
Цитата Сообщение от art_stalker Посмотреть сообщение
сейчас изучаю односвязные списки и задание надо выполнить именно через них
А вот это пожалуйста, но на С, а то на С++ как-то при наличии STL такие велосипеды мастерить руки не поднимаются
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
114
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
 
typedef struct tagWRD {
    char *wrd;
    struct tagWRD *next;
} WRD;
 
WRD * newWrd(const char *str, WRD *last){
    WRD *w;
    if ( ( w = (WRD*)malloc(sizeof(WRD)) ) == NULL )
        return NULL;
    if ( ( w->wrd = strdup(str) ) == NULL )
        return NULL;
    w->next = NULL;
    
    if ( last )
        last->next = w;
    
    return w;
}
 
const WRD * findWord(const char *str, const WRD *w){
    while ( w != NULL && strcmp(str, w->wrd) )
        w = w->next;
    return w;
}
 
void clearList(WRD *w){
    WRD *t;
    while ( w ){
        t = w->next;
        if ( w->wrd )
            free(w->wrd);
        free(w);
        w = t;
    }
}
 
#define A_NAME "a.txt"
#define B_NAME "b.txt"
 
int main(void){
    FILE *fa, *fb;
    WRD *aHead, *aTail, *bHead, *bTail, *pWrd;
    char buf[BUFSIZ];
    
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    aHead = aTail = bHead = bTail = NULL;
    
    if ( ( fa = fopen(A_NAME, "r") ) == NULL ){
        fprintf(stderr, "Can't open file <%s> for input!\n", A_NAME);
        exit(1);
    }
    while ( fscanf(fa, "%s", buf) == 1 ){
        aTail = newWrd(buf, aTail);
        if ( !aHead )
            aHead = aTail;
    }
    if ( ferror(fa) ){
        fprintf(stderr, "Can't read from file <%s>\n", A_NAME);
        exit(1);
    }
    fclose(fa);
    if ( aHead == NULL ){
        fprintf(stderr, "No words from file <%s> readen!\n", A_NAME);
        exit(1);
    }
    
    
    if ( ( fb = fopen(B_NAME, "r") ) == NULL ){
        fprintf(stderr, "Can't open file <%s> for input!\n", B_NAME);
        exit(1);
    }
    while ( fscanf(fb, "%s", buf) == 1 ){
        bTail = newWrd(buf, bTail);
        if ( !bHead )
            bHead = bTail;
    }
    if ( ferror(fb) ){
        fprintf(stderr, "Can't read from file <%s>\n", B_NAME);
        exit(1);
    }
    fclose(fb);
    if ( bHead == NULL ){
        fprintf(stderr, "No words from file <%s> readen!\n", B_NAME);
        exit(1);
    }
    
    printf("\nЛист А:\n");
    for ( pWrd = aHead; pWrd != NULL; pWrd = pWrd->next )
        printf("%s\n", pWrd->wrd);
    
    printf("\nЛист B:\n");
    for ( pWrd = bHead; pWrd != NULL; pWrd = pWrd->next )
        printf("%s\n", pWrd->wrd);
    
    for ( pWrd = bHead; pWrd != NULL; pWrd = pWrd->next )
        if ( !findWord(pWrd->wrd, aHead) )
            aTail = newWrd(pWrd->wrd, aTail);
        
    printf("\nЛист А с уникальными словами из листа В:\n");
    for ( pWrd = aHead; pWrd != NULL; pWrd = pWrd->next )
        printf("%s\n", pWrd->wrd);
    
    clearList(aHead);
    clearList(bHead);
    
    exit(0);
}
Односвязные списки
art_stalker
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 17:16  [ТС]     Односвязные списки #7
Спасибо конечно easybudda, но у меня тогда просьба не могли бы вы написать фрагмент кода который бы из 2 списка добавлял в 1 список слово, так как построить список и прочитать его знаю, а вот как сам узел добавить в уже имеющийся список я не могу понять=(
easybudda
Эксперт CЭксперт С++
9466 / 5479 / 927
Регистрация: 25.07.2009
Сообщений: 10,503
02.04.2010, 17:32     Односвязные списки #8
art_stalker, брать из второго списка по одному слову, искать его в первом списке и если не найдётся - добавлять в конец списка...
C
1
2
3
4
5
...
        for ( pWrd = bHead; pWrd != NULL; pWrd = pWrd->next )
                if ( !findWord(pWrd->wrd, aHead) )
                        aTail = newWrd(pWrd->wrd, aTail);
...
Ваша программа вопросов много вызывает. Например чем структура node от структуры node2 отличается? Какой смысл в определении двух абсолютно одинаковых типов данных? И зачем писать два по сути одинаковых куска кода в main() если их можно в функцию вынести? (Это я про чтение слов из файлов и составление структур с ними)...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2010, 17:34     Односвязные списки
Еще ссылки по теме:

Односвязные списки - C++
Вечер добрый) Сформировать список символов, оканчивающийся точкой. Заменить в списке символ “A” на символ “0”. Сама задача есть и...

Односвязные и двусвязные списки - C++
Добрый день. Возникала проблема со списками. Нужно сделать программу 1)которая считывала бы слова из файла, записывали их в...

Односвязные линейные списки - C++
Подскажите пожалуйста, как заменить содержимое файла перечнем символов, которые в нем встречаются, упорядоченным в порядке убывания...

Односвязные лнейные списки - C++
Доброго времени суток. Нужно решить задачу, а я в списках не шарю совсем(и скока не пытался разобраться-не получиилось) Вот задача ...

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


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

Или воспользуйтесь поиском по форуму:
art_stalker
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 17:34  [ТС]     Односвязные списки #9
А это уже от моей не грамотности в программирование=(
Yandex
Объявления
02.04.2010, 17:34     Односвязные списки
Ответ Создать тему
Опции темы

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