C++ 创建链表

C++ 创建链表

什么是链表

链表是一种线性数据结构,由一系列节点组成。每个节点存储着一段数据和对列表中下一个节点的引用(指针)。链表适用于存储数据集合时,集合大小未知或数据频繁插入或删除的情况。

C++中,我们可以通过定义一个节点类和一个链表类来创建链表。节点类代表列表中的单个节点,包含一个数据字段和一个指向下一个节点的指针。链表类中包含一个头指针,指向列表中的第一个节点,并包含用于插入、删除和遍历列表中节点的各种方法。

下面是一个C++中节点类的示例:

class Node {
public:
  int data;
  Node *next;

  Node(int data) {
    this->data = data;
    this->next = nullptr;
  }
};

这个节点类有一个公共数据字段 data ,类型为 int ,和一个指向列表中下一个节点的公共指针 next 。它还有一个构造函数,用于初始化数据字段并将下一个指针设置为nullptr。

以下是使用节点和链表类创建和操作链表的C++示例:

#include 

using namespace std;

// Node class
class Node {
public:
  int data;
  Node *next;

  Node(int data) {
    this->data = data;
    this->next = nullptr;
  }
};

// Linked list class
class LinkedList {
private:
  Node *head;

public:
  LinkedList() {
    this->head = nullptr;
  }

  void insertAtBeginning(int data) {
    Node *newNode = new Node(data);
    newNode->next = head;
    head = newNode;
  }

  void insertAtEnd(int data) {
    Node *newNode = new Node(data);
    if (head == nullptr) {
      head = newNode;
      return;
    }
    Node *temp = head;
    while (temp->next != nullptr) {
      temp = temp->next;
    }
    temp->next = newNode;
  }

  void deleteAtBeginning() {
    if (head == nullptr) {
      return;
    }
    Node *temp = head;
    head = head->next;
    delete temp;
  }

  void deleteAtEnd() {
  if (head == nullptr) {
    return;
  }
  if (head->next == nullptr) {
    delete head;
    head = nullptr;
    return;
  }
  Node *temp = head;
  while (temp->next->next != nullptr) {
    temp = temp->next;
  }
  delete temp->next;
  temp->next = nullptr;
}

void printList() {
  Node *temp = head;
  while (temp != nullptr) {
    cout << temp->data << " ";
    temp = temp->next;
  }
  cout << endl;
}
};

int main() {
// Create a linked list
LinkedList List;

// Insert some nodes at the beginning of the list
list.insertAtBeginning(3);
list.insertAtBeginning(2);
list.insertAtBeginning(1);

// Insert some nodes at the end of the list
list.insertAtEnd(4);
list.insertAtEnd(5);
list.insertAtEnd(6);

// Print the list
cout << "Original list: ";
list.printList();

// Delete a node at the beginning of the list
list.deleteAtBeginning();

// Print the List again
cout << "List after deleting a node at the beginning: ";
list.printList();

// Delete a node at the end of the list
list.deleteAtEnd();

// Print the List again
cout << "List after deleting a node at the end: ";
list.printList();

return 0;
}

输出:
C++ 创建链表

解释:

这个链表类有一个指向链表中第一个节点的私有字段head,并且有各种公共方法,用于在链表的开头和末尾插入和删除节点,并将链表打印到控制台上。这个程序将创建一个链表,在链表的开头和末尾插入一些节点,删除一个在链表开头和末尾的节点,并将链表打印到控制台。

下面是一个使用模板类在C++中创建链表的示例:

#include 

template 
class Node {
public:
  T data;
  Node *next;

  Node(T data) {
    this->data = data;
    this->next = nullptr;
  }
};

template 
class LinkedList {
private:
  Node *head;

public:
  LinkedList() {
    this->head = nullptr;
  }

  void insertAtBeginning(T data) {
    Node *newNode = new Node(data);
    newNode->next = head;
    head = newNode;
  }

  void insertAtEnd(T data) {
    Node *newNode = new Node(data);
    if (head == nullptr) {
      head = newNode;
      return;
    }
    Node *temp = head;
    while (temp->next != nullptr) {
      temp = temp->next;
    }
    temp->next = newNode;
  }

  void deleteAtBeginning() {
    if (head == nullptr) {
      return;
    }
    Node *temp = head;
    head = head->next;
    delete temp;
  }

  void deleteAtEnd() {
    if (head == nullptr) {
      return;
    }
    if (head->next == nullptr) {
      delete head;
      head = nullptr;
      return;
    }
    Node *temp = head;
    while (temp->next->next != nullptr) {
      temp = temp->next;
    }
    delete temp->next;
    temp->next = nullptr;
  }

  void printList() {
    Node *temp = head;
    while (temp != nullptr) {
      std::cout << temp->data << " ";
      temp = temp->next;
    }
    std::cout << std::endl;
  }
};

int main() {
  // Create a linked list
  LinkedList list;

  // Insert some nodes at the beginning of the list
  list.insertAtBeginning(3);
  list.insertAtBeginning(2);
  list.insertAtBeginning(1);

  // Insert some nodes at the end of the list
  list.insertAtEnd(4);
  list.insertAtEnd(5);
  list.insertAtEnd(6);

  // Print the list
  std::cout << "Original list: ";
  list.printList();

  // Delete a node at the beginning
  // Delete a node at the beginning of the list
  list.deleteAtBeginning();

  // Print the List again
  std::cout << "List after deleting a node at the beginning: ";
  list.printList();

  // Delete a node at the end of the list
  list.deleteAtEnd();

  // Print the List again
  std::cout << "List after deleting a node at the end: ";
  list.printList();

  return 0;
}

输出:

C++ 创建链表

解释:

在上面的代码中,我们定义了一个模板类Node,它表示链表中的一个节点。Node类有一个公共数据字段data,其类型为T(其中T是一个模板参数),还有一个公共指针指向List中的下一个节点。它还有一个构造函数,用于初始化数据字段并将下一个指针设置为nullptr。

我们还定义了一个模板类LinkedList,它表示一个链表,并包含一个私有字段head,该字段指向List中的第一个节点。LinkedList类有各种公共方法,用于在List的开头和结尾插入和删除节点,并将List打印到控制台上。

insertAtBeginning方法使用给定的数据创建一个新节点,并通过更新head指针将其插入到List的开头。insertAtEnd方法使用给定的数据创建一个新节点,并通过遍历List并更新最后一个节点的下一个指针将其插入到List的末尾。deleteAtBeginning方法通过更新head指针并释放节点使用的内存来删除List中的第一个节点。deleteAtEnd方法通过遍历List并更新倒数第二个节点的下一个指针来删除List中的最后一个节点。printList方法遍历List并将每个节点的数据打印到控制台上。

在main函数中,我们创建了一个LinkedList类的实例,并调用各种方法来插入、删除节点和打印List。输出显示了原始List,删除开头节点后的List以及删除末尾节点后的List。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程