数据结构与算法基础之对称矩阵(C语言)

数据结构与算法基础之对称矩阵

学习来源:
数据结构与算法基础(青岛大学-王卓)

地址:

https://www.bilibili.com/video/BV1nJ411V7bd?p=22&spm_id_from=pageDriver

背景:
实现视频里老师的伪代码,并不完全一样,但基本雷同。

更新
2021/7/3
第一次发布


代码:

SymmetryMatrix.h

#ifndef _SYMMETRYMATRIX_H_
#define _SYMMETRYMATRIX_H_

typedef struct SymmetryMatrix *SymmetryMatrix;//Matrix object

//Create "n" x "n" symmetry matrix.
SymmetryMatrix Create_SM(unsigned n);

//Destroy matrix.
//The function will set matrix's pointer "sm" with NULL.
void Destroy_SM(SymmetryMatrix *sm_p);

//Set matrix sm's element's value with "val".index("i", "j")
void Set_SM(SymmetryMatrix sm, unsigned i, unsigned j, int val);

//Get matrix sm's element's value.index("i", "j");
int Get_SM(SymmetryMatrix sm, unsigned i, unsigned j);
void Show_SM(SymmetryMatrix sm);

#endif

SymmetryMatrix.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SymmetryMatrix.h"
#include "CommonFunc.h"

struct SymmetryMatrix
{
    int *array;//Matrix array.
    unsigned n;//nxn Matrix
};

//Caculate the length of matrix array by "n".
inline static unsigned GetLength_SM(unsigned n);


void Show_SM(SymmetryMatrix sm)
{
    NULLPointOut(sm, "Show_SM", "sm");

    unsigned n = sm->n;

    unsigned i, j;
    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <=n; j++)
        {
            printf("%d ", Get_SM(sm, i, j));
        }
        puts("");
    }

    return;
}

int Get_SM(SymmetryMatrix sm, unsigned i, unsigned j)
{
    NULLPointOut(sm, "Get_SM", "sm");

    if(i > sm->n || j > sm->n || i == 0 || j == 0)
    {
        puts("ERROR Get_SM: The i or j is out of the matrix boundary of 'n'");
        exit(-1);
    }
    else if(j > i)
    {
        unsigned tmp;

        tmp = j;
        j = i;
        i = tmp;
    }

    unsigned k = (i * (i - 1) / 2) + (j - 1);

    return sm->array[k];
}

void Set_SM(SymmetryMatrix sm, unsigned i, unsigned j, int val)
{
    NULLPointOut(sm, "Set_SM", "sm");

    if(i > sm->n || j > sm->n || i == 0 || j == 0)
    {
        puts("ERROR Set_SM: The i or j is out of the matrix boundary of 'n'");
        exit(-1);
    }
    else if(j > i)
    {
        unsigned tmp;

        tmp = j;
        j = i;
        i = tmp;
    }

    unsigned k = (i * (i - 1) / 2) + (j - 1);
    sm->array[k] = val;

    return;
}


void Destroy_SM(SymmetryMatrix *sm_p)
{
    NULLPointOut(sm_p, "Destroy_SM", "sm_p");
    NULLPointOut(*sm_p, "Destroy_SM", "sm");
    NULLPointOut((*sm_p)->array, "Destroy_SM", "array");

    free((*sm_p)->array);
    free(*sm_p);

    *sm_p = NULL;

    return;
}

SymmetryMatrix Create_SM(unsigned n)
{
    if(n == 0)
    {
        return NULL;
    }

    unsigned len = GetLength_SM(n);

    int *array = (int *)malloc(len * sizeof(int));
    NULLMallocOut(array, "Create_SM", "array");
    memset(array, 0, len * sizeof(int));

    SymmetryMatrix sm = (SymmetryMatrix)malloc(sizeof(SymmetryMatrix));
    NULLMallocOut(sm, "Create_SM", "sm");

    sm->array = array;
    sm->n = n;

    return sm;
}

inline static unsigned GetLength_SM(unsigned n)
{
    return n * (n + 1) / 2;
}



