Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <string.h>
- char* updatestr(char *str) {
- char *c;
- c = str;
- for(int i = 0;i < strlen(str); ++i){
- if(isdigit(*c)){
- *c = ((*c - '0' + 1) % 10) + '0';
- }
- c++;
- }
- return str;
- }
- // основная функция работы алгоритма №1
- typedef struct vect{
- char value; // хранение символа
- struct vect *next; // указатель на следующий элемент
- struct vect *prev; // указатель на предыдущий элемент
- } vector;
- // пользовательский тип данных список(нужен для алгоритма №2)
- vector* init() {
- vector *res;
- res = (vector*)malloc(sizeof(vector)); // выделение памяти
- res->value='*'; // пусть корень списка изначально равен *
- res->next=NULL;
- res->prev=NULL;
- return(res);
- }
- // выделение памяти для нового объекта, проводить аналогию с конструктором
- vector* add(vector* root, char a) {
- vector* tmp = init(); // создание нового объекта
- tmp->value = a;
- tmp->next = NULL;
- while (root->next) {
- root=root->next; // поставить указатель в конец списка
- }
- tmp->prev=root;
- root->next=tmp; // связать новый объект со списком
- return(tmp);
- }
- // добавление в конец списка root элемента a
- vector* get(vector* root, int a) {
- for(int i = 0; i <= a; i++) { // "<=" потому что нужно указывать на следующий
- // объект ровно a+1 раз, так как корень содержит мусорное значение
- if(root->next) root=root->next;
- else return NULL;
- }
- return root;
- }
- // взятие по индексу значения, где возвращаемое значение - vector
- void show_vector(vector *res) {
- res=res->next; // избегание мусорного значения корня
- while (res->next) {
- printf("%c", res->value);
- res=res->next;
- }
- printf("%c\n", res->value); // вывод последнего элемента
- }
- // вывод всех элементов списка
- vector* str_to_vector(char* s) {
- vector *res = init();
- for(int i = 0; i < strlen(s); i++) {
- add(res, s[i]);
- }
- return(res);
- }
- // конвертация строки в пользовательский тип данных лист
- vector* set_pointer_to_start(vector* res) {
- while (res->prev) {
- res=res->prev;
- }
- return(res);
- }
- // функция, ставящая указатель в начало списка
- vector* update_vector(vector* st) {
- st = st->next;
- while (st->next) {
- if(isdigit(st->value)) st->value = ((st->value - '0' + 1) % 10) + '0'; // увеличение цифры на единицу
- st = st->next;
- }
- if(isdigit(st->value)) st->value = ((st->value - '0' + 1) % 10) + '0';
- st = set_pointer_to_start(st); // ставит указатель в начальное положение
- return(st);
- }
- void run() {
- char str[300];
- printf("Choose algorithm:\n1. string is array of char\n2. string is a list\n");
- int choose=0;
- scanf("%d", &choose);
- if(choose==1) {
- while(scanf("%s", str)) {
- printf("%s\n", updatestr(str));
- }
- }
- else if(choose==2) {
- while(scanf("%s", str)){
- show_vector(update_vector(str_to_vector(str)));
- }
- }
- }
- int main() {
- run();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement