Вставить в линейный список строку после строки с заданным номером - C (СИ)
Формулировка задачи:
двунаправленный линейный список строк.требуется вставить строку после строки с номером и удалить строку с номером и заменить строку с номером и подсчитать статистику (количество строк и символов)
Решение задачи: «Вставить в линейный список строку после строки с заданным номером»
textual
Листинг программы
- #include <stdio.h>
- #include <malloc.h>
- #include <stdlib.h>
- #include <time.h>
- struct ls
- {
- char* n;
- struct ls* next;
- struct ls* prev;
- };
- void add_last(struct ls* current, int size)
- {
- struct ls* p = current;
- while(p->next != 0)
- p = p->next;
- p->next = malloc(sizeof(struct ls));
- (p->next)->n = (char*) malloc(sizeof(char)*size);
- (p->next)->next = 0;
- (p->next)->prev = p;
- (p->next)->n[0]='a'+rand()%20;
- (p->next)->n[1]=0;
- }
- void add(struct ls* first, int size, int pos)
- {
- int num;
- struct ls* k;
- struct ls* y;
- struct ls* p;
- p = first;
- num = 0;
- if (pos < num)
- return;
- if (num != pos)
- while(p->next != 0)
- {
- num++;
- if (num == pos)
- {
- y = malloc(sizeof(struct ls));
- y->n = (char*) malloc(sizeof(char)*size);
- y->n[0]='a'+rand()%20;
- y->n[1]=0;
- k = p->next;
- p->next = y;
- y->prev = p;
- y->next = k;
- k->prev = y;
- return;
- }
- p = p->next;
- }
- else
- {
- y = malloc(sizeof(struct ls));
- y->n = (char*) malloc(sizeof(char)*size);
- y->n[0]='a'+rand()%20;
- y->n[1]=0;
- y->next = p;
- p->prev = y;
- return;
- }
- if (pos > num)
- return;
- }
- void print(struct ls* current)
- {
- struct ls* p = current;
- while(p->next != 0)
- {
- printf("%c\n", p->n[0]);
- p = p->next;
- }
- printf("%c\n\n", p->n[0]);
- }
- int main(int argc, char* argv[])
- {
- struct ls first;
- struct ls *p;
- srand(time(0));
- first.n = (char*) malloc(sizeof(char)*10);
- first.n[0]='a'+rand()%20;
- first.n[1]=0;
- first.next = 0;
- first.prev = 0;
- p=&first;
- print(p);
- add_last(p, 3);
- print(p);
- add_last(p, 3);
- print(p);
- add(p, 3, 1);
- p=p->prev;
- print(p);
- return 0;
- }
Объяснение кода листинга программы
В данном коде реализован линейный список, структура которого включает в себя указатель на следующий элемент списка (next), предыдущий элемент списка (prev) и строку (n).
- *void add_last(struct ls current, int size)** - добавляет новый элемент в конец списка. Задается размер строки (size), инициализируется новый элемент списка (new element), и затем он добавляется в конец списка.
- *void add(struct ls first, int size, int pos)** - добавляет новый элемент в список на определенной позиции. Задается позиция, на которой нужно вставить новый элемент (pos), инициализируется новый элемент списка (new element), и затем он добавляется в список на заданной позиции.
- *void print(struct ls current)** - выводит на экран все элементы списка. Происходит обход списка по элементам, и каждый элемент выводится на экран.
- *int main(int argc, char argv[])** - основная функция программы. Инициализируется первый элемент списка (first), указатель на который будет использоваться для обхода списка (p). Затем заполняется список некоторыми элементами, добавляются новые элементы на первую и вторую позиции, и выводится на экран. Для вставки строки после строки с заданным номером 1, нужно вызвать функцию add с параметрами: first = &first (указатель на первый элемент списка), size = 3 (размер строки), pos = 1 (номер строки, после которой нужно вставить новую).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д