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 }