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

Удаление/добавление записи по ключу в односвязном списке - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Литература по Visual C++ http://www.cyberforum.ru/cpp-beginners/thread160244.html
Доброго времени суток. 1. Подскажите пожалуйста хорошую книжку по Visual C++ класса - "от А до Я" среда VS. что бы в ней было описание всех формочек, кнопочек до сети и графики и тд. 2. Книжка по API винды от xp до 7. 3. Всем спасибо :).
C++ Цикл for и 56 карт Выводит 14! карт в каждой строке. Я не понял как это получается. // 7_6.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> #include <cstdlib> #include <ctime> http://www.cyberforum.ru/cpp-beginners/thread160209.html
Печать слова копейка в согласованном падеже C++
какая для целого числа печатает слово копейка в согласованном падеже.
Не могу понять в чем ошибка: реализация односвязного списка C++
#include <iostream> using namespace std; struct list { int key; list *next; }; void addList(list *start);
C++ Функция, определяющая достижение начала файла: есть ли такая? http://www.cyberforum.ru/cpp-beginners/thread160173.html
Собственно мне нужна функция, проверяющая достижение начала файла, типа feof только наоборот. Гуглил, ничего не нашел =(
C++ Есть исходники браузера? Есть у кого-нибудь исходники браузера? П.С.Администрации сделайте в каждом разделе форума чат, примерно для таких вопросов. Добавлено через 6 минут П.С. Исходники нужны на чистом Си подробнее

Показать сообщение отдельно
easybudda
Эксперт CЭксперт С++
9468 / 5481 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
19.08.2010, 18:57     Удаление/добавление записи по ключу в односвязном списке
Вот в догонку сортированный двухсвязный список на С
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
131
132
133
134
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define DELIM " ,.\t\n"
 
typedef struct WRD {
    char * pszText;
    int nCount;
    struct WRD * pPrev;
    struct WRD * pNext;
} wrd_t;
 
wrd_t * new_word(const char * s){
    wrd_t * w;
 
    if ( ( w = (wrd_t*)malloc(sizeof(wrd_t)) ) == NULL ){
        fprintf(stderr, "new_word: memory allocation error!\n");
        return NULL;
    }
    if ( ( w->pszText = strdup(s) ) == NULL ){
        fprintf(stderr, "new_word: string duplicate error!\n");
        free(w);
        return NULL;
    }
    w->nCount = 1;
    w->pPrev = NULL;
    w->pNext = NULL;
 
    return w;
}
 
void clear_list(wrd_t * first){
    wrd_t * tmp;
 
    while ( first ){
        tmp = first->pNext;
        free(first->pszText);
        free(first);
        first = tmp;
    }
}
 
wrd_t * create_list(const char * str, const char * delim){
    char * buf, * p;
    wrd_t * first, * last, * found, * inserted;
    int cmp;
 
    if ( ( buf = strdup(str) ) == NULL ){
        fprintf(stderr, "create_list: string duplicate error!\n");
        return NULL;
    }
 
    first = NULL;
    for ( p = strtok(buf, delim); p != NULL; p = strtok(NULL, delim) ){
        if ( ! first ){
            if ( ( first = new_word(p) ) == NULL ){
                fprintf(stderr, "create_list: can't create the first word!\n");
                free(buf);
                return NULL;
            }
            last = first;
        }
        else {
            for ( found = first; found != NULL; found = found->pNext ){
               if ( ( cmp = strcmp(found->pszText, p) ) < 0 )
                   continue;
               else if ( cmp == 0 ){
                   found->nCount += 1;
                   break;
               }
               else {
                   if ( ( inserted = new_word(p) ) == NULL ){
                       fprintf(stderr, "create_list: can't create a new word!\n");
                       clear_list(first);
                       free(buf);
                       return NULL;
                   }
                   if ( found == first ){
                       first->pPrev = inserted;
                       inserted->pNext = first;
                       first = inserted;
                   }
                   else {
                       found->pPrev->pNext = inserted;
                       inserted->pPrev = found->pPrev;
                       inserted->pNext = found;
                       found->pPrev = inserted;
                   }
                   break;
               }
            }
            if ( found == NULL ){
                if ( ( inserted = new_word(p) ) == NULL ){
                    fprintf(stderr, "create_list: can't create a last word!\n");
                    clear_list(first);
                    free(buf);
                    return NULL;
                }
                inserted->pPrev = last;
                last->pNext = inserted;
                last = inserted;
            }
        }
    }
 
    free(buf);
    return first;
}
 
void print_list(const wrd_t * w){
    while ( w ){
        printf("%-20s : %d\n", w->pszText, w->nCount);
        w = w->pNext;
    }
}
 
int main(void){
    char buf[BUFSIZ];
    wrd_t * list;
 
    while ( printf("\nString: ") && fgets(buf, BUFSIZ, stdin) ){
        if ( *buf == '\n' )
            break;
        if ( ( list = create_list(buf, DELIM) ) == NULL ){
            fprintf(stderr, "Can't create list!\n");
            exit(EXIT_FAILURE);
        }
        print_list(list);
        clear_list(list);
    }
 
    exit(EXIT_SUCCESS);
}
Вводится строка текста, выводятся слова, отсортированные по алфавиту + количество их в строке.
Удаление/добавление записи по ключу в односвязном списке
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru