码迷,mamicode.com
首页 > 编程语言 > 详细

单链表合并排序实现

时间:2015-05-27 09:51:52      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

原题是要实现两个已排序的单链表合并后还是已排序,但我在网上查了很多都无法直接实现.对于初学者给个算法是没多大用的,下面给出完整代码.主要思路就是先接尾再排序.而一般书是直接开始分情况if...else if...else嵌套排序.比较复杂.

/*关键:两个有序单链表的合并:其实本程序可以实现任意两个单链表的合并排序,思想就是
*1.建两个链表2.合并两个链表3.对合并后的链表排序4.打印
*关键函数:linkDList 直接连接两个链表;selectsort 单链表的选择排序*/
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "malloc.h"
#include "windows.h"//system()所在
typedef char ElemType;    
typedef struct dNode
{//声明单链表结点类型
    ElemType data;    //数据域,注意此单链表结点类型是字符型.有什么办法可以泛化呢?
    struct dNode *next;    //指针域
}LNode, *LinkList;    //定义此结构体变量struct dNode a或LNode a;定义此结构体的指针struct dNode *p或LNode *p或LinkList p都是没区别的

//此函数本程序没用到,只是为了和后面的CreateDListTail对应
LinkList CreateDListHead(LinkList head)
{
    ElemType temp;
    LinkList p;
    printf("请输入结点值");
    fflush(stdin);
    scanf("%c", &temp);
    while (temp!=0)
    {
        if ((A <= temp&&temp <= Z) || (a <= temp&&temp <= z))
        {
            p = (LinkList)malloc(sizeof(LNode));
            p->data = temp;
            p->next = head->next;
            head->next = p;    
        }
        printf("请输入结点值(输入0结束):");
        fflush(stdin);
        scanf("%c", &temp);
    }
    return head;
}
LinkList CreateDListTail(LinkList Tail)  //尾插法建立链表  
{
    ElemType temp;
    LinkList s, r;
    printf("请输入结点值");
    fflush(stdin);
    scanf("%c", &temp);
    r = Tail;
    while (temp!=0)
    {
        if ((A <= temp&&temp <= Z) || (a <= temp&&temp <= z))
        {
            s = (LinkList)malloc(sizeof(LNode));
            s->data = temp;
            r->next = s;
            r = s;
        }    
        printf("请输入结点值(输入0结束):");
        fflush(stdin);
        scanf("%c", &temp);
    }
    r->next = NULL;
    return Tail;
}
void PrintDList(LinkList head)
{
    LinkList p;
    int i = 0;
    p = head->next;//p指向第一个结点.这一步原head后的结点都会跑到p后
    while (p != NULL)
    {
        i++;
        printf("第%d个元素是:", i);
        printf("%c\n", p->data);
        p = p->next;
    }
    printf("\n");
}
void linkDList(LinkList S, LinkList T)
{/*连接2个单链表*/
    LinkList temp = S;
    while (temp->next != NULL)
        temp = temp->next;
    temp->next = T->next;
    PrintDList(S);
}
void selectsort(LinkList A)
{//将降序排列
    ElemType t;
    LinkList p, q, s;//q,s比较
    if ((A->next) && (A->next->next))    //链表为空或只有一个结点时不用排序
    {
        p = A->next;
        while (p->next)
        {
            q = p->next;
            s = p;
            while (q)
            {
                if (q->data > s->data)
                {
                    t = q->data;
                    q->data = s->data;
                    s->data = t;
                }
                q = q->next;
            }//endwhile 交换s结点和p结点的数据
            p = p->next;
        }//endwhile
    }//endif
    PrintDList(A);
}//endselectsort

void main()
{
    LinkList A=(LinkList)malloc(sizeof(LNode));
    LinkList B = (LinkList)malloc(sizeof(LNode));
    CreateDListTail(A);
    PrintDList(A);
    CreateDListTail(B);
    PrintDList(B);
    linkDList(A, B);
    selectsort(A);
    system("PAUSE");
    free(A);
    free(B);
}

代码通过VS 2013 + win 7 64 ;编译通过可运行,静态分析未通过,主要提示内存安全,API没返回值.

这个程序仅仅实现题目功能,一点都不完美.初学者能运行过谢天谢地了.

此外,代码的main部分应该可以简化吧,但是我不会.请前辈们指教.

单链表合并排序实现

标签:

原文地址:http://www.cnblogs.com/xzqhextt/p/4532433.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!