CommonFunc.h

#ifndef _COMMONFUNC_H_
#define _COMMONFUNC_H_


//If p equal null, exit program and pop a err message.
//The parameter 'func' is error function name.
//The paremeter 'element' is problem variables.
void NULLPointOut(void *p, char *func, char *element);
void NULLMallocOut(void *p, char *func, char *element);

//Index array.
//The "P" is array's head pointer.
//The "index" is your element position in array.
//The "DataSize" is element's type size.
//It returns the address of the element you are looking for.
void * Index(void *P, int index, unsigned DataSize);

//Pointer plus plus and pointer sub sub.
//The "P" is array's head pointer.
//The "DataSize" is element's type size.
void * PointerInc(void *P, unsigned DataSize);
void * PointerDec(void *P, unsigned DataSize);

//Get the distance between A and B.
//return (A - B) / DataSize
//The "DataSize" is element's type size.
long PointerSub(void *A, void *B, unsigned DataSize);


#endif

CommonFunc.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "CommonFunc.h"

long PointerSub(void *A, void *B, unsigned DataSize)
{
    NULLPointOut(A, "PointerSub", "A");
    NULLPointOut(B, "PointerSub", "B");

    if(DataSize == 0)
    {
        puts("PointerSub ERROR: Divide zero error");  
        exit(-1);
    }

    return ((char *)A - (char *)B) / DataSize;
}

void * PointerDec(void *P, unsigned DataSize)
{
    NULLPointOut(P, "PointerDec", "P");

    char *c = (char *)P;
    c = c - DataSize;

    return c;
}

void * PointerInc(void *P, unsigned DataSize)
{
    NULLPointOut(P, "PointerInc", "P");

    char *c = (char *)P;
    c = c + DataSize;

    return c;
}

void NULLPointOut(void *p, char *func, char *element)
{
    if(func == NULL)
    {
        puts("NULLPointOut ERROR: NULL point exception 'func'");
        exit(-1);
    }
    else if(element == NULL)
    {
        puts("NULLPointOut ERROR: NULL point exception 'element'");
        exit(-1);
    }

    if(p == NULL)
    {
        printf("%s ERROR: NULL point exception '%s'\n", func, element);
        exit(-1);
    }

    return;
}

void NULLMallocOut(void *p, char *func, char *element)
{
    NULLPointOut(func, "NULLMallocOut", "func");
    NULLPointOut(element, "NULLMallocOut", "element");

    if(p == NULL)
    {
        printf("%s ERROR: Malloc error '%s'\n", func, element);
        exit(-1);
    }

    return;
}

void * Index(void *P, int index, unsigned DataSize)
{
    NULLPointOut(P, "Index", "P");

    char *c = (char *)P;
    c = c + index * (int)DataSize;

    return c;
}

example.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SymmetryMatrix.h"


int main(void)
{
    
    SymmetryMatrix sm = Create_SM(5);
    Set_SM(sm, 1, 1, 1);
    Set_SM(sm, 1, 2, 5);
    Set_SM(sm, 1, 3, 1);
    Set_SM(sm, 1, 4, 3);
    Set_SM(sm, 1, 5, 7);
    Set_SM(sm, 2, 1, 5);
    Set_SM(sm, 2, 3, 8);
    Set_SM(sm, 3, 1, 1);
    Set_SM(sm, 3, 2, 8);
    Set_SM(sm, 3, 3, 9);
    Set_SM(sm, 3, 4, 2);
    Set_SM(sm, 3, 5, 6);
    Set_SM(sm, 4, 1, 3);
    Set_SM(sm, 4, 3, 2);
    Set_SM(sm, 4, 4, 5);
    Set_SM(sm, 4, 5, 1);
    Set_SM(sm, 5, 1, 7);
    Set_SM(sm, 5, 3, 6);
    Set_SM(sm, 5, 4, 1);
    Set_SM(sm, 5, 5, 3);

    Show_SM(sm);

    Destroy_SM(&sm);

    return 0;
}


上一篇:用oracle来演示外键的使用


下一篇:java使用国密sm算法