C++中的结构概述
结构(struct
)是C++中的一种复合数据类型,允许你定义自己的数据类型,将不同类型的数据组合在一起。结构与类(class
)相似,但默认情况下其成员是公有的(public),这意味着结构内的所有成员可以直接被外部访问。
结构与指针
- 结构指针:可以定义指向结构类型的指针,通过指针可以访问和修改结构成员。
- 指针作为结构成员:结构内可以包含指向其他结构或数据的指针,这对于构建复杂的数据结构(如链表)非常有用。
传递结构参数
结构作为函数参数时,可以根据情况选择值传递(结构拷贝)、指针传递或引用来传递,以优化性能或实现特定功能。
用例(指针传递):
struct Person {
std::string name;
int age;
};
void printPerson(Person* p) {
std::cout << "Name: " << p->name << ", Age: " << p->age << std::endl;
}
int main() {
Person alice{"Alice", 30};
printPerson(&alice);
}
返回结构
结构体可以作为函数的返回值,但如果结构体较大,建议使用引用或指针以避免拷贝开销。
用例(返回引用):
struct Point {
int x, y;
};
Point& findOrigin(std::vector<Point>& points) {
for(Point& p : points) {
if(p.x == 0 && p.y == 0) return p;
}
throw std::runtime_error("Origin not found");
}
int main() {
std::vector<Point> points{{1,2},{0,0}};
Point& origin = findOrigin(points);
origin.x = 10; // 修改原结构体
}
链表结构
链表是一种线性数据结构,其中的每个节点包含数据和指向下一个节点的指针。单向链表是最简单的形式,每个节点只有一个指向下一个节点的指针。
创建与遍历链表
- 定义节点结构:首先,你需要定义链表的节点结构,通常包括数据域(用于存储实际数据)和指针域(指向链表中的下一个节点)。
- 创建新节点:使用
new
操作符动态分配内存以创建新的节点,并初始化节点的数据和指针域。 - 链接节点:通过修改节点的指针域,将新节点链接到链表中。通常,链表会有一个头节点,用于标记链表的开始。
- 遍历链表:访问链表中的每一个节点,通常是沿着每个节点的
next
指针从头节点开始,直到到达nullptr
为止。
struct Node {
int data;
Node* next;
};
void printList(Node* head) {
while(head != nullptr) {
std::cout << head->data << " ";
head = head->next;
}
std::cout << std::endl;
}
int main() {
Node* head = new Node{1, nullptr};
head->next = new Node{2, nullptr};
head->next->next = new Node{3, nullptr};
printList(head);
}
删除链表节点
删除链表节点需要调整前后节点的链接关系。
void deleteNode(Node** head, int key) {
Node* temp = *head, *prev = nullptr;
if(temp != nullptr && temp->data == key) {
*head = temp->next;
delete temp;
return;
}
while(temp != nullptr && temp->data != key) {
prev = temp;
temp = temp->next;
}
if(temp == nullptr) return;
prev->next = temp->next;
delete temp;
}
int main() {
// 使用上面创建的链表
deleteNode(&head, 2);
printList(head); // 输出:1 3
}
插入链表节点
在链表的特定位置插入新节点,需要调整插入点前后节点的指针。
void insertAfter(Node* prevNode, int newData) {
if(prevNode == nullptr) return;
Node* newNode = new Node{newData, prevNode->next};
prevNode->next = newNode;
}
int main() {
// 继续使用上面的链表
insertAfter(head->next, 2.5); // 在值为2的节点后面插入2.5
printList(head); // 输出:1 2 2.5 3
}