zoukankan      html  css  js  c++  java
  • 数据结构之顺序表

    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;
    }
    

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

  • 相关阅读:
    将博客搬至CSDN
    JDBC
    Java刷题常用API
    Java的反射机制
    Java的IO流
    Docker原理:Cgroup
    Docker原理:Namespace
    Anaconda软件安装使用问题
    初步了解Unix系统的I/O模式
    深入理解索引和AVL树、B-树、B+树的关系
  • 原文地址:https://www.cnblogs.com/VCctor/p/5100704.html
Copyright © 2011-2022 走看看