Fork me on GitHub

基本数据结构(C)

栈:

#include "stdio.h"
#include "stdlib.h"
#define MAX_SIZE 100
typedef struct stack
{
    int *base;
    int top;
}Stack;
int InitStack(Stack *stack)
{
    stack->base=(int *)malloc(MAX_SIZE*sizeof(int));
    if(!stack->base) return -1;
    stack->top=0;
    return 1;
}
int IsEmpty(Stack *stack)
{
    if(0==stack->top) return 1;
    return 0;
}
int IsFull(Stack *stack)
{
    if(MAX_SIZE-1==stack->top) return 1;
    return 0;
}
int Push(Stack *stack,int e)
{
    if(!IsFull(stack))
    {
        stack->base[stack->top]=e;stack->top+=1;
        return 1;
    }
    return -1;
}
int Pop(Stack *stack)
{
    if(!IsEmpty(stack))
    {
        stack->top-=1;
        return stack->base[stack->top];
    }
    return -1;
}
void main()
{
    int i=1;
    Stack *stack=(Stack *)malloc(sizeof(Stack));
    if(InitStack(stack))
    {
        while(i<=10)
        {
            Push(stack,i);
            i++;
        }
    }
    printf("栈中元素出栈(先进后出):\n");
    while(!IsEmpty(stack))
    printf("%d\t",Pop(stack));
}

队列:

#include "stdio.h"
#include "stdlib.h"
#define MAX_SIZE 10//虽然容量是10,但注意该循环队列只能保存9个整数
typedef struct queue
{
    int *base;
    int rear;
    int front;
}SqQueue;
//初始化循环队列
int InitQueue(SqQueue *sqqueue)
{
   sqqueue->base=(int *)malloc(MAX_SIZE*sizeof(int));
   if(!sqqueue->base)return -1;
   sqqueue->rear=0;
   sqqueue->front=0;
   return 1;
}
//入队
int EnQueue(SqQueue *sqqueue,int e)
{
    if((sqqueue->rear+1)%MAX_SIZE==sqqueue->front)return -1;
    sqqueue->base[sqqueue->rear]=e;
    sqqueue->rear=(sqqueue->rear+1)%MAX_SIZE;
    return 1;
}
//获取对头元素
int FrontQueue(SqQueue *sqqueue)
{
    if(Empty(sqqueue))return -1;
    return sqqueue->base[sqqueue->front];
}
//出队
int DeQueue(SqQueue *sqqueue)
{
    int i=0;
    if(sqqueue->rear==sqqueue->front)return -1;
    i=FrontQueue(sqqueue);
    sqqueue->front=(sqqueue->front+1)%MAX_SIZE;
    return i;
}
//判断队列是否为空。注意空和满的条件
int Empty(SqQueue *sqqueue)
{
     if(sqqueue->rear==sqqueue->front)
        return 1;
     else
        return 0;
}
void main()
{
    int i=1;
    SqQueue *sqqueue=(SqQueue *)malloc(sizeof(SqQueue));
    if(InitQueue(sqqueue))
    {
        while(i<=10)//最后一次入队失败。因为要损失一个空间存放尾指针
        {
             EnQueue(sqqueue,i);
             i++;
        }


    }
    printf("打印队列元素\n");
    while(!Empty(sqqueue))
        printf("%d\n",DeQueue(sqqueue));


}

败者树:

#include "stdio.h"
#define K 8
#define MINKEY -1//比所有关键字都小的一个值
#define MAXKEY 1000//比所有关键字都大的一个值
int b[K];
void Adjust(int ls[K],int s)//败者树存储在ls[1]~ls[K-1]中,s为记录所在的归并段号
{
    int t,temp;
    t=(s+K)/2;//t为b[s]的父节点所在败者树中的下标,K是归并段数
    while(t>0)//没有到达树根则继续
    {
        if(b[s]>b[ls[t]]){//与父节点指示的数据进行比较
            temp=s;s=ls[t];//指示胜者,胜者将去参加更上一层比较
            ls[t]=temp;//ls[t]记录败者所在的段号
        }
        t=t/2;//向树根回退一层
    }
    ls[0]=s;//ls[0]记录本趟最小关键字所在的短号
}
int Get_next(int i)
{


}
void K_merger(int ls[K])
/*ls[0]~ls[K-1]是败者树的内部节点。b[0]~b[K-1]分别存储K个初始归并段的当前记录*/
/*函数Get_next(i)从第i个归并段读取并返回当前记录,若归并段为空,则返回MAXKEY*/
{
    int b[K+1],i,q;
    for(i=0;i<K;i++)
        b[i]=Get_next(i);//分别读取K个归并段的第一个关键字
    b[K]=MINKEY;
    for(i=0;i<K;++i)ls[i]=K;//创建败者树,设置ls中败者的初值。
    for(i=K-1;i>=0;--i)//依次从b[K-1],b[K-1]..b[0]出发调整败者树。
        Adjust(ls,i);
    while(b[ls[0]]!=MAXKEY)//ls[0]记录本趟最小关键字所在的段号
    {
        q=ls[0];//q是当前最小关键字的所在的归并段。
        printf("%d",b[q]);
        b[q]=Get_next(q);
        Adjust(ls,q);
    }
}

 

posted @ 2012-07-27 21:29  zhanjindong  阅读(395)  评论(0编辑  收藏  举报
TOP