(1)
#include "stdio.h"
typedef int Elem;
//int (* compare)(Elem , Elem);
int ascending(Elem a, Elem b);
int descending(Elem a, Elem b);
void selectionsort(Elem *, Elem,int (*compare)());
void warp(Elem *a, Elem *b);
void selectionsort( Elem *work, Elem size, int (* compare) ())
{
Elem i,tmp,index;
for ( i = 0 ; i < size -1; i++)
{
tmp = i;
for ( index = i+ 1; index < size; index++)
{
if ( !(*compare)(*(work+i), *(work + index)))
{
tmp = index;
}
}
warp(work+ tmp, work + i);
}
}
void warp(Elem *a, Elem *b)
{
Elem c;
c = *a;
*a = *b;
*b = c;
}
int ascending(Elem a, Elem b)
{
return a < b;
}
int descending(Elem a, Elem b)
{
return a > b;
}
void main(void)
{
Elem b;
Elem arraysize = 10;
Elem order = 1; // 1 ascending, 2 descending
Elem a[10] = { 2, 6, 4 ,8,10, 12, 89,68,45, 37};
selectionsort(a,arraysize, ascending);
for ( b = 0; b < arraysize; b++)
{
printf("%d,", a[b]);
}
printf("/n");
selectionsort(a,arraysize, descending);
for ( b = 0; b < arraysize; b++)
{
printf("%d,", a[b]);
}
printf("/n");
}
(2)
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <conio.h>
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OK 1
#define EQUAL 1
#define OVERFLOW -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status ;
struct STU{
char name[20];
char stuno[10];
int age;
int score;
};
typedef struct STU SElemType;
struct STACK
{
SElemType *base;
SElemType *top;
int stacksize;
};
typedef struct STACK SqStack;
typedef struct STACK *pSqstack;
Status InitStack(SqStack **S);
Status DestroyStack(SqStack *S);
Status ClearStack(SqStack *S);
Status StackEmpty(SqStack S);
Status StackLength(SqStack S);
Status GetTop(SqStack S,SElemType *e);
Status Push(SqStack *S,SElemType e);
Status Pop(SqStack *S,SElemType *e);
Status StackTraverse(SqStack S,Status (*visit)());
Status InitStack(SqStack **S)
{
(*S)=(SqStack *) malloc(sizeof(SqStack));
(*S)->base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType));
if(!(*S)->base)exit(OVERFLOW);
(*S)-> top=(*S)->base;
(*S)-> stacksize=STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack *S)
{
free(S-> base);
free(S);
return 1;
}
Status ClearStack(SqStack *S)
{
S->top = S->base;
return TRUE;
}
Status StackEmpty(SqStack S)
{
if(S.top==S.base) return TRUE;
else
return FALSE;
}
int StackLength(SqStack S)
{
int i;
SElemType *p;
i=0;
p=S.top;
while(p!=S.base)
{
p++;
i++;
}
return TRUE;
}
Status GetTop(SqStack S,SElemType *e)
{
if(S.top==S.base) return ERROR;
*e=*(S.top-1);
return OK;
}
Status Push(SqStack *S,SElemType e)
{
*(S-> top++)=e;
return OK;
}
Status Pop(SqStack *S,SElemType *e)
{
if(S-> top==S-> base) return ERROR;
*e=*--S-> top;
return OK;
}
Status StackPrintElem(SElemType * e)
{
printf( "%s %s %d %d/n ",e-> name,e-> stuno,e-> age,e-> score);
return 1;
}
Status StackTraverse(SqStack S,Status (*visit)())
{
while(S.top!=S.base)
visit(--S.top);
return 1;
}
void main()
{
SElemType e;
SqStack *Sa;
printf( "/n/n-------------------SqStack Demo is running...----------------/n/n ");
printf( "First is Push function./n ");
InitStack(&Sa);
strcpy(e.name, "stu1 ");
strcpy(e.stuno, "100001 ");
e.age=80;
e.score=1000;
printf( " Now Stack is Empty./n ");
StackTraverse(*Sa,StackPrintElem);
Push(Sa,e);
printf( " Now Stack has one element./n ");
StackTraverse(*Sa,StackPrintElem);
strcpy(e.name, "stu3 ");
strcpy(e.stuno, "100002 ");
e.age=80;
e.score=1000;
Push(Sa,e);
printf( " Now Stack has another element./n ");
StackTraverse(*Sa,StackPrintElem);
printf( " Now Pop Stack,the top elem put into variable e./n ");
Pop(Sa,&e);
printf( "%s/n%s/n%d/n%d/n ",e.name,e.stuno,e.age,e.score);
printf( " Let 's see the left of Stack 's elem:/n ");
StackTraverse(*Sa,StackPrintElem);
getch();
printf( "/n/n/nWelcom to visit my place!/n/n ");
}