連結串列合併-排序-logo列印參考

Shifiting Lad發表於2020-10-25

功能實現:連結串列合併,對合並後的連結串列的資料進行快排。

真的吐了 一直看程式 自己寫的話不是這兒錯了就是那兒錯了 整理一下錯的地方

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;
}

相關文章