数据结构之顺序表

Sequence.h

/* 线性表的动态分配顺序存储结构 */
#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量 */
#define LIST_INCREMENT 2 /* 线性表存储空间的分配增量 */
typedef struct
{
    int     *elem; 
    int     length; 
    int     listsize;
}SqList;
void    InitList(SqList *L);
void    Destroy(SqList *L);
void    ClearList(SqList*L);
int     ListEmpty(SqList L);
int     ListLength(SqList L);
int     GetElem(SqList L, int i, int *e);//查找线性表中此元素是否存在;
int     LocateElem(SqList L, int e, int(*compare)(int, int));
int     PriorElem(SqList L, int cur_e, int *Pre_e);
int     NextElem(SqList L,int cur_e,int *next_e);
int     ListInsert(SqList *L, int i, int e);
int     ListDelete(SqList *L, int i, int *e);
void    ListTraverse(SqList L, void(*vi)(int *));


Sequence.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "Sequence.h"
void InitList(SqList *L)
{
    L->elem = malloc(LIST_INIT_SIZE*sizeof(int));
    if (!L->elem)
    {
        exit(0);
     }
    L->length = 0;
    L->listsize = LIST_INIT_SIZE;
}
void InputList(SqList *L)
{
    int *p = L->elem;
    printf("Please input the init dade:
");
    for (int i = 0; i< L->listsize;i++)//这里将L->length 改为LIST_INIT_SIZE
    {
        scanf("%d",p++);
    }
}


void Destroy(SqList *L)
{
    free(L->elem);
    L->elem = NULL;
    L->length = 0;
    L->listsize = 0;
}
void ClearList(SqList*L)
{
    L->length = 0;
}
int ListEmpty(SqList L)
{
    if (L.length == 0)
        return 1;
    else
        return 0;
}
int ListLength(SqList L)
{
    return L.length;
}
int     GetElem(SqList L, int i, int *e)//查找线性表中此元素是否存在;
{
    if (i<1||i>L.length)
    {
        return 0;
    }
    *e = *(L.elem + i - 1);
    return 1;
}

int     LocateElem(SqList L, int e, int(*compare)(int, int))//查找该元素所在的位置;
{
    int *p;
    int i = 1;
    p = L.elem;
    while (i <= L.length&&!compare(*p++, e))
        ++i;
    if (i <= L.length)
        return i;
    else
        return 0;

}
int     PriorElem(SqList L, int cur_e, int *Pre_e)
{
    int i = 2;
    int *p = L.elem + 1;
    while (i < L.length&&*p != cur_e)
    {
        p++;
        i++;
    }
    if (i > L.length)
        return 0;
    else
    {
        *Pre_e = *--p;
        return 1;
    }
}
int     NextElem(SqList L, int cur_e, int *next_e)
{
    int i = 1;
    int *p = L.elem;
    while (i < L.length&&*p != cur_e)
    {
        i++;
        p++;
    }
    if (i == L.length)
        return 0; /* 操作失败 */
    else
    {
        *next_e = *++p;
        return 1;
    }
}
int     ListInsert(SqList *L, int i, int e)//在第i个位置插入数字e;
{
    int * newbase, *q, *p;
    if (i<1 || i>L->length + 1)
        return 0;
    if (L->length>=L->listsize)
    {
        newbase = realloc(L->elem, (L->listsize + LIST_INIT_SIZE)*sizeof(int));
        if (!newbase)
            exit(0);
        L->elem = newbase;
        L->listsize += LIST_INIT_SIZE;
    }
    q = L->elem + i - 1;
    for (p = L->elem + L->length - 1; p >= q;--p)
    {
        *(p + 1) = *p;
    }
    *q = e;
    ++L->length;
    return 1;
}
int     ListDelete(SqList *L, int i, int *e)
{
    int  *p, *q;
    if (i<1 || i>L->length) /* i值不合法 */
        return 0;
    p = L->elem + i - 1; /* p为被删除元素的位置 */
    *e = *p; /* 被删除元素的值赋给e */
    q = L->elem + L->length - 1; /* 表尾元素的位置 */
    for (++p; p <= q; ++p) /* 被删除元素之后的元素左移 */
        *(p - 1) = *p;
    L->length--; /* 表长减1 */
    return 1;

}
void print(SqList L)
{
    int *p = L.elem;
    for (int i=0; i <L.listsize;i++)
    {
        printf("%d  ",*(p++));

    }
    printf("
");
}

void    ListTraverse(SqList L, void(*vi)(int *))
{
    int *p;
    int i;
    p = L.elem;
    for (i = 1; i <= L.length; i++)
        vi(p++);
    printf("
");
}
int main()
{
    SqList SqlistTest ;//SqList *SqlistTest;
    InitList(&SqlistTest);//InitList(SqlistTest);两种传递方式
    InputList(&SqlistTest);//由于初始化时里面内容为空所以长度为空但是代码错误,所以可改;错误之处是指针应用错误,对线性表存储数据处理解错误
    printf("%d",ListLength(SqlistTest));
    printf("%d", ListEmpty(SqlistTest));
    printf("销毁数据前
");
    print(SqlistTest);
    Destroy(&SqlistTest);
    printf("销毁数据后
");
    print(SqlistTest);

    //printf("%d", GetElem(SqlistTest,5,1));


    system("pause");
    return 0;
}

严蔚敏的数据结构之顺序表

原文地址:https://www.cnblogs.com/VCctor/p/5100704.html