Как поменять два соседних элемента списка? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Как поменять два соседних элемента списка? Вот код:
#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();
}
Если, например, будет нужно(в процессе сортировки) поменять местами curr и curr->next?

Решение задачи: «Как поменять два соседних элемента списка?»

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 содержит значения двух соседних элементов списка. Список действий в коде:

  1. Создается временная переменная struct A z.
  2. В z копируются значения первого элемента списка (x).
  3. В x копируются значения второго элемента списка (y).
  4. В z копируются значения второго элемента списка (y).
  5. Значения первого элемента списка (x) заменяются на значения второго элемента списка (y).
  6. Значения второго элемента списка (y) заменяются на значения первого элемента списка (x).
  7. В y копируются значения из z.
  8. В x копируются значения из z.
  9. Возвращается void, так как функция не возвращает значение. В итоге, после выполнения функции swapA, два соседних элемента списка поменяются местами.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.75 из 5
Похожие ответы