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

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

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

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

02.04.2010, 13:40. Просмотров 1563. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
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
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
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
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
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
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
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++
односвязные списки С++ C++
Односвязные и двусвязные списки C++
C++ Односвязные списки
Односвязные списки C++

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

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

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