Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
1

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

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

Author24 — интернет-сервис помощи студентам
Задача: добавить в список 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2010, 13:40
Ответы с готовыми решениями:

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

Односвязные списки
помогите написать функцию которая меняет местами два элемента списка, заданные значением...

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

Односвязные списки
Всем доброго времени суток. Мне нужно реализовать вот эти операторы в односвязном списке: void...

8
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12737 / 7567 / 1764
Регистрация: 25.07.2009
Сообщений: 13,956
02.04.2010, 13:52 2
art_stalker, Точно на С++ нужно? Если да, то лучше для этого задания стандартный контейнер std::list<std::string> использовать. Это на С городить приходится...
0
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 14:05  [ТС] 3
Да надо на С++
Проблема в том что я не знаю как работать с std::list<std::string> =(
Да и мне хотелось бы доработать именно свою идею и код=)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12737 / 7567 / 1764
Регистрация: 25.07.2009
Сообщений: 13,956
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
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 16:00  [ТС] 5
Спасибо большое=)
Но мне надо доработать свою программу так как я сейчас изучаю односвязные списки и задание надо выполнить именно через них=(
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12737 / 7567 / 1764
Регистрация: 25.07.2009
Сообщений: 13,956
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
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 17:16  [ТС] 7
Спасибо конечно easybudda, но у меня тогда просьба не могли бы вы написать фрагмент кода который бы из 2 списка добавлял в 1 список слово, так как построить список и прочитать его знаю, а вот как сам узел добавить в уже имеющийся список я не могу понять=(
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12737 / 7567 / 1764
Регистрация: 25.07.2009
Сообщений: 13,956
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
0 / 0 / 0
Регистрация: 02.04.2010
Сообщений: 8
02.04.2010, 17:34  [ТС] 9
А это уже от моей не грамотности в программирование=(
0
02.04.2010, 17:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2010, 17:34
Помогаю со студенческими работами здесь

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

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

Односвязные списки
Доброго времени суток! Подскажите, пожалуйста где тут ошибка в коде. Заранее спасибо:rose: ...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru