c语言 数据结构-链表的二路归并 求大神发完整的代码!!不会写啊!

问题描述

链表的二路归并 求大神发完整的代码!!不会写啊!

题目:设有n个待排序元素存放在一个不带表头结点的单链表中, 每个链表结点只存放一个元素, 头指针为r。试设计一个算法, 对其进行二路归并排序, 要求不移动结点中的元素, 只改各链结点中的指针, 排序后r仍指示结果链表的第一个结点。

解决方案

http://wenku.baidu.com/link?url=X2Dpb0WQDM9YCJJj5a9n06t_jE9e_B3ElDT_-6h-JHoFiNrdrAshoye8cfwaNbtveEgyxTFCJag2AsJyE-hRno3W79Y2u6Qxeq0AeUNvbNW

解决方案二:

代码稍微有点长:

 // teste0100.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

template<typename T>
class List
{
private:
    struct Node
    {
        T data;
        Node* next;
        Node(const T& t=T()):data(t)
        {next=NULL;}
    };
    Node* head;
    Node* getPointer(int pos)
    {
        Node* p=head;
        for(int i=0;i<pos;i++)
            p=p->next;
        return p;
    }
public:
    List():head(NULL){};
    void clear()
    {
        while(head!=NULL)
        {
            Node* p = head->next;
            delete head;
            head = p;
        }
    }
    ~List()
    {
        clear();
    }
    void insert_front(const T& t)
    {
        Node* p = new Node(t);
        p->next = head;
        head = p;
    }
    void travel()
    {
        Node* p = head;
        while(p!=NULL)
        {
            cout<<p->data<<' ';
            p = p->next;
        }
        cout << endl;
    }

    void insert_back(const T& t)
    {
        Node* p = new Node(t);
        if(head == 0)
            head = p;
        else
        {
            getPointer(size()-1) -> next = p;
        }
    }
    int size()
    {
        int cnt = 0;
        Node* p = head;
        while(p != NULL)
        {
            cnt++;
            p = p->next;
        }
        return cnt;
    }
    T getHead()
    {
        if(head == NULL)
            throw "No Head";
        return head->data;
    }
    T getTail()
    {
        if(head == NULL)
            throw "No Tail";
        Node* p = head;
        while(p->next != NULL)
        {
            p = p->next;
        }
        return p->data;
    }
    bool empty()
    {
        return head==NULL;
    }
    int find(const T& t)
    {
        int pos = 0;
        Node* p = head;
        while(p!=NULL)
        {
            if(p->data == t)
                return pos;
            pos++;
            p = p->next;
        }
        return -1;
    }
    bool updata(const T& o, const T& n)
    {
        int pos = find(o);
        if(pos == -1)
            return false;
        Node* p = getPointer(pos);
        p->data = n;
        return true;
    }

    bool erase(const T& t)
    {
        int pos = find(t);
        if(pos == -1)
            return false;
        if(pos == 0)
        {
            Node* p = head->next;
            delete head;
            head = p;
        }
        else
        {
            Node* pre = getPointer(pos-1);
            Node* cur = pre->next;
            pre->next = cur->next;
            delete cur;
        }
        return true;
    }
};

解决方案三:

最近刚写过一篇博客,不过是基于C++的,供你参考:http://blog.csdn.net/cxsmarkchan/article/details/50850499
代码在这里:https://github.com/cxsmarkchan/mySTL/blob/master/lib/list_impl.h
里面的stable_sort函数就是二路归并。
都是个人的理解,希望对你有帮助。

时间: 2025-01-01 14:09:06

c语言 数据结构-链表的二路归并 求大神发完整的代码!!不会写啊!的相关文章

分层-求大神帮忙把下面代码分模块写顶层

问题描述 求大神帮忙把下面代码分模块写顶层 module jtd(clk,en,lampa,lampb,acount,bcount); input clk,en; output[3:0]lampa,lampb; output[7:0]acount,bcount; reg[3:0]lampa,lampb; reg[7:0]agreen,ayellow,aleft,ared,bgreen,byellow,bleft,bred; reg[2:0]counta,countb; reg tempa,tem

malloc-关于c语言二叉树的问题,求大神解答,急

问题描述 关于c语言二叉树的问题,求大神解答,急 这是一段关于二叉树的代码.*list_from_tree这个函数是用来建立二叉树的,但我不太懂它是如何建立二叉树的,求大神详细解释. #include #include typedef struct tnode Tnode; struct tnode{ Tnode *left; Tnode *right; int data; }; Tnode *new_tnode(int data); void print_tree(Tnode *tree, i

c语言-C语言的一个程序,求大神

问题描述 C语言的一个程序,求大神 三.实验内容 1.实验题目:手动输入10个0~100之内的整数,按从小到大排列输出.: (1)要求 排序算法: 使数组从小到大排序的规则如下: ⑴ 设数组为a[0],a[1],-,a[n-1],构造i循环从0,1,-,n-2变化,构造j循环从i+1,i+2,-,n-1变化,即j>i. ⑵ 对于任何一个a[i],如果a[i]>a[j],表面前面有一个元素a[i]比它后面的元素a[j]大,a[i]应该在后面,a[j]应该在前面,交换a[i]与a[j]. ⑶ 对于

基础-请问一个C语言奇怪的问题,求大神

问题描述 请问一个C语言奇怪的问题,求大神 //加了所有需要的头文件intmain(int argc char **argv){ struct event timeout; struct timeval tv; struct event_base *base; int flags; //printf(""pathvar=%s""getenv(""PATH"")); 注释1#ifdef WIN32 WORD wVersionRe

fanbao-c语言里面的问题,求大神解决

问题描述 c语言里面的问题,求大神解决 请问一下,如果用c编写了一个闹钟,那么怎么在电脑上运行这个程序时出现的是一个时钟的样子? 解决方案 用MFC或者WIN32来做 解决方案二: 可以去学习下VC的界面编程

strcpy-c语言比较细致的问题.求大神帮我解答.

问题描述 c语言比较细致的问题.求大神帮我解答. #include#includeint main(){ int sum=0; char array[20][200]={""""}; int m=0n; float k=0; int k1=0i; scanf(""%d""&n); for(i=0;i { scanf(""%d""&sum); scanf("&qu

数据结构_考试题_求大神相助

问题描述 数据结构_考试题_求大神相助 主题下载"> 图片说明](http://img.ask.csdn.net/upload/201501/21/1421830891_832514.png) A B c d E f g 试画出上图无向图的邻接表存储结构,并给出以定点A为出发点的深度优先遍历序列和广度优先遍历序列 解决方案 a b c d e f g a - b 1 - c 1 1 - d 0 0 1 - e 0 1 1 0 - f 0 0 0 0 1 - g 0 0 1 0 0 0 深度

不懂c语言基础的问题,求大神解答。

问题描述 不懂c语言基础的问题,求大神解答. for(j=0;j<=9;j++){ scanf(""%d""&i); a[j]=i;} 这样写为什么不行? 原代码:#includeint main(){ int a[10]ijz; printf(""请输入十个数值:""); for(j=0;j<=9;j++) scanf(""%d""&i); a[j]=i;

条件语句-c语言,打孔问题,求大神指导。

问题描述 c语言,打孔问题,求大神指导. 题目,s得到一个数,他想知道这个数每一位上的数字的孔数之和,其中,1,2,3,5,7这几个数字是没有孔的,0,4,6,9都只有一个孔,而8有两个孔. 解决方案 不知道是不是这个意思 #include <stdio.h> #include <stdlib.h> #include <string.h> int holeNum[10] = { 1, 0, 0, 0, 1, 0, 1, 7, 2, 1 } ; int getHoleNu