Foundation: Single List Insertion Sort
来源:互联网 发布:开淘宝店难吗 编辑:程序博客网 时间:2024/06/05 13:33
/* 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 \r\n", 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 \r\n");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;}intis_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_DEBUGstatic 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 voiddebug_func(void*src, int n, int h){int i;debug("%d-sort:\r\n----\r\n", h);for (i = 0; i < n; ++i) {debug("%d ", *((int*)src + i));}debug("\r\n----\r\n");}intmain(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].. \r\n");ret = init_list(&hd, 1000, &nodes);if (!ret) goto END;cnt = sizeof(int_items)/sizeof(int_items[0]);debug("src database:\r\n----\r\n");for (i = 0; i < cnt; ++i) {debug("%d ", int_items[i]);}debug("\r\n----\r\n");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. \r\n");goto END;}}debug("dst database:\r\n----\r\n");cur = nodes.hd->next;while(cur->node != NULL) {debug("%d ", *(int*)cur->node->key);cur = cur->next;}debug("\r\n----\r\n");debug("\r\n");debug("[Testing list insertion sort].. done. \r\n");END:while(1);return 0;}#endif /* LIST_INSERTION_DEBUG */
#ifndef __LIST_INSERTION_H__#define __LIST_INSERTION_H__#define LIST_INSERTION_DEBUGtypedef 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]..\r\n", __FUNCTION__)#define F_E() debug("[%s]..done. \r\n", __FUNCTION__)
Enjoy :)
Mars
Sep 15th, 2013
- Foundation: Single List Insertion Sort
- Insertion Sort List | leetcode
- Leetcode: Insertion Sort List
- [LeetCode] Insertion Sort List
- Insertion Sort List
- Leetcode: Insertion Sort List
- [LeeCode] Insertion Sort List
- leetcode-Insertion Sort List
- [LeetCode]Insertion Sort List
- Insertion Sort List
- 【LeetCode】Insertion Sort List
- LeetCode | Insertion Sort List
- LeetCode - Insertion Sort List
- Insertion Sort List
- Insertion Sort List
- Insertion Sort List
- Insertion Sort List
- [LeetCode] Insertion Sort List
- c# 操作FTP文件类
- 跨平台 GUI 框架 wxWidgets和UI开发工具 wxFormBuilder
- java动态代理
- python 中strip和split函数,readline,readlines,read的区别
- Linux中通过locale来设置字符集
- Foundation: Single List Insertion Sort
- 巧排数字,将1,2,...,19,20这20个数字排成一排,使得相邻的两个数字之和为一个素数
- 圆圈报数最后剩下的数 约瑟夫环问题 Joseph
- 索引图像
- 标题:我的中医自学历程(2013.8.26 更新网盘,欢迎下载和传播)
- LeetCode:Partition List
- oracle学习笔记(二)
- 【How Tomcat Works】深入剖析Tomcat——引言
- OpenCV库文件模块