連結串列合併-排序-logo列印參考
功能實現:連結串列合併,對合並後的連結串列的資料進行快排。
真的吐了 一直看程式 自己寫的話不是這兒錯了就是那兒錯了 整理一下錯的地方
1.連結串列合併的時候需要注意把連結串列一 end節點的next指向連結串列二的頭節點的next 注意不是頭節點
!!!!!!!頭節點是沒有資料的
2.對兩個連結串列合併以及合併後排序的函式內部 注意!!!返回連結串列頭節點 !!!可以先用一個 指標記錄下頭節點地址然後返回
3.連結串列不是list容器 也不是陣列 不要 (list+10)->date這種神奇操作來訪問第十個元素
建議寫一個 函式利用 for迴圈迭代找到所需要資料!!參考 以下 listn()函式
4.算是演算法的bug 我用的是自己寫的快排 我發現一旦有重複值,就會無限迴圈 ,所以我加了一條if限定如下
if ((n < 2)||((n==2)&&(listn(list,1)->data==listn(list,2)->data))) return;
最後,程式寫註釋是不可能的,打死也不會寫的
有問題歡迎討論,虛心接受各種指點。
#include <iostream>
#include <string>
using namespace std;
typedef struct listpoint
{
int data;
listpoint *next;
listpoint *last;
}listpoint;
listpoint *creat_noraml_list(int n)
{
listpoint *head,*normal,*end;
head = (listpoint*)malloc(sizeof(listpoint));
end = head;
for(int i = 0;i<n;i++){
normal = (listpoint*)malloc(sizeof(listpoint));
cout <<"Please input the number: ";
cin >> normal->data;
end->next = normal;
normal->last = end;
end = normal; //最後一個節點變成新節點
cout<<"檢測輸入資料地址:" << normal<<endl;
}
end->next = NULL;
head->last = NULL;
return head;
}
listpoint * mergeList(listpoint*list1,listpoint*list2)
{
cout<<"檢測11---"<<list1->next;
listpoint* list_1 = list1;
for (int i = 1; i <= 4; i++)
{
list1= list1->next;
}
list1->next = list2->next;
cout<<"檢測11---"<<list_1->next;
return list_1;
}
listpoint* listn( listpoint* l1,int n)
{
listpoint*l2=l1;
for (int i = 1; i <= n; i++)
{
if (l2->next!=NULL)
{
l2 = l2->next;
}
}
return l2;
}
void quickSort(listpoint* list,int n)
{
listpoint * list1 = list;
int i , j;
cout<<"開始檢測1---"<<list->next<<" ";
int val = listn(list,(n+1)/2)->data;
cout<<"對比數val="<<val<<endl;
cout << val<<endl;
if ((n < 2)||((n==2)&&(listn(list,1)->data==listn(list,2)->data))) return;
cout << "start quicksort:";
for ( j = 1; j <=n; j++){
if (list1->next!=NULL)
{
list1 = list1->next;
cout << list1->data <<" ";
}
}
list1 = list;
cout << " " ;
for ( i = 1, j = n; ; i++,j--){
cout<<"開始檢測2——————"<<list->next<<" ";
while (listn(list,i)->data < val && i<j) {
i++ ;
cout<<"i加一次"<<endl;}
cout<<"找到比val大的數"<<listn(list,i)->data<<endl;
while (listn(list,j)->data > val && i<j){
j--;
cout<<"j減一次"<<endl;}
cout<<"找到比val小的數"<<listn(list,j)->data<<endl;
if (i >= j) break;
cout<<"任意鍵交換資料?"<<endl;
int temp = listn(list,i)->data; listn(list,i)->data = listn(list,j)->data; listn(list,j)->data = temp;
cout<<"交換完畢"<<endl;
cout<<"左邊"<<listn(list,i)->data;
cout<<" 右邊"<<listn(list,j)->data<<endl;
}
cout << endl ;
quickSort (list1,i);
quickSort (listn(list1,i),n-i);
cout << "end quicksort:";
for ( j = 1; j <= n; j++){
if (list1->next!=NULL)
{
list1 = list1->next;
cout << list1->data <<" ";
}
}
}
void printInfo(listpoint* list)
{
cout<<"排序後連結串列資料為:"<<endl;
for (int i = 1; i <= 8; i++)
{
if (list->next!=NULL){
list = list->next;
cout<<list->data<<endl;
}
}
}
int main()
{
listpoint * list1;
listpoint * list2;
listpoint * list3;
cout<<"請輸入連結串列1的資料"<<endl;
list1 = creat_noraml_list(4);
cout<<"請輸入連結串列2的資料"<<endl;
list2 = creat_noraml_list(4);
list3 = mergeList(list1,list2);
quickSort(list3,8);
cout<<"開始列印排序後的連結串列"<<endl;
printInfo(list3);
system("pause");
return 0;
}
相關文章
- 合併K個排序連結串列排序
- 演算法基礎~連結串列~排序連結串列的合併(k條)演算法排序
- LeetCode 23. 合併K個排序連結串列LeetCode排序
- leetcode23. 合併K個排序連結串列LeetCode排序
- JZ-016-合併兩個排序的連結串列排序
- 演算法:排序連結串列:歸併排序演算法排序
- 淺談歸併排序:合併 K 個升序連結串列的歸併解法排序
- [C++]歸併排序(連結串列描述)C++排序
- 反轉連結串列、合併連結串列、樹的子結構
- 合併兩個有序連結串列
- 【TUNE_ORACLE】列出走了錯誤的排序合併連線的SQL參考Oracle排序SQL
- 利用遞迴實現連結串列的排序(歸併排序)遞迴排序
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- [每日一題] 第十八題:合併兩個排序的連結串列每日一題排序
- 劍指 Offer 25. 合併兩個排序的連結串列 JavaScript實現排序JavaScript
- Golang從合併連結串列聊遞迴Golang遞迴
- leecode.23. 合併K個升序連結串列
- 148. 排序連結串列排序
- 連結串列-插入排序排序
- ④從尾到頭列印連結串列
- 23. 合併K個元素的有序連結串列
- 遞迴:21. 合併兩個有序連結串列遞迴
- 每日leetcode——21. 合併兩個有序連結串列LeetCode
- leetcode雙週賽(2)-合併兩個連結串列LeetCode
- 歸併排序:陣列和連結串列的多種實現排序陣列
- Leetcode 21 合併兩個有序連結串列 學習感悟LeetCode
- 【LeetCode Hot 100】21. 合併兩個有序連結串列LeetCode
- 單連結串列的排序問題排序
- 將兩個升序連結串列合併為一個新的 升序 連結串列並返回。(新手篇06)
- 牛客網高頻演算法題系列-BM4-合併兩個排序的連結串列演算法排序
- 【演算法-java實現】合併兩個有序連結串列演算法Java
- [連結串列】2.輸入一個連結串列,反轉連結串列後,輸出新連結串列的表頭。[多益,位元組考過]
- 資料結構實驗之連結串列四:有序連結串列的歸併資料結構
- 牛客網高頻演算法題系列-BM5-合併k個已排序的連結串列演算法排序
- 7-24 兩個有序連結串列序列的合併 (20 分)
- 7-2 兩個有序連結串列序列的合併 (20分)
- Fourth. LeetCode 21:MergeTwo Sorted Lists 合併兩個有序連結串列LeetCode
- 通用雙向連結串列的設計(參考Linux系統中的實現)Linux