Как поменять два соседних элемента списка? - 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, два соседних элемента списка поменяются местами.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д