算法 c语言 链式插入排序算法

来源:互联网 发布:表示网站域名的是 编辑:程序博客网 时间:2024/06/05 11:32

一.头文件linklist.h定义

#ifndef __LINKLIST_H__
#define __LINKLIST_H__

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>


typedef int datatype;
typedef struct listnode
{
    datatype data;
    struct listnode *next;
}list_node,*list_pnode;

extern void create_linklist(list_pnode h);
extern void show_linklist(list_pnode h);
extern void init_linklist(list_pnode *H);


#endif

二.函数实现linklist.c

#include"linklist.h"
void init_linklist(list_pnode *H)
{
    *H = (list_pnode) malloc(sizeof(list_node));
    if(NULL == *H)
    {
        printf("malloc failed\n");
        exit(1);
    }
    (*H)->next = NULL;
}

void create_linklist(list_pnode h)
{
    int n,i;
    list_pnode new,p;
    printf("请输入链表长度:");
    scanf("%d",&n);
    for(i = 0,p = h;i<n;i++)
    {
        new = (list_pnode) malloc(sizeof(list_node));
        if(NULL == new)
        {
            printf("malloc failed\n");
            exit(1);
        }
        scanf("%d",&new->data);
        new->next = p->next;
        p->next = new;
        p = p->next;
        show_linklist(h);
    }
}
void show_linklist(list_pnode h)
{
    list_pnode p;
    for(p = h->next;p;p = p->next)
    {
        printf("%d\t",p->data);
    }
    puts("");
}

三.包含主函数的test.c

#include"linklist.h"
#define LINKSORT
void linksort(list_pnode h)
{
    list_pnode p,q,t1,t2;
    //将链表分成两部分
    p = h->next;
    h->next = NULL;
    //按顺序将数据逐个插入到有序的链表中
    while(p!=NULL)
    {
        q = p;
        p = p->next;

        //在有序的链表中寻找插入q指向的结点的位置
        t1 = h;
        t2 = h->next;
        while(t2 != NULL && q->data>t2->data)
        {
            t1 = t2;
            t2 = t2->next;
        }
        q -> next = t2;
        t1 -> next = q;
        show_linklist(h);
    }
}
#ifdef LINKSORT
int main()
{
    list_pnode h;

    init_linklist(&h);
    printf("创建如下链表:\n");
    create_linklist(h);
    printf("用链表插入排序算法对联表排序\n");
    linksort(h);
    return 0;
}
#endif