C++的鍊表

#include <iostream>
#include "listElement.h"

//====
//這是自己想出來的,把原版本框起來表揚


    /*
    高效率的算法猜想
    使用數據創建新鍊表 然後比較數據跟以往的數據 找到位置 如果是最後或最前(最大或最小)更動鍊表的指針1次 , 其餘在中間 更動兩次

    問題在於找到數據大小的位置
    ListElement* p = pList;是當前的鍊表頭
    p=p->pNext是鍊表頭的底下一個
    if (p->pNext->pNext == NULL)是最後一個有數據的鍊表
    if (p->pNext == NULL)是沒數據的鍊表底
    通過while (p != NULL){p = p->pNext;}來訪問到

    p->pNext->value會比v大 但是p->value會比v小 代表v的位置在他們中間 ,更改p->pNext指向v ,v指向p,完成算法

    第一步先處理鍊表底之後的或鍊表頭

    */

    //ListElement* newPList = new ListElement;
    //ListElement* p = pList;
    //newPList->value = v;
    //
    //if (p == NULL)    //例外處理: 當前是第一個數據
    //{
    //    newPList->pNext = pList;
    //    return newPList;
    //}
    //
    //if (v <= p->value)    //v是當前最小的 最小的放在鍊表頭 
    //{
    //    newPList->pNext = pList;
    //    return newPList;
    //}
    //
    //while (p->pNext != NULL)//把p修改為最底數據 在只有一個數據的情況下會出錯
    //{
    //    p = p->pNext;
    //}
    ///*note 如何得到指向最底(-1,0,+1)層...的鍊表
    //*     while (p != NULL){p = p->pNext;}代表最後p=null。
    //*   while (p->pNext != NULL){p = p->pNext;}代表最後p=最底鍊表。
    //*   while (p->pNext->pNext != NULL){p = p->pNext;}代表最後p=最底鍊表的上一個,也就是第一個數據。
    //*/
    //
    //if (v >= p->value)    //v是當前最大的 
    //{
    //    newPList->pNext = p->pNext;    //最大指向最底鍊表
    //    p->pNext = newPList; //第二大指向最大
    //    return pList;
    //}
    //p = pList;//重新指向最頂, 以排除最大與最小 目前處理位於兩鍊表中間
    //
    //while ((p->value <= v && v <= p->pNext->value) == false)// v比當前指向大 v比當前指向下一層還小 代表v在當前和當前指向下一層中間 如果這兩件事沒成立 則繼續找
    //{
    //    p = p->pNext;
    //}
    //
    //newPList->pNext = p->pNext;
    //p->pNext = newPList;
    //return pList;
    //
    //


ListElement* insertToList(ListElement* pList, int v)
{
    //此版本經由chatgpt重新編寫以提高效率
    /*原思路 1.處理空鍊表 2.處理只有一數據 3.處理v是數據中最大的 4.處理v大小在兩數據中間*/
    /*時間複雜度O(n) 空間複雜度O(1)*/

    ListElement* newPList = new ListElement;
    ListElement* p = pList;
    newPList->value = v;
    /*chatgpt改動*/newPList->pNext = NULL; // 新节点的下一个节点应该初始化为NULL


    /*myVersion*/
    //if (p == NULL)    //當前為空
    //{
    //    newPList->pNext = pList;
    //    return newPList;
    //}
    //if (v <= p->value)    //v是當前最小的 
    //{
    //    newPList->pNext = pList;
    //    return newPList;
    //}
    
    /*chatgptVersion*/
    //处理插入到链表头部的情况
    if (pList == NULL || v <= pList->value) {
        newPList->pNext = pList;
        return newPList;
    }

    /*myVersion*/
    //while (p->pNext != NULL)//把p修改為最底數據 
    //{
    //    p = p->pNext;
    //}
    //if (v >= p->value)    //v是當前最大的 
    //{
    //    newPList->pNext = p->pNext;    
    //    p->pNext = newPList; 
    //    return pList;
    //}

    //p = pList;//重新指向最頂, 目前處理位於兩鍊表中間
    //while ((p->value <= v && v <= p->pNext->value) == false)// v比當前指向大 v比當前指向下一層還小 代表v在當前和當前指向下一層中間 如果這兩件事沒成立 則繼續找
    //{
    //    p = p->pNext;
    //}

    //newPList->pNext = p->pNext;
    //p->pNext = newPList;
    //return pList;
    
    /*chatgptVersion*/
    /*經chatgpt改動 ,可看出,只要找到比v大的那一個數據即可,並且,不需要處理v是最大的情況,chatgptVersion能夠簡化上述兩者情況的處理*/
    // 遍历链表以找到插入位置
    while (p->pNext != NULL && p->pNext->value < v) {
        p = p->pNext;
    }
    // 在p和p->pNext之间插入新节点
    newPList->pNext = p->pNext;
    p->pNext = newPList;
    return pList; // 返回链表的头部指针
}

鍊表這東西,1.初始化會存在一個NULL鍊表,這個NULL不會再指向新鍊表也不會儲存數據,被稱為鍊表的底部。

這個NULL鍊表還能讓你通過while(鍊表指針!=null){p=p.next};慢慢地得到一個指向這個NULL鍊表的指針,此外,這個while(鍊表指針!=null){p=p.next};還能讓你得到指向鍊表底部上一個、上兩個、...上n個的鍊表,通過while(鍊表指針->next->next....->next!=null){p=p.next};

然後,你可以創建新鍊表指向NULL鍊表 ,這個新鍊表稱為鍊表頭,也就是最上層,可以通過鍊表頭->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next->next慢慢地指完指針鍊表數據結構最後指向NULL(你可以通過while完成),如果指向NULL的下一個,也就是不存在,就會溢位報錯。

還有一件重要的東西,鍊表指針,通過複製當前的鍊表頭指針,得到一個鍊表頭指針複製品,可以通過他來做一些判斷,像是本文中的排序新加入鍊表成員。

最後,你會希望你返回的總是鍊表頭,打印鍊表也是通過鍊表頭。

其餘代碼是導師發給我的,不太敢直接發出來,不過這個是我寫的:D。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值