ZBLOG

使用c++单链表实现 先用C++实现含头结点的单链表,然后实现单链表中元素位置的移动。 注意不能改变每个结点包含的数据,必须通过修改指针来实现位置调换。 Input 第一行输入整数 n,表示链表中有n个数据; 第二行依次输入 n个数据,中间用空格分隔; 第三行输入整数t,表示移动的次数; 之后t行,每行两个数,分别为当前的位置和需要移动到的位置。 注意,位置编号从1开始。 Output 第一行,输出原始列表; 之后t行,输出每一次移动后的结果。 若当前位置和目标位置相同...

以下是使用C++实现含头结点的单链表,并实现元素位置移动的代码示例:

#include <iostream>

// 定义单链表节点结构体
struct Node {
    int data;
    Node* next;
};

// 创建含有头结点的单链表
Node* createLinkedList(int n) {
    Node* head = new Node();  // 创建头结点
    Node* tail = head;        // 指向尾节点

    for (int i = 0; i < n; i++) {
        int value;
        std::cin >> value;

        Node* newNode = new Node();
        newNode->data = value;
        newNode->next = nullptr;

        tail->next = newNode;
        tail = newNode;
    }

    return head;
}

// 打印单链表
void printLinkedList(Node* head) {
    Node* current = head->next;

    while (current != nullptr) {
        std::cout << current->data << " ";
        current = current->next;
    }

    std::cout << std::endl;
}

// 获取链表长度
int getLinkedListLength(Node* head) {
    int length = 0;
    Node* current = head->next;

    while (current != nullptr) {
        length++;
        current = current->next;
    }

    return length;
}

// 移动元素位置
void moveElement(Node* head, int pos1, int pos2) {
    if (pos1 == pos2 || pos1 <= 0 || pos2 <= 0)
        return;

    int length = getLinkedListLength(head);

    if (pos1 > length || pos2 > length)
        return;

    if (pos1 > pos2)
         std::swap(pos1, pos2);

    Node* prev1 = nullptr;
    Node* prev2 = nullptr;
    Node* current = head->next;

    for (int i = 0; i < pos1 - 1; i++) {
        prev1 = current;
        current = current->next;
    }

    for (int i = 0; i < pos2 - 1; i++) {
        prev2 = current;
        current = current->next;
    }

    if (prev1 != nullptr)
        prev1->next = current;

    if (prev2 != nullptr)
        prev2->next = prev1 == nullptr ? head : prev1;

    Node* tempNext = current->next;
    current->next = prev1 == nullptr ? tempNext : prev1->next;

    if (prev2 == nullptr)
        head->next = current;

}

int main() {
    int n, t;
    std::cin >> n;

    Node* head = createLinkedList(n);

    std::cin >> t;

    std::cout << "Original List: ";
    printLinkedList(head);

    for (int i = 0; i < t; i++) {
        int pos1, pos2;
        std::cin >> pos1 >> pos2;

        moveElement(head, pos1, pos2);

        std::cout << "After Move " << i + 1 << ": ";
        printLinkedList(head);
        
       
     }
    
      return 0;
}

请注意,此代码是基于题目要求实现的,并包含了错误处理逻辑。你可以根据需要进行修改和扩展。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9365

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?