• Foundation Sorting: Single List Insertion Sort


    /* List Insertion Sorting.
     * Implementation history:.
     * 2013-09-15, Mars Fu, first version.
     */
    
    #include "stdafx.h"
    
    #include "list_insertion.h"
    
    int 
    init_list(struct s_clist *hd, int max_cnt, struct s_nodes *nodes)
    {
    	if (hd == NULL) return 0;
    	if (max_cnt < 0) return 0;
    
    	hd->node = NULL;
    
    	nodes->cur = hd;
    	nodes->hd = hd;
    	memset(nodes->cur, 0, sizeof(struct s_clist));
    	nodes->nodes_cnt = 0;
    	nodes->max_nodes_cnt = max_cnt;
    
    	debug("nodes->max_nodes_cnt %d 
    ", nodes->max_nodes_cnt);
    
    	return 1;
    }
    
    int 
    insert_list_sort(struct s_node *node, struct s_nodes *nodes, cmp_func cmp)
    {
    	struct s_clist *tmp;
    	struct s_clist *next;
    
    	if (node == NULL) return 0;
        if (nodes->cur == NULL) return 0;
    
    	next = (struct s_clist *)malloc(sizeof(struct s_clist));
    	if (next == NULL) {
    		debug("malloc list failed 
    ");
    		return 0;
    	}
    
    	next->node = node;
    
    	tmp = nodes->hd->pre;
    
    	if (tmp == NULL) {
    		tmp = nodes->hd;
    	   	tmp->next = next;
    		next->pre = tmp;
    		next->next = nodes->hd;
    		nodes->hd->pre = next;
    	}
    	else {
    
    		while (tmp != NULL) {
    			if (tmp->node == NULL) break;
    			if (cmp(tmp->node->key, node->key) < 0) break;
    			tmp = tmp->pre;
    		}
    
    		next->next = tmp->next;
    		tmp->next->pre = next;
    		tmp->next = next;
    		next->pre = tmp;
    	}
    
        nodes->cur = nodes->hd->pre;
        nodes->nodes_cnt++;
    
    	return 1;
    }
    
    int
    is_list_full(struct s_nodes *nodes)
    {
    	return (nodes->nodes_cnt >= nodes->max_nodes_cnt);
    }
    
    int 
    get_list_cnt(struct s_nodes *nodes)
    {
    	return nodes->nodes_cnt;
    }
    
    int 
    delete_item_from_list(struct s_node *node, struct s_nodes *nodes)
    {
    	struct s_clist *cur;
    
    	if(node == NULL) return 0;
    
    	cur = nodes->hd;
    	cur = cur->next;
    	while(cur->node != NULL) {
    		if(cur->node != node) {
    			cur = cur->next;
    			continue;
    		}
    
    		cur->pre->next = cur->next;
    		cur->next->pre = cur->pre;
    
    		cur->next = NULL;
    		cur->pre = NULL;
    		free(cur->node);
    		free(cur);
    
    		nodes->nodes_cnt--;
    
    		return 1;
    	}
    
    	return 0;
    }
    
    
    #ifdef LIST_INSERTION_DEBUG
    
    static int 
    int_increasing_cmp(void* lv, void* rv)
    {
    	int tmp_lv, tmp_rv;
    	
    	tmp_lv = *(int*)lv;
    	tmp_rv = *(int*)rv;
    
    	return (tmp_lv - tmp_rv);
    }
    
    static void
    debug_func(void*src, int n, int h)
    {
    	int i;
    
    	debug("%d-sort:
    ----
    ", h);
    	for (i = 0; i < n; ++i) {
    		debug("%d ", *((int*)src + i));
    	}
    	debug("
    ----
    ");
    }
    
    int
    main(int argc, char* argv[])
    {
    	int i;
    	int cnt;
    	const int int_items[] = { 503, 87, 512, 61, 908, 170, 897, 275, 
    		                      653, 426, 154, 509, 612, 677, 765, 703
    	                         };
    	int ret;
    	struct s_clist hd;
    	struct s_nodes nodes;
    	struct s_node *node;
    	struct s_clist *cur;
    
    	debug("[Testing list insertion sort].. 
    ");
    
    
    	ret = init_list(&hd, 1000, &nodes);
    	if (!ret) goto END;
    
    	cnt = sizeof(int_items)/sizeof(int_items[0]);
    
    	debug("src database:
    ----
    ");
    	for (i = 0; i < cnt; ++i) {
    		debug("%d ", int_items[i]);
    	}
    	debug("
    ----
    ");
    
    	for (i = 0; i < cnt; ++i) {
    		node = (struct s_node*)malloc(sizeof(struct s_node));
    		if (node == NULL) goto END;
    
    		node->key = (void*)(&int_items[i]);
    		ret = insert_list_sort(node, &nodes, int_increasing_cmp);
    		if (!ret) {
    			debug("failed. 
    ");
    			goto END;
    		}
    	}
    
    	debug("dst database:
    ----
    ");
    	cur = nodes.hd->next;
    	while(cur->node != NULL) {
    		debug("%d ", *(int*)cur->node->key);
    		cur = cur->next;
    	}
    
    	debug("
    ----
    ");
    
    	debug("
    ");
    
    	debug("[Testing list insertion sort].. done. 
    ");
    
    END:
    	while(1);
    	return 0;
    }
    
    #endif /* LIST_INSERTION_DEBUG */
    
    
    #ifndef __LIST_INSERTION_H__
    #define __LIST_INSERTION_H__
    
    #define LIST_INSERTION_DEBUG
    
    typedef int(*cmp_func)(void*, void*);
    typedef void (*dbg_func)(void*, int, int);
    
    struct s_node{
    	void* key;
    
    	void *data;
    };
    
    struct s_clist{
    	struct s_clist *pre;
    	struct s_clist *next;
    	struct s_node *node;	
    };
    
    struct s_nodes
    {
    	struct s_clist *hd;
    	int nodes_cnt;
        int max_nodes_cnt;
    	
    	struct s_clist *cur;
    };
    
    int init_list(struct s_clist *hd, int max_cnt, struct s_nodes *nodes);
    
    int insert_list_sort(struct s_node *node, struct s_nodes *nodes);
    
    int is_list_full(struct s_nodes *nodes);
    
    int get_list_cnt(struct s_nodes *nodes);
    
    int delete_item_from_list(struct s_node *node, struct s_nodes *nodes);
    
    #endif /* __LIST_INSERTION_H__ */
    #pragma once
    
    #include <windows.h>
    #ifdef _WIN32
    #define msleep(x)  Sleep(x)
    #endif
    
    #include <stdio.h>
    #include <tchar.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>
    #include <math.h>
    
    #define MY_DEBUG
    #ifdef MY_DEBUG
    #define debug printf
    #else
    #define debug(x,argc, __VA_ARGS__)	;
    #endif /* MY_DEBUG */
    
    #define F_S() debug("[%s]..
    ", __FUNCTION__)
    #define F_E() debug("[%s]..done. 
    ", __FUNCTION__)
    
    


    Enjoy :)

    Mars

    Sep 15th, 2013

  • 相关阅读:
    ASP.NET中备份恢复数据库
    SQL Server连接失败错误小结
    GSL科学计算库的使用
    [转]VC编程中经常能遇到LNK2005错误
    主函数main中变量(int argc,char *argv[])的含义
    毕业了,工作了
    何为COM组件技术
    一个老外总结的WP开发资源
    跟我一起写Makefile
    qsort() 之 __cdecl
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3325108.html
Copyright © 2020-2023  润新知