功能实现:链表合并,对合并后的链表的数据进行快排。
真的吐了 一直看程序 自己写的话不是这儿错了就是那儿错了 整理一下错的地方
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;
}