#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。