对chatGPT写出链表的笔记

问题如下 

 回答及笔记如下

#include <iostream>
using namespace std;

struct Node {
    int data;
    string name;
    Node* next;
};

void insert(Node** head, int data,string name) {//接收一个指向“指向Node结构的指针”,即变量“head”是一个指向指针的指针
    Node* newNode = new Node;//创建一个新的node结构,并创建指针“newNode”指向这个结构,注意new出来的是一个地址
    newNode->data = data;
    newNode->name = name;
    newNode->next = *head;//对“head”解除引用,*head是一个“指向Node结构的空指针”
    //1.把新创建的结点加入到原有链表的头部
    //2.如果没有,就在尾部留下一个空指针
    *head = newNode;//更新指向头部结点的指针
}//1.注意这一段代码是在链表头部插入新结点
//2.此处使用Node**是为了直接操作head这个变量
//3.尾部会留下一个空指针

void printList(Node* node) {
    while (node != nullptr) {
        cout << node->data << " "<<node->name<<"\n";
        node = node->next;//从头开始打印
    }
    cout << endl;
}

void sortList(Node** head) {
    const int MAX_VALUE = 100;//注意这个是结点中数据的最大值(问:若数据过大怎么处理)
    Node* index[MAX_VALUE + 1] = { nullptr };//创建一个index指针数组,长度是101,全部初始化为空指针
    Node* current = *head;//指向整个链表的头结点

    while (current != nullptr) {
        Node* next = current->next;//备份当前结点指向下一结点的指针
        current->next = index[current->data];//把当前结点插到data值相同的链表前面,若没有,则将指向下一结点的指针设为空指针
        index[current->data] = current;//把“指向当前结点”的指针加入对应数值的指针数据中
        current = next;//当前结点处理完毕,循环至下一个结点
    }
    //此过程可以理解为把链表拆分为若干结点分别处理,数组存储了所有“带有相同值的结点”形成的链表的头结点
    //在下面的循环中再按顺序把这拆出来的若干链表连成一个链表
    //指针数组中储存的是指向这一系列同值结点链表头结点的一个指针


    *head = nullptr;

    for (int i = MAX_VALUE; i >= 0; i--) {//提问:如果改成(int i=0;i<=MAX_VALUE;i++)是不是降序)
        Node* current = index[i];
        while (current != nullptr) {
            Node* next = current->next;//备份当前结点指向下一结点的指针
            current->next = *head;
            *head = current;
            current = next;//处理下一个
        }
    }
}
//注意这个链表实现的插入永远是插在头部
//大意: A1 A2 A3   B1 B2 B3 --A1 A2 A3   B3 B2 B1--A3 A2 A1 B3 B2 B1
//while处理每一小节链表,for处理储存在数组中的若干链表
//最尾部(B1 B2 B3)链表作为最先处理的链表,可以理解为本体,处理完毕后(B3 B2 B1)处理下一节链表,每个结点被拆出来插到本体的前端(A1 B3 B2 B1--A2 A1 B3 B2 B1--A3 A2 A1 B3 B2 B1)



int main() {
    Node* head = nullptr;//head是一个指向Node结构的空指针,是“指向第一个结点”的
    insert(&head, 1,"a1");//注意到head是一个指针,此处&head传递了一个指针的地址
    insert(&head, 1,"a2");
    insert(&head, 1,"a3");
    insert(&head, 2,"b1");
    insert(&head, 2,"b2");
    insert(&head, 2,"b3");

    cout << "Original List: "<<"\n";
    printList(head);

    sortList(&head);

    cout << "\n"<<"Sorted List :" << "\n";
    printList(head);

    return 0;
}

//问题1:链表中数据在排序后能否保持原有相对顺序

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值