C 将结构更改为类

C++ Changing Struct to Class

本文关键字:结构      更新时间:2023-10-16

我正在进行链接列表练习,目前了解如何以结构格式编写链接列表。但是,我想更改我的代码,以使链接列表成为一类,并将打印,排序,添加,删除,作为类成员的功能。请给我关于如何完成的想法。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cstddef>
using namespace std;
struct mylist {
    int payload;
    struct mylist * link;
};
void addlink(struct mylist *, int);
struct mylist * droplink(struct mylist *);
void printmylist(struct mylist *);
void sortmylist(struct mylist *);
int main() {
    struct mylist head;
    struct mylist *lptr;
    head.payload = 15;
    head.link = 0;
    lptr = &head;
    printmylist(lptr);
    addlink(lptr, 21);
    printmylist(lptr);
    addlink(lptr, -5);
    printmylist(lptr);
    addlink(lptr, 90);
    printmylist(lptr);
    lptr = droplink(lptr);
    printmylist(lptr);
    sortmylist(lptr);
    printmylist(lptr);
    return 0;
}
void addlink(struct mylist *lp, int val) {
    struct mylist *temp;
    struct mylist *newlink;
    //run out to end of chain
    temp = lp;
    do {
        if (temp->link != 0)
            temp = temp->link;
    } while (temp->link != 0);
    newlink = (struct mylist *) malloc(sizeof(struct mylist));
    newlink->payload = val;
    newlink->link = 0;
    temp->link = newlink;
    return;
}
struct mylist * droplink(struct mylist *lp) {
    cout << "Releasing front value of " << lp->payload << endl;
    return lp->link;
}
void printmylist(struct mylist *lp) {
    struct mylist *temp;
    temp = lp;
    while (temp->link != 0) {
        cout << temp->payload << " then ";//if there is just one link, loop never runs
        if (temp->link != 0)
            temp = temp->link;
    }
    cout << temp->payload; //gets the last link's value
    cout << endl;
    return;
}
void sortmylist(struct mylist *lp) {
    struct mylist *temp;
    struct mylist *temp2;
    int linkcount = 1;
    int temppayload;
    temp = lp;
    while (temp->link != 0) {
        if (temp->link != 0) {
            ++linkcount;
            temp = temp->link;
        }
    }
    cout << linkcount << " links " << endl;
    temp = lp;
    for (int ct2 = 1; ct2 < linkcount; ++ct2) {
        temp = lp;
        for (int ct = 1; ct < linkcount; ++ct) {
            if (temp->link != 0)
                temp2 = temp->link;
            if (temp->payload > temp2->payload) {
                temppayload = temp->payload;
                temp->payload = temp2->payload;
                temp2->payload = temppayload;
            }
            if (temp2->link != 0)
                temp = temp2;
        }
    }
}

C 中structclass之间的唯一真正区别是,默认情况下,class的所有成员都是私有的,struct的所有成员都是公共的。

我认为您真正问的是如何使您的结构/类的链接列表方法成员。这很容易。

您现有的所有方法都接受struct mylist*作为第一个参数。在C 中,这是由编译器自动提供的,称为this的隐藏参数。您可以显式参考this,但也可以隐式访问。

所以您可能在哪里有:

lp->payload = 0;

在C 类成员函数中,您可以拥有:

this->payload = 0;

或更常见:

payload = 0;

很广泛地说," C "您的C代码所需的步骤是:

  • 将方法的声明移至struct
  • 的正文中
  • 从每种方法中删除struct mylist *参数
  • 删除每种方法中lp的引用
  • 通过指定struct的实例(例如lptr->addlink(-5);
  • 来调用成员函数

通常,您可以从以下方式更改传递给链接列表函数的每个结构:

struct Node {
    int payload;
    struct Node *link;
};
...
void addlink(struct Node *lp, int val) {
...
}

class Node {
public:
    Node() : _link(0), _payload(0) { }  // initialize members on new empty node
    Node(int val) : _link(0), _payload(val) { } // pass a new value directly
    ~Node() { 
        // call a function to clear everything pointed to from _link
    }
    void addlink(int val) {
        Node *temp = this;
        do {
            if (temp->link() != 0)
                temp = temp->link();
        } while (temp->link() != 0);
        Node *newlink = new Node(val); // this will do what the next 2 lines do
        //Node *newlink = new Node;  <- you can also create a Node this way and then assign the payload
        //newlink->setPayload(val);
        // newlink->link = 0;  <-- not needed 'new Node' has already initialized it
        temp->setLink(newlink);
    }
// provide access to the data (get/set)
    int payload() { return _payload; }
    void setPayload(int n) { _payload = n; }
    Node *link() { return _link; }
    void setLink(Node *p) { _link = p; }
// data members
private:
    int _payload;
    Node *_link;
};

这个片段给了您这个主意。现在您可以添加其余的:)当然,最好的是将代码放在.cpp文件中的函数中,然后将类的定义留在标题中:

class Node {
public:
    Node();
    Node(int val); // pass a new value directly
    ~Node();
    void addlink(int val);
// provide access to the data (get/set)
// you can leave thse one liners in the header, they'll most likely be inlined
    int payload() { return _payload; }
    void setPayload(int n) { _payload = n; }
    Node *link() { return _link; }
    void setLink(Node *p) { _link = p; }
// data members
private:
    int _payload;
    Node *_link;
};

CPP中功能的身体:

Node::Node() : _link(0), _payload(0)
{
}
Node::Node(int val) : _link(0), _payload(val) 
{
}
......

希望这会有所帮助。