文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>数据结构笔记2

数据结构笔记2

时间:2010-04-10  来源:hekun123456

今天主要将Triplet(三元组)定义的操作用C语言做了实现。同时用到了自定义的一些库函数。

现在一并列出。

./include/Db.h

#ifndef DB_H
#define DB_H

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

#include <stdio.h>
#include "../libs/include/Libs.h"
typedef int ElemType;
typedef int Status;
typedef ElemType * Triplet;


/* 三元组(Triplet)操作函数*/
Status InitTriplet(Triplet *T, ElemType v1, ElemType v2, ElemType v3);
Status DestroyTriplet(Triplet *T);
Status Get(Triplet T, int i, ElemType *e);
Status Put(Triplet *T, int i, ElemType e);
Status IsAscending(Triplet T);
Status IsDescending(Triplet T);
Status Max(Triplet T, ElemType *e);
Status Min(Triplet T, ElemType *e);
Status TripletTest(void);
#endif


./src/Triplet.c

#include "../include/Db.h"

/****************************************
* 函数名称:
Status InitTriplet(Triplet *T, ElemType v1, ElemType v2, ElemType v3)

* 功能描述:
创建堆空间,并为各元素赋值

* 输入参数:
T--存储堆空间的首地址
v1,v2,v3--将三元组中的各个元素分别赋值v1,v2,v3

* 输出参数:无
* 返回值:
OK

* 算法说明:无

****************************************/
Status InitTriplet(Triplet *T, ElemType v1, ElemType v2, ElemType v3)
{
    *T= (ElemType *)Malloc(3, sizeof(ElemType));
    *(*T) = v1;
    *(*T+1) = v2;
    *(*T+2) = v3;
    return OK;
}

/****************************************
* 函数名称:
Status DestroyTriplet(Triplet *T)

* 功能描述:
销毁申请的堆空间。

* 输入参数:
T--存储堆空间的首地址

* 输出参数:无
* 返回值:
OK

* 算法说明:无

****************************************/
Status DestroyTriplet(Triplet *T)
{
    assert(T != NULL);
    Free((void **)T);
    return OK;
}

/****************************************
* 函数名称:
Status Get(Triplet T, int i, ElemType *e)

* 功能描述:
获取三元组中指定元素的值

* 输入参数:
T--存储堆空间的首地址
i--元素序号

* 输出参数:
e- 存储获取的数值

* 返回值:
OK

* 算法说明:无

****************************************/
Status Get(Triplet T, int i, ElemType *e)
{
    assert(T!=NULL);
    assert( (i>=0) && (i<=2) );
    *e = T[i];
    return OK;
}

/****************************************
* 函数名称:
Status Put(Triplet *T, int i, ElemType e)

* 功能描述:
设置三元组中指定元素的值

* 输入参数:
T--存储堆空间的首地址
i--元素序号
e-存储需要设置的元素的数值

* 输出参数:无

* 返回值:
OK

* 算法说明:无

****************************************/
Status Put(Triplet *T, int i, ElemType e)
{
    assert(*T != NULL);
    assert((i>=0) && (i<=2));
    *(*T+i) = e;
    return OK;
}

/****************************************
* 函数名称:
Status IsAscending(Triplet T)

* 功能描述:
判断三元组元素是否为递增序列

* 输入参数:
T--存储堆空间的首地址

* 输出参数:无

* 返回值:
TRUE
FALSE

* 算法说明:无

****************************************/
Status IsAscending(Triplet T)
{
    assert(T!=NULL);
   
    if((T[0]<=T[1]) && (T[1]<=T[2]))
    {
        return TRUE;
    }
    return FALSE;
}

/****************************************
* 函数名称:
Status IsDescending(Triplet T)

* 功能描述:
判断三元组元素是否为递减序列

* 输入参数:
T--存储堆空间的首地址

* 输出参数:无

* 返回值:
TRUE
FALSE

* 算法说明:无

****************************************/
Status IsDescending(Triplet T)
{
    assert(T!=NULL);
   
    if((T[0]>=T[1]) && (T[1]>=T[2]))
    {
        return TRUE;
    }
    return FALSE;
}

