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

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

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

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

02.04.2010, 13:40. Просмотров 1753. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2010, 13:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Односвязные списки (C++):

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

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

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

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

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

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

8
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
02.04.2010, 13:52 #2
art_stalker, Точно на С++ нужно? Если да, то лучше для этого задания стандартный контейнер std::list<std::string> использовать. Это на С городить приходится...
0
art_stalker
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 14:05  [ТС] #3
Да надо на С++
Проблема в том что я не знаю как работать с std::list<std::string> =(
Да и мне хотелось бы доработать именно свою идею и код=)
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
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;
}
Односвязные списки
1
art_stalker
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 16:00  [ТС] #5
Спасибо большое=)
Но мне надо доработать свою программу так как я сейчас изучаю односвязные списки и задание надо выполнить именно через них=(
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
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);
}
Односвязные списки
1
art_stalker
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 17:16  [ТС] #7
Спасибо конечно easybudda, но у меня тогда просьба не могли бы вы написать фрагмент кода который бы из 2 списка добавлял в 1 список слово, так как построить список и прочитать его знаю, а вот как сам узел добавить в уже имеющийся список я не могу понять=(
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
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() если их можно в функцию вынести? (Это я про чтение слов из файлов и составление структур с ними)...
0
art_stalker
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 17:34  [ТС] #9
А это уже от моей не грамотности в программирование=(
0
02.04.2010, 17:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2010, 17:34
Привет! Вот еще темы с ответами:

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

односвязные списки С++ - C++
Дана последовательность символов s1 , s2 , . . . , sn ( n &gt;= 2 и заранее неизвестно). Получить те символы, принадлежащие...

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

Односвязные списки (очередь) - C++
Задание.Удалить с очереди все элементы, расположенные до минимального элемента очереди. Пример создания контейнера &quot;очередь&quot; с...


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

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

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