【问题标题】:Swapping structures using pointers使用指针交换结构
【发布时间】:2014-02-23 13:01:17
【问题描述】:

假设我们有如下结构:

struct EMPLOYEE{

   int EmpID;
   int Sal;

} Stu[5];

如果满足以下条件,我们希望交换这些结构:

Stu[i].Sal < Stu[0].Sal

一种方法是交换整个结构。像这样的:

TempStu.Sal = Stu[i].Sal;
Stu[i].Sal = Stu[0].Sal;
Stu[0].Sal = TempStu.Sal;

TempStu.EmpID = Stu[i].EmpID;
Stu[i].EmpID = Stu[0].EmpID;
Stu[0].EmpID = Temp.Stu.EmpID;

这使它成为一种非常耗时的方法。 其他方法可能是使用指向 EMPLOYEE 结构的指针数组,然后仅对这些指针进行排序。我无法弄清楚如何做到这一点。

这是我的开始..

EMPLOYEE *St[5];

for(int j=0; j<5; j++) {

   St[j] = &Stu[j];

}

if(Stu[i].Sal < Stu[0].Sal) 
   swap(St[i],St[0]);

void swap(EMPLOYEE *A, EMPLOYEE *B) {

    EMPLOYEE temp = *A;
    *A = *B;
    *B = temp;
}

这是正确的方法吗?

【问题讨论】:

  • std::swap(Stu[i], Stu[0]);
  • 您使用的是 C 还是 C++?
  • @EdHeal C. 不过,在这种情况下有关系吗?逻辑应该适用于这两种情况,对吧?我是新手。
  • @K_K - 是的,这很重要 - 上面的选项适用于 C++,即不是 C
  • @EdHeal 好的。谢谢你:)

标签: c pointers structure


【解决方案1】:

这是一个正确的方法吗?

几乎。在swap() 中,您需要使用指向指针的指针(或在 C++ 中对指针的引用)。否则,您对 AB 所做的更改不会传播回调用者。

【讨论】:

  • 当然!就我而言,我只处理该函数的本地变量。 (引用参数与值参数的情况,对吗?)@tesseract 在他的回答中实现了您的意思。
【解决方案2】:

您的想法是正确的,但您只在函数中交换了两个本地指针。

试试这个

if(Stu[i].Sal < Stu[0].Sal) 

swap(&St[i],&St[0]);//pass the addresses

void swap(EMPLOYEE **A, EMPLOYEE **B) {

EMPLOYEE *temp = *A;
*A = *B;
*B = temp;
}

【讨论】:

    【解决方案3】:

    试试这个:

    void swap(EMPLOYEE* arr[],int i,int j)
    {
        EMPLOYEE* temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    if (Stu[i].Sal < Stu[0].Sal)
        swap(Stu,i,0);
    

    【讨论】:

      【解决方案4】:

      如果你使用数组,你可以通过每个字段交换结构,你不能使用指针。因为阵列的本质是一系列连续的存储单元。您只更改指针内的值,但不交换结构的位置。

      1. 你应该使用链表。因为它的位置是动态的,所以你可以交换它的

      【讨论】:

      • 我得到你的 cmets 会很有趣的!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      相关资源
      最近更新 更多