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 中struct
和class
之间的唯一真正区别是,默认情况下,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)
{
}
......
希望这会有所帮助。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?