/****************************************
* 函数名称:
Status Max(Triplet T, ElemType *e)

* 功能描述:
获取三元组中的最大值

* 输入参数:
T--存储堆空间的首地址

* 输出参数:
e--存储最大值

* 返回值:
OK

* 算法说明:
先选择两个元素比较,将较大者与第三个元素比较,选出较大者

****************************************/
Status Max(Triplet T, ElemType *e)
{
    assert(T != NULL);
    *e = (T[0]>=T[1])
        ?(T[0]>=T[2]?T[0]:T[2])
        :(T[1]>=T[2]?T[1]:T[2]);
    return OK;
}

/****************************************
* 函数名称:
Status Min(Triplet T, ElemType *e)

* 功能描述:
获取三元组中的最小值

* 输入参数:
T--存储堆空间的首地址

* 输出参数:
e--存储最大值

* 返回值:
OK

* 算法说明:
先选择两个元素比较,将较小者与第三个元素比较,选出较小者

****************************************/
Status Min(Triplet T, ElemType *e)
{
    assert(T != NULL);
    *e = (T[0]<=T[1])
        ?(T[0]<=T[2]?T[0]:T[2])
        :(T[1]<=T[2]?T[1]:T[2]);
    return OK;
}

Status TripletTest(void)
{
    Triplet localTriplet = NULL;
    ElemType val = 0;
    InitTriplet(&localTriplet, 4, 5, 6);

    int i = 0;
    printf("The Triplet is:");
    for(i=0; i<3; i++)
    {
        Get(localTriplet, i, &val);
        printf(" %d",val);
    }
    printf(".\n");
    if(IsAscending(localTriplet) == TRUE)
    {
        LogMsg("The Triplet is ascending.");
    }
    Max(localTriplet, &val);
    LogMsg("The MAX val is %d.",val);
    Min(localTriplet, &val);
    LogMsg("The MIN val is %d.",val);
   
    printf("The Triplet is:");
    for(i=0; i<3; i++)
    {
        Put(&localTriplet, i, 5-i);
        printf(" %d",4-i);
    }
    printf(".\n");
   
    if(IsDescending(localTriplet) == TRUE)
    {
        LogMsg("The Triplet is descending.");
    }
   
    DestroyTriplet(&localTriplet);
    return OK;
}


./src/main.c

#include "../include/Db.h"

int main(void)
{
    if(TripletTest() != OK)
    {
        ErrQuit("TripletTest error.");
    }
    printf("==========================\n");
    return OK;
}


./libs/src/Error.c

#define LOGLINE 1023


#include "../include/Libs.h"


/****************************************
* 函数名称:
static void err_doit(int errnoflag, const char *fmt, va_list ap)

* 功能描述:
根据级别显示函数调用时出现的错误信息

* 输入参数:
errnoflag=是否显示系统定义的程序出错信息
fmt=错误日志格式
ap=参数列表

* 输出参数:无
* 返回值 :无

* 算法说明:
将参数存储的错误记录(由程序设计人员定义)写到缓冲区中。
如果需要系统的错误信息,追加到最后。
将缓冲区中的数据写到标准错误输出中。

****************************************/
static void ErrDoIt(int errnoflag, const char *fmt, va_list ap)
{
    assert(fmt != NULL);
    assert(errnoflag == 0 || errnoflag == 1);
   
    int errno_save;
    int n;
    char buf[LOGLINE + 1];
   
    vsnprintf(buf, LOGLINE, fmt, ap);
    n = strlen(buf);
    if (errnoflag == 1)
    {
        /* 如果需要记录出错信息,设置errnoflag等于1*/
        errno_save = errno;
        snprintf(buf+n, LOGLINE-n, ": %s", strerror(errno_save));
    }
    strcat(buf, "\n");

    fflush(stdout);
    fputs(buf,stderr);
    fflush(stderr);
}


/****************************************
* 函数名称:
void ErrQuit( const char *text,...)

* 功能描述:
程序因出错而终止,且不显示系统错误信息

* 输入参数:
text--程序设计人员自定义报错信息
...--text中需要替换的变量

* 输出参数:无
* 返回值:无
* 算法说明:无

****************************************/

void ErrQuit( const char *text,...)
{
    assert(text != NULL);
    va_list arg;

    va_start(arg, text);
    ErrDoIt(0, text, arg);
    va_end(arg);
    exit(1);
}

/****************************************
* 函数名称:
void ErrSys( const char *text,...)

* 功能描述:
程序因出错而终止,并输出系统错误信息

* 输入参数:
text--程序设计人员自定义报错信息
...--text中需要替换的变量

* 输出参数:无
* 返回值:无
* 算法说明:无

****************************************/
void ErrSys( const char *text,...)
{
    assert(text != NULL);
    va_list arg;

    va_start(arg, text);
    ErrDoIt(1, text, arg);
    va_end(arg);
    exit(1);
}

