Не спешите. :) Как вы сказали, вам нужно поменять местами сами, вместо того, чтобы менять их значения, а затем вы здесь. :)
#include <stdio.h>
#include <stdlib.h>
struct list
{
int value;
struct list *next;
};
void push_front(struct list **head, int value)
{
struct list *tmp = malloc(sizeof(struct list));
if (tmp)
{
tmp->value = value;
tmp->next = *head;
*head = tmp;
}
}
void display(struct list *head)
{
for (struct list *tmp = head; tmp; tmp = tmp->next)
{
printf("%d ", tmp->value);
}
printf("\n");
}
void swap(struct list **head, int value)
{
while (*head && (*head)->value != value)
{
head = &(*head)->next;
}
if (*head && (*head)->next)
{
struct list *next = (*head)->next->next;
(*head)->next->next = *head;
*head = (*head)->next;
(*head)->next->next = next;
}
}
int main(void)
{
struct list *head = NULL;
push_front(&head, 4);
push_front(&head, -5);
push_front(&head, 3);
push_front(&head, 7);
push_front(&head, -1);
push_front(&head, 2);
display(head);
swap(&head, 2);
display(head);
swap(&head, 2);
display(head);
swap(&head, 2);
display(head);
swap(&head, 2);
display(head);
swap(&head, 2);
display(head);
swap(&head, 2);
display(head);
return 0;
}
Выход программы
2 -1 7 3 -5 4
-1 2 7 3 -5 4
-1 7 2 3 -5 4
-1 7 3 2 -5 4
-1 7 3 -5 2 4
-1 7 3 -5 4 2
-1 7 3 -5 4 2
Или еще интересный пример
#include <stdio.h>
#include <stdlib.h>
struct list
{
int value;
struct list *next;
};
void push_front(struct list **head, int value)
{
struct list *tmp = malloc(sizeof(struct list));
if (tmp)
{
tmp->value = value;
tmp->next = *head;
*head = tmp;
}
}
void display(struct list *head)
{
for (struct list *tmp = head; tmp; tmp = tmp->next)
{
printf("%d ", tmp->value);
}
printf("\n");
}
void swap(struct list **head, int value)
{
while (*head && (*head)->value != value)
{
head = &(*head)->next;
}
if (*head && (*head)->next)
{
struct list *next = (*head)->next->next;
(*head)->next->next = *head;
*head = (*head)->next;
(*head)->next->next = next;
}
}
int main(void)
{
struct list *head = NULL;
int a[] = { 2, -1, 7, 3, -5, 4 };
for (size_t i = 0; i < sizeof(a)/sizeof(*a); i++)
{
push_front(&head, a[i]);
display(head);
for (size_t j = 0; j < i; j++)
{
swap(&head, a[i]);
display(head);
}
printf("\n");
}
display(head);
return 0;
}
Выход программы
2
-1 2
2 -1
7 2 -1
2 7 -1
2 -1 7
3 2 -1 7
2 3 -1 7
2 -1 3 7
2 -1 7 3
-5 2 -1 7 3
2 -5 -1 7 3
2 -1 -5 7 3
2 -1 7 -5 3
2 -1 7 3 -5
4 2 -1 7 3 -5
2 4 -1 7 3 -5
2 -1 4 7 3 -5
2 -1 7 4 3 -5
2 -1 7 3 4 -5
2 -1 7 3 -5 4
2 -1 7 3 -5 4
Как обычно мой ответ лучшим . :)
Что вы написали до сих пор, что не работало в вашей функции подкачки? – reshad
Я использовал в функции 3 указателя, инициализированных головкой, затем сделал некоторое время, чтобы найти узел с требуемым значением. Первый указатель находился на узле перед узлом со значением, а второй после и третий в узле со значением. –
Пожалуйста, добавьте его в свой оригинальный вопрос, используя кнопку «Изменить». – reshad