Вставить в линейный список строку после строки с заданным номером - 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 (номер строки, после которой нужно вставить новую).