demo/old/sqlist.c

172 lines
3.0 KiB
C

#include <stdio.h>
#define MAXSIZE 30
struct _st_list {
int sqlist[MAXSIZE];
int size;
};
struct _st_list a = {{0, }, 0};
static inline int *_get_head(struct _st_list *p)
{
return p->sqlist;
}
static inline int *_get_tail(struct _st_list *p)
{
return p->sqlist + p->size;
}
void show(struct _st_list *p)
{
int *ptr = _get_head(p);
int *end = _get_tail(p);
printf("%d:\n", p->size);
for (; ptr < end; ptr++) {
printf("%d ", *ptr);
}
printf("\n");
}
void insert(struct _st_list *p, int i, int x)
{
if (p->size == MAXSIZE) return;
if (i < 0) return;
if (i > p->size) return;
int *ptr = _get_tail(p);
int *end = _get_head(p) + i;
for (; ptr > end; ptr--) {
*ptr = *(ptr - 1);
}
*ptr = x;
p->size += 1;
}
int delete(struct _st_list *p, int i)
{
if (p->size == 0) return 0;
if (i < 0) return 0;
if (i >= p->size) return 0;
int *ptr = _get_head(p) + i;
int *end = _get_tail(p);
int del = *ptr;
for (; ptr < end; ptr++) {
*ptr = *(ptr + 1);
}
p->size -= 1;
return del;
}
static int _more_than(int a, int b) { return a > b; }
static int _less_than(int a, int b) { return a < b; }
static int _trace_pick(struct _st_list *p, int (*match)(int, int))
{
if (!p->size) return 0;
int *ptr = _get_head(p);
int *end = _get_tail(p);
int fetch = *ptr++;
for (; ptr < end; ptr++) {
if (match(*ptr, fetch)) fetch = *ptr;
}
return fetch;
}
int min(struct _st_list *p)
{
return _trace_pick(p, _less_than);
}
int max(struct _st_list *p)
{
return _trace_pick(p, _more_than);
}
static int *_iter_bisearch(int *s, int *e, int x)
{
if (e - s < 2) {
if (x > *s) return e;
else return s;
}
int *m = s + (e - s) / 2;
if (x > *m) return _iter_bisearch(m, e, x);
else return _iter_bisearch(s, m, x);
}
static int _bisearch(struct _st_list *p, int x)
{
int *ptr = _get_head(p);
int *end = _get_tail(p);
return _iter_bisearch(ptr, end, x) - _get_head(p);
}
void biinsert(struct _st_list *p, int x)
{
insert(p, _bisearch(p, x), x);
}
static void _iter_sort(int *s, int *e)
{
if (e <= s) return;
int v = *s;
int *p = s;
int *q = e;
for (;;) {
while ((p < q) && (*q >= v)) q -= 1;
*p++ = *q;
if (p >= q) {
p = q;
break;
}
while ((p < q) && (*p <= v)) p += 1;
*q-- = *p;
if (p >= q) break;
}
*p = v;
_iter_sort(s, p - 1);
_iter_sort(p + 1, e);
}
void sort(struct _st_list *p)
{
if (p->size < 2) return;
_iter_sort(_get_head(p), _get_tail(p) - 1);
}
int main()
{
printf("========= start ==========\n");
insert(&a, 0, 7);
insert(&a, 0, 6);
insert(&a, 0, 3);
insert(&a, 0, 9);
insert(&a, 0, 1);
insert(&a, 0, 4);
insert(&a, 0, 2);
insert(&a, 0, 8);
show(&a);
sort(&a);
show(&a);
biinsert(&a, 5);
show(&a);
printf("########## end ##########\n");
return 0;
}