⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdsl_2darray.c

📁 一个通用的C语言实现的数据结构
💻 C
字号:
/* * This file is part of the Generic Data Structures Library (GDSL). * Copyright (C) 1998-2006 Nicolas Darnis <ndarnis@free.fr>. * * The GDSL library is free software; you can redistribute it and/or  * modify it under the terms of the GNU General Public License as  * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * The GDSL library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with the GDSL library; see the file COPYING. * If not, write to the Free Software Foundation, Inc.,  * 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA. * * $RCSfile: gdsl_2darray.c,v $ * $Revision: 1.18 $ * $Date: 2006/03/04 16:32:05 $ */#include <config.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include "gdsl_2darray.h"#include "gdsl_types.h"struct gdsl_2darray{    char*             name;    ulong             rows;    ulong             cols;    gdsl_element_t**  elements;    gdsl_alloc_func_t alloc_f;    gdsl_free_func_t  free_f;};static gdsl_element_t default_alloc (void* e);static void default_free (gdsl_element_t e);/******************************************************************************//* Management functions of 2D-arrays                                          *//******************************************************************************/extern gdsl_2darray_tgdsl_2darray_alloc (const char* name, const ulong l, const ulong c,		    const gdsl_alloc_func_t alloc_f, 		    const gdsl_free_func_t free_f){    register ulong i;    gdsl_2darray_t m;    m = (gdsl_2darray_t) malloc (sizeof (struct gdsl_2darray));    if (m == NULL)	{	    return NULL;	}    m->name = NULL;    if (gdsl_2darray_set_name (m, name) == NULL)	{	    free (m);	    return NULL;	}    m->rows = l;    m->cols = c;    m->elements = (gdsl_element_t**) calloc (l, sizeof (gdsl_element_t*));    if (m->elements == NULL)	{	    free (m->name);	    free (m);	    return NULL;	}    (m->elements) [0] = (gdsl_element_t*) calloc (l * c, sizeof (gdsl_element_t));    if ((m->elements) [0] == NULL)	{	    free (m->name);	    free (m->elements);	    free (m);	    return NULL;	}    for (i = 1; i < l; i++)	{	    (m->elements)[i] = (m->elements) [i-1] + c;	}      m->alloc_f = alloc_f ? alloc_f : default_alloc;    m->free_f  = free_f  ? free_f  : default_free;    return m;}extern void gdsl_2darray_free (gdsl_2darray_t m){    register ulong i;    assert (m != NULL);    for (i = 0; i < m->rows * m->cols; i++)	{	    (m->free_f) ((m->elements) [0][i]);	}    free ((m->elements)[0]);    free (m->elements);    free (m->name);    free (m);}/******************************************************************************//* Consultation functions of 2D-arrays                                        *//******************************************************************************/extern const char*gdsl_2darray_get_name (const gdsl_2darray_t m){    assert (m != NULL);    return m->name;}extern ulonggdsl_2darray_get_rows_number (const gdsl_2darray_t a){    assert (a != NULL);    return a->rows;}extern ulonggdsl_2darray_get_columns_number (const gdsl_2darray_t a){    assert (a != NULL);    return a->cols;}extern ulonggdsl_2darray_get_size (const gdsl_2darray_t a){    assert (a != NULL);    return a->rows * a->cols;}extern gdsl_element_tgdsl_2darray_get_content (const gdsl_2darray_t a, const ulong l, const ulong c){    assert (a != NULL);    assert (l <= a->rows);    assert (c <= a->cols);    return (a->elements) [l][c];}/******************************************************************************//* Modification functions of 2D-arrays                                        *//******************************************************************************/extern gdsl_2darray_tgdsl_2darray_set_name (gdsl_2darray_t m, const char* name){    assert (m != NULL);    if (m->name != NULL)	{	    free (m->name);	    m->name = NULL;	}    if (name != NULL)	{	    m->name = (char*) malloc ((1 + strlen (name)) * sizeof (char));	    if (m->name == NULL)		{		    return NULL;		}	    strcpy (m->name, name);	}    return m;}extern gdsl_element_tgdsl_2darray_set_content (gdsl_2darray_t a, const ulong l, const ulong c, 			  void* value){    assert (a != NULL);    assert (l <= a->rows);    assert (c <= a->cols);    (a->elements) [l][c] = (a->alloc_f) (value);    return (a->elements) [l][c];}/******************************************************************************//* Input/output functions of 2D-arrays                                        *//******************************************************************************/extern voidgdsl_2darray_write (const gdsl_2darray_t a, 		    const gdsl_write_func_t write_f, FILE* file, 		    void* user_data){    ulong i;    ulong j;    gdsl_location_t pos;    assert (a != NULL);    assert (write_f != NULL);    assert (file != NULL);    /* 1. First row */    /* 1.1 First column */    pos = GDSL_LOCATION_FIRST_ROW | GDSL_LOCATION_FIRST_COL;    write_f ((a->elements) [0][0], file, pos, user_data);    /* 1.2 Other columns but last */    pos &= ~GDSL_LOCATION_FIRST_COL;    for (j = 1; j < a->cols - 1; j++)	{	    write_f ((a->elements) [0][j], file, pos, user_data);	}    /* 1.3 Last column */    pos |= GDSL_LOCATION_LAST_COL;    write_f ((a->elements) [0][j], file, pos, user_data);    pos &= ~GDSL_LOCATION_LAST_COL;    /* 2. Other rows but last */    pos &= ~GDSL_LOCATION_FIRST_ROW;    for (i = 1; i < a->rows - 1; i++)	{	    /* 2.1 First column */	    pos |= GDSL_LOCATION_FIRST_COL;	    write_f ((a->elements) [i][0], file, pos, user_data);	    /* 2.2 Other columns but last */	    pos &= ~GDSL_LOCATION_FIRST_COL; 	    for (j = 1; j < a->cols - 1; j++)		{		    write_f ((a->elements) [i][j], file, pos, user_data);		}	    /* 2.3 Last column */	    pos |= GDSL_LOCATION_LAST_COL;	    write_f ((a->elements) [i][j], file, pos, user_data);	    pos &= ~GDSL_LOCATION_LAST_COL;	}        /* 3. Last row */    /* 3.1 First column */    pos = GDSL_LOCATION_LAST_ROW | GDSL_LOCATION_FIRST_COL;    write_f ((a->elements) [i][0], file, pos, user_data);    /* 3.2 Other columns but last */    pos &= ~GDSL_LOCATION_FIRST_COL;    for (j = 1; j < a->cols - 1; j++)	{	    write_f ((a->elements) [i][j], file, pos, user_data);	}    /* 3.3 Last column */    pos |= GDSL_LOCATION_LAST_COL;    write_f ((a->elements) [i][j], file, pos, user_data);}extern voidgdsl_2darray_write_xml (const gdsl_2darray_t a, 			const gdsl_write_func_t write_f, FILE* file, 			void* user_data){    ulong i;    ulong j;    gdsl_location_t pos;    assert (a != NULL);    assert (file != NULL);    fprintf (file, "<GDSL_2DARRAY REF=\"%p\" NAME=", (void*) a);    if (a->name == NULL)	{	    fprintf (file, "\"\"");	}    else	{	    fprintf (file, "\"%s\"", a->name);	}    fprintf (file, " ROWS=\"%ld\" COLS=\"%ld\">\n", a->rows, a->cols);    /* 1. First row */    /* 1.1 First column */    pos = GDSL_LOCATION_FIRST_ROW | GDSL_LOCATION_FIRST_COL;    fprintf (file, "<GDSL_2DARRAY_ROW VALUE=\"0\">\n");    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"0\">");    if (write_f != NULL)	{	    write_f ((a->elements) [0][0], file, pos, user_data);	}    fprintf (file, "</GDSL_2DARRAY_COL>\n");    /* 1.2 Other columns but last */    pos &= ~GDSL_LOCATION_FIRST_COL;    for (j = 1; j < a->cols - 1; j++)	{	    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\">", j);	    if (write_f != NULL)		{		    write_f ((a->elements) [0][j], file, pos, user_data);		}	    fprintf (file, "</GDSL_2DARRAY_COL>\n");	}    /* 1.3 Last column */    pos |= GDSL_LOCATION_LAST_COL;    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\">", j);    if (write_f != NULL)	{	    write_f ((a->elements) [0][j], file, pos, user_data);	}    fprintf (file, "</GDSL_2DARRAY_COL>\n");    fprintf (file, "</GDSL_2DARRAY_ROW>\n");    pos &= ~GDSL_LOCATION_LAST_COL;    /* 2. Other rows but last */    pos &= ~GDSL_LOCATION_FIRST_ROW;    for (i = 1; i < a->rows - 1; i++)	{	    /* 2.1 First column */	    pos |= GDSL_LOCATION_FIRST_COL;	    fprintf (file, "<GDSL_2DARRAY_ROW VALUE=\"%ld\">\n", i);	    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"0\">");	    if (write_f != NULL)		{		    write_f ((a->elements) [i][0], file, pos, user_data);		}	    fprintf (file, "</GDSL_2DARRAY_COL>\n");	    /* 2.2 Other columns but last */	    pos &= ~GDSL_LOCATION_FIRST_COL;	    for (j = 1; j < a->cols - 1; j++)		{		    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\">", j);		    if (write_f != NULL)			{			    write_f ((a->elements) [i][j], file, pos, user_data);			}		    fprintf (file, "</GDSL_2DARRAY_COL>\n");		}	    /* 2.3 Last column */	    pos |= GDSL_LOCATION_LAST_COL;	    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\">", j);	    if (write_f != NULL)		{		    write_f ((a->elements) [i][j], file, pos, user_data);		}	    fprintf (file, "</GDSL_2DARRAY_COL>\n");	    fprintf (file, "</GDSL_2DARRAY_ROW>\n");	    pos &= ~GDSL_LOCATION_LAST_COL;	}    /* 3. Last row */    /* 3.1 First column */    pos = GDSL_LOCATION_LAST_ROW | GDSL_LOCATION_FIRST_COL;    fprintf (file, "<GDSL_2DARRAY_ROW VALUE=\"%ld\">\n", i);    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"0\">");    if (write_f != NULL)	{	    write_f ((a->elements) [i][0], file, pos, user_data);	}    fprintf (file, "</GDSL_2DARRAY_COL>\n");    /* 3.2 Other columns but last */    pos &= ~GDSL_LOCATION_FIRST_COL;    for (j = 1; j < a->cols - 1; j++)	{	    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\">", j);	    if (write_f != NULL)		{		    write_f ((a->elements) [i][j], file, pos, user_data);		}	    fprintf (file, "</GDSL_2DARRAY_COL>\n");	}    /* 3.3 Last column */    pos |= GDSL_LOCATION_LAST_COL;    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\">", j);    if (write_f != NULL)	{	    write_f ((a->elements) [i][j], file, pos, user_data);	}    fprintf (file, "</GDSL_2DARRAY_COL>\n");    fprintf (file, "</GDSL_2DARRAY_ROW>\n");    fprintf (file, "</GDSL_2DARRAY>\n");}extern voidgdsl_2darray_dump (const gdsl_2darray_t a, const gdsl_write_func_t write_f, 		   FILE* file, void* user_data){    ulong i;    ulong j;    gdsl_location_t pos;    assert (a != NULL);    assert (file != NULL);    fprintf (file, "<GDSL_2DARRAY REF=\"%p\" NAME=", (void*) a);    if (a->name == NULL)	{	    fprintf (file, "\"\"");	}    else	{	    fprintf (file, "\"%s\"", a->name);	}    fprintf (file, " ROWS=\"%ld\" COLS=\"%ld\">\n", a->rows, a->cols);    /* 1. First row */    /* 1.1 First column */    pos = GDSL_LOCATION_FIRST_ROW | GDSL_LOCATION_FIRST_COL;    fprintf (file, "<GDSL_2DARRAY_ROW VALUE=\"0\">\n");    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"0\" CONTENT=\"%p\">", (a->elements) [0][0]);    if (write_f != NULL)	{	    write_f ((a->elements) [0][0], file, pos, user_data);	}    fprintf (file, "</GDSL_2DARRAY_COL>\n");    /* 1.2 Other columns but last */    pos &= ~GDSL_LOCATION_FIRST_COL;    for (j = 1; j < a->cols - 1; j++)	{	    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\" CONTENT=\"%p\">", j, (a->elements) [0][j]);	    if (write_f != NULL)		{		    write_f ((a->elements) [0][j], file, pos, user_data);		}	    fprintf (file, "</GDSL_2DARRAY_COL>\n");	}    /* 1.3 Last column */    pos |= GDSL_LOCATION_LAST_COL;    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\" CONTENT=\"%p\">", j, (a->elements) [0][j]);    if (write_f != NULL)	{	    write_f ((a->elements) [0][j], file, pos, user_data);	}    fprintf (file, "</GDSL_2DARRAY_COL>\n");    fprintf (file, "</GDSL_2DARRAY_ROW>\n");    pos &= ~GDSL_LOCATION_LAST_COL;    /* 2. Other rows but last */    pos &= ~GDSL_LOCATION_FIRST_ROW;    for (i = 1; i < a->rows - 1; i++)	{	    /* 2.1 First column */	    pos |= GDSL_LOCATION_FIRST_COL;	    fprintf (file, "<GDSL_2DARRAY_ROW VALUE=\"%ld\">\n", i);	    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"0\" CONTENT=\"%p\">", (a->elements) [i][0]);	    if (write_f != NULL)		{		    write_f ((a->elements) [i][0], file, pos, user_data);		}	    fprintf (file, "</GDSL_2DARRAY_COL>\n");	    /* 2.2 Other columns but last */	    pos &= ~GDSL_LOCATION_FIRST_COL;	    for (j = 1; j < a->cols - 1; j++)		{		    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\" CONTENT=\"%p\">", j, (a->elements) [i][j]);		    if (write_f != NULL)			{			    write_f ((a->elements) [i][j], file, pos, user_data);			}		    fprintf (file, "</GDSL_2DARRAY_COL>\n");		}	    /* 2.3 Last column */	    pos |= GDSL_LOCATION_LAST_COL;	    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\" CONTENT=\"%p\">", j, (a->elements) [i][j]);	    if (write_f != NULL)		{		    write_f ((a->elements) [i][j], file, pos, user_data);		}	    fprintf (file, "</GDSL_2DARRAY_COL>\n");	    fprintf (file, "</GDSL_2DARRAY_ROW>\n");	    pos &= ~GDSL_LOCATION_LAST_COL;	}    /* 3. Last row */    /* 3.1 First column */    pos = GDSL_LOCATION_LAST_ROW | GDSL_LOCATION_FIRST_COL;    fprintf (file, "<GDSL_2DARRAY_ROW VALUE=\"%ld\">\n", i);    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"0\" CONTENT=\"%p\">", (a->elements) [i][0]);    if (write_f != NULL)	{	    write_f ((a->elements) [i][0], file, pos, user_data);	}    fprintf (file, "</GDSL_2DARRAY_COL>\n");    /* 3.2 Other columns but last */    pos &= ~GDSL_LOCATION_FIRST_COL;    for (j = 1; j < a->cols - 1; j++)	{	    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\" CONTENT=\"%p\">", j, (a->elements) [i][j]);	    if (write_f != NULL)		{		    write_f ((a->elements) [i][j], file, pos, user_data);		}	    fprintf (file, "</GDSL_2DARRAY_COL>\n");	}    /* 3.3 Last column */    pos |= GDSL_LOCATION_LAST_COL;    fprintf (file, "<GDSL_2DARRAY_COL VALUE=\"%ld\" CONTENT=\"%p\">", j, (a->elements) [i][j]);    if (write_f != NULL)	{	    write_f ((a->elements) [i][j], file, pos, user_data);	}    fprintf (file, "</GDSL_2DARRAY_COL>\n");    fprintf (file, "</GDSL_2DARRAY_ROW>\n");    fprintf (file, "</GDSL_2DARRAY>\n");}/******************************************************************************//* Private functions                                                          *//******************************************************************************/static gdsl_element_t default_alloc (void* e){    return e;}static void default_free (gdsl_element_t e){    ;}/** EMACS ** * Local variables: * mode: c * c-basic-offset: 4 * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -