C言語線形テーブル

線形テーブルの初期化、挿入、削除、および検索操作のC言語実装 

#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"malloc.h"

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define LIST_INIT_SIZE 100
#define LIST_INCREAMENT 10


/*定义线性表的结构*/
typedef struct
{
    int *elem;  //线性表存储空间基址
    int length; //线性表当前长度
    int list_size; //当前分配的存储容量
} SqList;


//线性表的初始化
int InitList(SqList *L)
{

    //将L->elem这个指针指向一块通过malloc函数分配的内存的地址
    //申请 LIST_INIT_SIZE 个大小为整型(int)字节的空间,
    //应该是把申请到的空间的首部位置的地址赋给L->elem
    //sizeof(int)是计算int的大小,int类型是4个字节
    //malloc是分配空间的意思,是C语言中特有的
    L->elem=(int *)malloc( LIST_INIT_SIZE * sizeof(int) );

    //存储空间分配失败
    if( !L->elem ){
        printf("OVERFLOW!");
        return ERROR;
    }

    //空线性表长度初始化为0;
    L->length = 0;

    //线性表的初始容量为初始分配空间
    L->list_size = LIST_INIT_SIZE;

    return OK;
}


//线性表的查找
int LocateElem(SqList L, int e)
{
    int *p;
    int i = 1;

    //线性表首地址
    p = L.elem;

    //*p++ 代表先取当前地址存储的内容,然后地址自增
    while( i<=L.length && (*p++)!=e )
        ++i;

    if(i <= L.length)
        return i;
    else
        return 0;
}


//插入数据
int ListInsert(SqList *L, int i, int e)
{
    int *newbase;
    int j;

    //插入位置小于1或大于线性表的长度+1,则为无效输入位置
    if( i < 1 || i > L->length + 1 )
        return ERROR;

    //如果线性表的当前长度大于等于线性表的存储空间长度
    //增加分配存储空间
    if( L->length >= L->list_size )
    {
        //尝试调整之前所分配的内存块的大小,具体做法百度
        //newbase为整形指针,指向调整后分配空间的首地址,
        newbase = (int *)realloc(L->elem, (LIST_INIT_SIZE + LIST_INCREAMENT) * sizeof(int));

        if( !newbase ){
            printf("内存空间已满\n");
            return ERROR;
        }

        //调整后分配空间的首地址(基址)
        L->elem = newbase;

        //调整后空间的存储容量
        L->list_size = L->list_size + LIST_INCREAMENT;
    }

    //要想把新元素插入线性表的第i个位置,
    //需要把从第i个位置开始往后的所有元素向后移动一位
    //为了防止覆盖,做法是从最后一个元素先往后移动一位,之前的元素按次往后移动
    //空间地址序号从0开始,则线性表最后一位的序号为L->length-1
    //第i个位置的地址序号为i-1
    for(j = (L->length)-1; j >= i-1; j--)
        L->elem[j+1] = L->elem[j];

    //然后把新元素插入第i个位置
    L->elem[i-1]=e;

    //当前线性表长度加1
    ++L->length;

    return OK;
}


//删除线性表中的数据
int ListDelete(SqList *L, int i)
{
    int j, e;

    //无效的删除位置
    if( i < 1 || i > L->length)
        return ERROR;

    //把被删除的元素赋给e
    //这一句有问题
    e = L->elem[i-1];

    //指针p指向被删除元素的地址
    //这里p没有用到
    //p = &( L->elem[i-1] );

    for(j=i; j < L->length; j++)
        L->elem[j-1] = L->elem[j];

    L->length--;

    return e;
}


//输出线性表全部元素
void ListOutput(SqList *L, char *s)
{
    printf("%s", s);

    int i;
    for(i=0; i < L->length; i++)
        printf("%d ", L->elem[i]);

    printf("\n");
}



int main()
{
    SqList L;
    int flag;
    int  n, i, e, j, k, k_p;

    //初始化顺序表
    flag = InitList(&L);
    if(flag)
        printf("List init sucess!\n");
    else
        printf("Fail code is %d.", flag);


    //插入
    printf("\nInput n: ");

    scanf("%d", &n);

    printf("\nPlease input %d elements:\n", n);

    for(i=1; i<=n; i++)
    {
        scanf("%d", &e);

        flag = ListInsert(&L, i, e);

        if(!flag)
            printf("Fail code is %d.", flag);
    }

    ListOutput(&L, "\nShow list all elements :");


    //当前线性表长度
    printf("\nCurrent List length: %d\n", L.length);

    //删除第j个位置的元素
    printf("\nInput delete element position: ");
    scanf("%d", &j);

    e = ListDelete(&L, j);

    printf("List delete %dth element sucess!\n", j);
    printf("delete %dth element is: %d\n", j, e);

    ListOutput(&L, "\nShow list all elements :");
    printf("\nCurrent List length: %d\n", L.length);


    //查找元素,返回在线性表里的位置
    printf("\nInput the seeking element: ");
    scanf("%d", &k);
    k_p = LocateElem(L, k);
    printf("the position of %d is %d in List.\n", k, k_p);

}

 

おすすめ

転載: blog.csdn.net/sdaujz/article/details/114930153