/****************************************
* 函数名称:
void ErrMsg(const char *text,...)

* 功能描述:
程序出错,输出错误信息,但程序不退出

* 输入参数:
text--程序设计人员自定义报错信息
...--text中需要替换的变量

* 输出参数:无
* 返回值:无
* 算法说明:无

****************************************/

void ErrMsg(const char *text,...)
{
    assert(text != NULL);
    va_list arg;
    va_start(arg,text);
    ErrDoIt(1, text, arg);
    va_end(arg);
}

/****************************************
* 函数名称:
void ErrMsg(const char *text,...)

* 功能描述:
只用于显示显示自定义信息

* 输入参数:
text--程序设计人员自定义报错信息
...--text中需要替换的变量

* 输出参数:无
* 返回值:无
* 算法说明:无

****************************************/
void LogMsg(const char * text,...)
{
    assert(text != NULL);
    va_list arg;
    va_start(arg,text);
    ErrDoIt(0, text, arg);
    va_end(arg);
}


./libs/include/Libs.h

#ifndef LIBS_H
#define LIBS_H


#include <stdio.h>
#include <assert.h>
#include <strings.h>
#include <errno.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>



/*内存操作函数*/
void *Malloc(int len, int typeSize);
void Free(void **memPtr);


/* 输出日志函数*/
void ErrQuit( const char *text,...);
void ErrSys( const char *text,...);
void ErrMsg(const char *text,...);
void LogMsg(const char * text,...);

#endif


./libs/src/Mem.c

#include "../include/Libs.h"

/****************************************
* 函数名称:
void *Malloc(int len, int typeSize)

* 功能描述:
申请堆空间

* 输入参数:
len--元素个数
typeSize--一个元素的占的字节数

* 输出参数:无
* 返回值 :无

* 算法说明:
申请对空间长度为len*typeSize.
如果出现错误,程序退出.
如果成功,将堆空间初始化.

****************************************/
void *Malloc(int len, int typeSize)
{
    assert(len>0);
    assert(typeSize>0);
    void *ptr = NULL;
    ptr = malloc(len*typeSize);
    if(ptr == NULL)
    {
        ErrSys("malloc error.");
    }
    bzero(ptr,len*typeSize);
    return ptr;
}

/****************************************
* 函数名称:
void Free(void *memPtr)

* 功能描述:
销毁申请的堆空间

* 输入参数:
memPtr--由Malloc/malloc申请的堆空间指针.

* 输出参数:无
* 返回值 :无
* 算法说明:无
****************************************/
void Free(void **memPtr)
{
    free(*memPtr);
    *memPtr = NULL;
}


./libs/src/Makefile

CC=gcc
CFLAGS=-g -c -Wall
BFLAGS=-g -Wall -o
AR=ar
RANLIB=ranlib
staticlib = ../../src/stdlib.a
target_objects=Mem.o Error.o
$(staticlib): $(target_objects)
    $(AR) -rv $(staticlib) $^
    $(RANLIB) $(staticlib)
    @echo $(staticlib) Build OK.
.c.o:
    $(CC) $(CFLAGS) -o $@ $<
clean:
    @rm -rf $(target_objects) $(staticlib)


./src/Makefile

CC=gcc
CFLAGS=-g -c -Wall
BFLAGS=-g -Wall -o
AR=ar
RANLIB=ranlib
target = ./test
staticlib = ./stdlib.a
all: $(target)
target_objects=Triplet.o
$(target): $(target_objects)

     $(AR) -rv $(staticlib) $^
     $(RANLIB) $(staticlib)
     @echo $(staticlib) Build OK.
     $(CC) $(BFLAGS) $@ main.c $(staticlib)
.c.o:
     $(CC) $(CFLAGS) -o $@ $<
clean:
     @rm -rf $(target) $(target_objects) $(staticlib)


./src/build.sh

#! /bin/bash
make clean
cd ../libs/src/
make clean && make
cd -
make


chmod 755 ./src/build.sh
cd ./src
./build.sh
执行程序
./test
相关阅读 更多 +
排行榜 更多 +
点赞小姐姐

点赞小姐姐

休闲益智 下载
火车向前冲

火车向前冲

休闲益智 下载
人狠话不多

人狠话不多

休闲益智 下载