【问题标题】:How can I use double pointers correctly in this case?在这种情况下如何正确使用双指针?
【发布时间】:2019-10-09 13:45:59
【问题描述】:

我正在做一个登机队列,我正在使用一个简单的冒泡排序算法对我拥有的队列进行排序,我使用 2 个指针来存储我正在比较的值,并使用 2 个双指针来修改我在每个节点内的值想换。我的问题是,当我想更改双指针指向的位置以遍历所有队列时,它永远不会编译,我已经尝试过:

这个:**r = &(r->next),

这个:**r = &(*r->next)

或者这个:**r = &(**r->next)

当我尝试更改双指针“a”指向的位置时也会发生同样的情况。这是完整的方法,以防万一您需要查看它,

int sortBoardingQueue(BoardingQueue *qPtr){
    int size = calculateSize(qPtr);

    Passenger *t = qPtr->head;
    Passenger *a = qPtr->head->next;
    Passenger **r = &(qPtr->head);
    Passenger **q = &(qPtr->next);
    for (int i = size-1; i <=0; i--)
    {
        while(t != NULL){
            if (t->seatNumber>a->seatNumber)
            {
                **r = *a;
                **q = *t;
            }
            t = t->next;
            a = a->next;
            **r = &(r->next);
            **a = &(a->next);
        }
    }

}

//the declarations of the structs I am using in my header file
typedef struct boardingQueue {
    Passenger* head; // points to the Passenger at the front/head of the queue
    Passenger* tail; // points to the Passenger at the end/tail of the queue
} BoardingQueue;

typedef struct passenger {
char name[30];          // the passenger's name
double passportNumber;  // their passport number
int seatNumber;         // their seat number on the plane
struct passenger* next; // a pointer to the next passenger in the queue after this one
} Passenger;

【问题讨论】:

  • @Andrés Álvarez 显示乘客的定义。
  • a 不是双指针,**rPassenger,不是指针。如果要更改r 指向的位置,请为r 分配一个新值。不要随意插入和号和星号,试图偶然发现正确的代码(即使它可以编译,也很可能不会)。
  • 是C语言:
  • 编辑:结构体乘客已经在代码中
  • struct boardingQueue 应该包含 "next" 用于初始化 q (Passenger **q = &(qPtr->next);)

标签: c pointers


【解决方案1】:

如果指针r是这样声明和初始化的

Passenger **r = &(qPtr->head);

然后在这个语句中

**r = &(r->next);

**r 的类型为 Passenger。此外 r 指向一个指针。 S 这个表达式r-&gt;next 不正确,因为指针没有数据成员 next(指针不是结构)。

所以所有三个表达式

**r = &(r->next),

**r = &(*r->next),

**r = &(**r->next)

不正确。例如表达式

&(**r->next)

等价于

&(** ( r->next ) )

看来你的意思是如下

r = &( *r )->next;

考虑到这个声明

Passenger **q = &(qPtr->next);

也是无效的,因为结构BoardingQueue没有数据成员next

也是for循环中的条件

for (int i = size-1; i <=0; i--)

无效。只有size小于等于1时才有效。:)

您必须至少使用有效的 C 表达式重新重写函数 sortBoardingQueue。之后你可以问一个问题:为什么我的排序功能不起作用。:)

【讨论】:

    【解决方案2】:

    -- 如果发布的代码 sn-p 正是您输入编译器的内容,并且您包含编译器错误与它们出现时完全相同,那么下一次将更容易获得答案> 带着你的问题。

    我重组了您的示例代码 + 添加了一个 main 函数来显示一些编译器错误以说明我的意思:


    代码示例

    #define NULL 0
    //the declarations of the structs I am using in my header file
    typedef struct passenger {
    char name[30];          // the passenger's name
    double passportNumber;  // their passport number
    int seatNumber;         // their seat number on the plane
    struct passenger* next; // a pointer to the next passenger in the queue after this one
    } Passenger;
    
    typedef struct boardingQueue {
        Passenger* head; // points to the Passenger at the front/head of the queue
        Passenger* tail; // points to the Passenger at the end/tail of the queue
    } BoardingQueue;
    
    int sortBoardingQueue(BoardingQueue *qPtr){
        int size = 3; // func undefined?? calculateSize(qPtr);
    
        Passenger *t = qPtr->head;
        Passenger *a = qPtr->head->next;
        Passenger **r = &(qPtr->head);
        Passenger **q = &(qPtr->next);
        for (int i = size-1; i <=0; i--)
        {   
            while(t != NULL){
                if (t->seatNumber>a->seatNumber)
                {
                    **r = *a; 
                    **q = *t; 
                }
                t = t->next;
                a = a->next;
                **r = &(r->next);
                **a = &(a->next);
            }
        }   
    
    }
    
    int main(){
        // make passengers
        Passenger a = {"p1", 111.0, 1, NULL};
        Passenger b = {"p2", 222.0, 2, NULL};
        Passenger c = {"p2", 222.0, 3, NULL};
    
        // make boarding queue a->c->b
        a.next = &c; 
        c.next = &b; 
        BoardingQueue q = {&a, &b};
    
        sortBoardingQueue(&q);
    }
    

    编译器错误

    dp.c:在函数“sortBoardingQueue”中:dp.c:22:27:错误: ‘BoardingQueue {aka struct boardQueue}’没有名为‘next’的成员 Passenger **q = &amp;(qPtr-&gt;next);

    从这一点来看,这是因为boardingQueue 没有成员next,只有headtail。 (也许你想让它指向一位乘客?我无法从上下文中看出你的意图)

    dp.c:33:22: error: request for member ‘next’ in something not a structure or union
                  `**r = &(r->next);`
    

    对于这个,r 的类型是Passenger **,所以它指向一个乘客结构。如果您真的想访问该结构的下一个字段,则必须使用(*r)-&gt;next

      dp.c:34:13: error: invalid type argument of unary ‘*’ (have
     ‘Passenger {aka struct passenger}’)
                  **a = &(a->next);
    

    对于这个,a 是一个单指针。您只能取消引用一次。


    所以,我希望这对你完成这项任务有很大帮助!下一次,如果您发布一个最小的、可重复的示例https://stackoverflow.com/help/minimal-reproducible-example,您一定会更快地获得更好的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多