MergeSort需要注意的地方

今晚写MergeSort 比写QuickSort好了点 但是还是没有秒杀! 伤心。

只是记下这个需要注意的出错的地方:

数据结构:

template<typename T>struct SeqList

{

    T* pData;

    int iLength;

};

错误出在Merge函数中:

我出错的写法是:

template<typename T>void Merge(SeqList src, SeqList &dest, int seq1_start, int seq1_end, int seq2_end)

我的想法是src作为源数据,传参的时候是值传参,所以会复制整个结构体出来,这样就不会影响写入到原来的SeqList了(注意dest是一个引用)

但是我居然又遗漏了浅复制这个基本的概念。

因为我定义的结构体里面的Data是一个指针,所以复制的时候只会复制指针,而数据所在的内存区是不会复制的,也就是src和dest都指向同一个内存区。

看来使用指针一定要慎之又慎啊!!!

 

 

 

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct PNode { int data; // 数据域 struct PNode *next; // 指针域 }PNode,*LinkList; LinkList creatlist() { int len,val; LinkList pHead=(LinkList)malloc(sizeof(PNode)); if(pHead==NULL) { printf("内存分配失败,终止"); exit(-1); } LinkList pTail=pHead; pHead->next=NULL; printf("请输入生成的链表节点个数:\n"); scanf("%d",&len); for(int i = 0;i < len ;i++) { printf("请输入第%d个节点的值:",i+1); scanf("%d",&val); LinkList pNew=(LinkList)malloc(sizeof(PNode)); if(pNew==NULL) { printf("分配内存失败,终止!"); exit(-1); } pNew->data=val; pTail->next=pNew; pNew->next=NULL; pTail=pNew; } return pHead; } void printflist(LinkList L) { LinkList p=L->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } LinkList getMiddle(LinkList head) { LinkList slow = head->next, fast = head->next; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; } return slow; } LinkList merge(LinkList L,LinkList M) { LinkList dummy = (LinkList)malloc(sizeof(PNode)); dummy->next = NULL; LinkList p=dummy; LinkList q=L->next; LinkList m=M->next; while(q&&m) { if(q->data<=m->data) { p->next=q; q=q->next; } else { p->next=m; m=m->next; } p=p->next; } p->next=q?q:m; LinkList result = dummy->next; free(dummy); return result; } LinkList mergeSort(LinkList head) { if (!head || !head->next) return head; LinkList mid = getMiddle(head); LinkList right = mid->next; mid->next = NULL; return merge(mergeSort(head), mergeSort(right)); } void removeDuplicates(LinkList head) { LinkList p=head->next; while(p&&p->next) { if(p->data==p->next->data) { LinkList q=p->next; p->next=q->next; free(q); } else { p=p->next; } } } LinkList mergeLists(LinkList l1,LinkList l2) { if (!l1) return l2; if (!l2) return l1; LinkList sortedL1 = mergeSort(l1->next); LinkList sortedL2 = mergeSort(l2->next); LinkList mergedData = merge(sortedL1, sortedL2); removeDuplicates(mergedData); LinkList mergedHead = (LinkList)malloc(sizeof(PNode)); mergedHead->next = mergedData; return mergedHead; } int main() { LinkList pHead=NULL; pHead=creatlist(); LinkList pHead1=NULL; pHead1=creatlist(); LinkList merged = mergeLists(pHead, pHead1); printf("合并后: "); printflist(merged); return 0; }哪里错了
03-23
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值