c写的插入排序

本来再想,写这样的初级代码发还是不发,后来还是帖了出来。
 

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

static void genIntArray(int *arr, int nlen)
{
    srand((unsigned)time(NULL));
    while(nlen--) *arr++ = rand() % 300 + 5;
}

static void insertion_sort(int *arr, int nlen, int (*sort_func)(int, int))
{
    int i, j, tmp;
    for( i = 1; i < nlen; i++) {
        j = i;
        while( j > 0  && sort_func(arr[j], arr[j - 1])) {
            tmp = arr[j];
            arr[j] = arr[j - 1];
            arr[j - 1] = tmp;
            --j;
        }
    }
}

static int lower_sort(int num1, int num2)
{
    return num1 > num2;
}

static int upper_sort(int num1, int num2)
{
    return num1 < num2;
}

static void printArray(int *arr, int nlen)
{
    printf("[");
    while(--nlen) printf("%d, ", *arr++);
    printf("%d]\n", *arr);
}

int main(void)
{
    int len = 10; 
    int arr[len];
    genIntArray(arr, len);

    printf("before sort:");
    printArray(arr, len);

    insertion_sort(arr, len, lower_sort);
    printf("after lower sort:");
    printArray(arr, len);

    insertion_sort(arr, len, upper_sort);
    printf("after upper sort:");
    printArray(arr, len);
    return 0;
}

后记:在编程中,时常把一个函数当做参数传来传去,这也是编程里面比较有意思的事情。

单向链表反转

#include <stdlib.h>

struct List {
    int index;
    struct List *next;
};

void create_list(struct List **list, int len)
{
    *list = (struct List *) malloc(sizeof(struct List));
    (*list)->next = NULL;
    struct List* p;

    while(len)
    {
        p = (struct List*) malloc(sizeof(struct List));
        p->index = len--;
        p->next = (*list)->next;
        (*list)->next = p;
    }
}

void reverse_list(struct List **list)
{
    struct List *next, *prev, *node; 
    prev = NULL;

    node = *list;
    while(node) {
        next = node->next;
        if(next == NULL) *list = node;
        node->next = prev;
        prev = node;
        node = next;
    }
}

void destory_list(struct List *list)
{
    if(list->next) destory_list(list->next);

    free(list);
    list->index = 0;
    list->next = NULL;
}

int main(void)
{
    struct List *data;
    create_list(&data, 20);
    reverse_list(&data);

    destory_list(data);

    return 0;
}

 

东抄抄, 西抄抄, 写了个大概, 玩着玩着都会感觉混淆了.

union的妙用

先前看了SDL的SDL_Event, 不大明白其中的用法,后来翻了翻书中关于union的用法,再则看到了云风的这篇文章C 语言中统一的函数指针, 就写了一个不成文的例子, 把union作为函数的参数传递, 可以将两个毫不相干的不同类型的结构数据粘合在一起, 的确很有意思.


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

typedef enum bool {false, true} bool;

typedef struct Number {
    unsigned char type;
    unsigned int num;
    bool sign;
} Number;

typedef struct OP {
    unsigned char type;
    char ch;
} OP;

typedef union Button {
    unsigned char type;
    Number num;
    OP op;
} Button;

void printNum(int num)
{
    printf("Print Number:%d\n", num);
}

void printOP(char op)
{
    printf("Print Op:%c\n", op);
}

void cal(Button p)
{
    switch(p.type)
    {
        case 1:
            printNum(p.num.num * ((p.num.sign) ? 1 : -1));
            break;
        case 2:
            printOP(p.op.ch);
            break;
    }
}


int main()
{
    Button p1;
    p1.num = (Number) {1, 9, false};
    cal(p1);

    p1.op = (OP) {2, '='};
    cal(p1);

    exit(0);
}

这里要注意结构体的第一个字段一定要与union的第一个字符对应起来, 至于为什么, 去翻看union用法吧...

 

utf-8字符窜对应的辅助函数

 

int
utf8_char_size(const unsigned char c)
{
    if(c < 0x80) return 1;
    if((c & 0xc0) == 0x80) return 0;

    int mask = 0x80;
    int num = 0;
    while(mask & c)
    {
        ++num;
        mask >>= 1;
    }

    return num;
}

int
utf8_len(const char *utf8)
{
    const unsigned char *input = (const unsigned char *)utf8;
    int count = 0;
    while(*input) {
        while((*input & 0xc0) == 0x80)
            ++input;
        count++;
        input++;
    };

    return count;
}

int
utf8_char_at(const char *utf8, int index)
{
    const unsigned char *input = (const unsigned char *)utf8;
    int count = 0;
    while(*input) {
        if(count == index) return input - (const unsigned char *)utf8;

        input += utf8_char_size(*input);
        count++;
    };

    return -1;
}
 

 

 

int utf8_char_size(const unsigned char c)  //取得utf-8字符的长度.

例子: char *str="中文";utf8_char_size(*str)=3;utf8_char_size(*++str)=0

int utf8_len(const char *utf8)  //取得字符窜的长度,类似wcslen(wchar_t)

例子:  utf8_len("hello你好,world") = 17

int utf8_char_at(const char *utf8, int index) // 取得utf-8字符窜真实地址偏移值

例子:utf8_char_at("hello你好,world", 7) = 11

C替换函数

先前在百度空间里帖了一个函数,很乱也蛮烂的

 

http://hi.baidu.com/pallove/blog/item/ea3c0b469c4bf0076a63e53e.html

早上使用strstr函数再写了一个,一下感觉清爽多了。

 

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

char* replace(const char *src, const char *from, const char *to, char *dest)
{
    int idx = 0;
    char *find;
    while(1) {
        if(find = strstr(src, from)) {
            idx = find - src;
            strncat(dest, src, idx);
            strncat(dest, to, strlen(to));
            src += idx + strlen(from);
        }
        else {
            strncat(dest, src, strlen(src));
            break;
        }
    }

    return dest;
}

int main()
{
    char *dest = malloc(1024);
    strcpy(dest, "result:");
    printf("%s\n", replace("hello, abcabctestasdlfklasdjabc ldsafabc", "abc", "123", dest));

    exit(0);
}

 

指向整形数组的指针

指向整形数组的指针

阅读全文