Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- #include <malloc.h>
- #include <stdbool.h>
- //node struct
- typedef struct Node {
- int value;
- struct Node* next;
- } Node;
- //struct methods prototypes
- int pop(Node** head);
- void popBack(Node** head);
- void push(Node** head, int data);
- void pushBack(Node* head, int value);
- Node* getNth(Node* head, int n);
- Node* getLast(Node* head);
- Node* getLastButOne(Node* head);
- void insert(Node* head, unsigned pos, int val);
- int deleteNth(Node** head, int n);
- void fromArray(Node** head, int* arr, size_t size);
- int* toArray(const Node* head, const int length);
- void printLinkedList(const Node* head);
- //task prototypes
- void insert44BeforeAnyMultipleOfSeven(Node* head);
- //print prototypes
- void printLinkedList(const Node* head);
- void printTaskInfo();
- /* list methods start */
- void push(Node** head, int data) {
- Node* tmp = (Node*)malloc(sizeof(Node));
- tmp->value = data;
- tmp->next = (*head);
- (*head) = tmp;
- }
- void pushBack(Node* head, int value) {
- Node* last = getLast(head);
- Node* tmp = (Node*)malloc(sizeof(Node));
- tmp->value = value;
- tmp->next = NULL;
- last->next = tmp;
- }
- int pop(Node** head) {
- Node* prev = NULL;
- int val;
- if (head == NULL) {
- exit(-1);
- }
- prev = (*head);
- val = prev->value;
- (*head) = (*head)->next;
- free(prev);
- return val;
- }
- void popBack(Node** head) {
- Node* lastbn = NULL;
- //Получили NULL
- if (!head) {
- exit(-1);
- }
- //Список пуст
- if (!(*head)) {
- exit(-1);
- }
- lastbn = getLastButOne(*head);
- //Если в списке один элемент
- if (lastbn == NULL) {
- free(*head);
- *head = NULL;
- }
- else {
- free(lastbn->next);
- lastbn->next = NULL;
- }
- }
- Node* getNth(Node* head, int n) {
- int counter = 0;
- while (counter < n && head) {
- head = head->next;
- counter++;
- }
- return head;
- }
- Node* getLast(Node* head) {
- if (head == NULL) {
- return NULL;
- }
- while (head->next) {
- head = head->next;
- }
- return head;
- }
- Node* getLastButOne(Node* head) {
- if (head == NULL) {
- exit(-2);
- }
- if (head->next == NULL) {
- return NULL;
- }
- while (head->next->next) {
- head = head->next;
- }
- return head;
- }
- //вставка на n-ое место
- void insert(Node* head, unsigned pos, int val) {
- unsigned i = 0;
- Node* tmp = NULL;
- while (i < pos && head->next) {
- head = head->next;
- i++;
- }
- tmp = (Node*)malloc(sizeof(Node));
- tmp->value = val;
- if (head->next) {
- tmp->next = head->next;
- }
- else {
- tmp->next = NULL;
- }
- head->next = tmp;
- }
- //удаление n-го места
- int deleteNth(Node** head, int n) {
- if (n == 0) {
- return pop(head);
- }
- else {
- Node* prev = getNth(*head, n - 1);
- Node* elm = prev->next;
- int val = elm->value;
- prev->next = elm->next;
- free(elm);
- return val;
- }
- }
- void fromArray(Node** head, int* arr, size_t size) {
- size_t i = size - 1;
- if (arr == NULL || size == 0) {
- return;
- }
- do {
- push(head, arr[i]);
- } while (i-- != 0);
- }
- int* toArray(const Node* head, const int length) {
- int leng = length;
- int* values = (int*)malloc(leng * sizeof(int));
- while (head) {
- values[--leng] = head->value;
- head = head->next;
- }
- return values;
- }
- /* task methods start */
- int findFirstMultipleOfFive(const Node* head) {
- int counter = 0;
- while (head) {
- if (head->value % 5 == 0) {
- return counter;
- }
- counter++;
- head = head->next;
- }
- return -1;
- }
- void insert44BeforeAnyMultipleOfSeven(Node* head) {
- int pos = 0;
- Node* tempHead = head;
- while (tempHead) {
- if (tempHead->value % 7 == 0) {
- insert(head, pos - 1, 44);
- pos++;
- }
- pos++;
- tempHead = tempHead->next;
- }
- }
- /* task methods end */
- /* print procs start */
- void printLinkedList(const Node* head) {
- while (head) {
- printf("%d ", head->value);
- head = head->next;
- }
- printf("\n");
- }
- void printTaskInfo() {
- printf("Данная программа создает однонаправленный список из целых чисел.\n");
- printf("Затем удаляет первый элемент, кратный 5. После этого вставляет число 44 перед каждым числом, кратным 7.\n");
- }
- /* print procs end */
- int main()
- {
- setlocale(LC_ALL, "Rus");
- printTaskInfo();
- Node* head = NULL;
- int arr[] = { 1,7,5,23,25,11,12,21,19,100 };
- fromArray(&head, arr, 10);
- printf("Начальный список: ");
- printLinkedList(head);
- int posToDel = findFirstMultipleOfFive(head);
- if (posToDel == -1) {
- printf("Элемента со значением, кратным пяти, нет в списке.");
- }
- else {
- deleteNth(&head, posToDel);
- printf("Список после удаление первого элемента, кратного пяти: ");
- printLinkedList(head);
- }
- insert44BeforeAnyMultipleOfSeven(head);
- printf("Список после вставки 44 перед каждым элементом, кратным семи: ");
- printLinkedList(head);
- getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement