Как поменять два соседних элемента списка? - C (СИ)
Формулировка задачи:
Здравствуйте!
Как поменять два соседних элемента списка?
Вот код:
Если, например, будет нужно(в процессе сортировки) поменять местами curr и curr->next?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct A
{char name[80];
char title[80];
double r;
int age;
struct A *prev; //Previous
struct A *next;}; //Next
void main()
{
A* head = 0;
A* curr = 0;
A* prev;
A* vyv;
A* last;
char name[80];
char title[80];
int age;
double r;
int i,n; i=0;n=0;
FILE *f, *g;
f=fopen("D:\\qqq.txt","rt"); //исходный файл
g=fopen("D:\\sort1.txt","wt");//файл с отсортированным списком
if(f==NULL)
{
printf("File cannot be open");
}
else
{
// записываем "голову" списка
if(!feof(f))
{
fscanf(f, "%[^\"]s", name);
fscanf(f, "\"%[^\"]s", title);
fscanf(f, "%3*c%lf", &r);
fscanf(f, "%*s%d", &age);
//printf("%s %s %lf %d", name, title, r, age);
head = (A*) malloc(sizeof(struct A));
strcpy(head->name,name);
strcpy(head->title,title);
head->r=r;
head->age=age;
head->prev = NULL;
head->next = NULL;
prev = head; i=1;
}
// добавляем новые звенья
while(!feof(f))
{
fscanf(f, "%[^\"]s", name);
fscanf(f, "\"%[^\"]s", title);
fscanf(f, "%3*c%lf", &r);
fscanf(f, "%*s%d", &age);
//printf("%s %s %lf %d", name, title, r, age);
curr = (A*) malloc(sizeof(struct A));
strcpy(curr->name,name);
strcpy(curr->title,title);
curr->r=r;
curr->age=age;
curr->prev = prev;
curr->next = NULL;
prev->next = curr;
prev = curr; i++;
}
//А здесь должна была быть сортировка
vyv=head;
while(vyv)
{
printf("Autor: %s; Nazvanie: %s; Cennost': %5.2lf Vozrast: %d\n------------------\n", vyv->name, vyv->title,vyv->r,vyv->age);
//fprintf(g, "%s - %s %5.2lf %d", vyv->name, vyv->title,vyv->r,vyv->age);
vyv=vyv->next;
}
fclose(f); fclose(g);
}
getchar();
}Решение задачи: «Как поменять два соседних элемента списка?»
textual
Листинг программы
#include <string.h>
void swapA(struct A x, struct A y){
struct A z;
strcpy(z.name, x.name);
strcpy(z.title, x.title);
z.r = x.r;
z.age = x.age;
strcpy(x.name, y.name);
strcpy(x.title, y.title);
x.r = y.r;
x.age = y.age;
strcpy(y.name, z.name);
strcpy(y.title, z.title);
y.r = z.r;
y.age = z.age;
}
Объяснение кода листинга программы
В данном коде происходит перестановка двух соседних элементов списка, используя временную переменную struct A z, которая на момент вызова функции swapA содержит значения двух соседних элементов списка. Список действий в коде:
- Создается временная переменная struct A z.
- В z копируются значения первого элемента списка (x).
- В x копируются значения второго элемента списка (y).
- В z копируются значения второго элемента списка (y).
- Значения первого элемента списка (x) заменяются на значения второго элемента списка (y).
- Значения второго элемента списка (y) заменяются на значения первого элемента списка (x).
- В y копируются значения из z.
- В x копируются значения из z.
- Возвращается void, так как функция не возвращает значение. В итоге, после выполнения функции swapA, два соседних элемента списка поменяются местами.