zoukankan      html  css  js  c++  java
  • 数据结构-线性表的顺序结构

      1 #include "stdio.h"
      2 #include "stdlib.h"
      3 
      4 typedef int ElemType;        //线性表存储基本类型
      5 typedef int Status;            //基本操作函数类型
      6 #define LIST_INT_SIZE 50    //线性表初始化存储空间分配量
      7 #define LISTINCREMENT 10    //线性表存储空间分配量增值
      8 #define OK 1
      9 #define ERROR 0
     10 
     11 typedef struct 
     12 {
     13     ElemType *elem;    //存储空间基址
     14     int length;        //当前长度
     15     int listsize;    //当前分配的存储容量(以sizeof(ElemType)为单位)
     16 }SqList;
     17 
     18 //构建一个空的线性表
     19 Status InitList(SqList &L)
     20 {
     21     L.elem = (ElemType *)malloc(LIST_INT_SIZE * sizeof(ElemType));
     22     if(!L.elem)                        //如果初始化失败返回ERROR
     23         return ERROR;
     24     L.length = 0;                    //空表长度为0
     25     L.listsize = LIST_INT_SIZE;        //初始存储容量
     26     return OK;    
     27 }//InitLise
     28 
     29 //销毁线性表L
     30 Status DestroyList(SqList &L)
     31 {
     32     free(L.elem);    //收回空间
     33     L.elem = NULL;    //基址指向NULL
     34     L.length = 0;    //长度变0
     35     L.listsize = 0;    //清除存储容量
     36     return OK;
     37 }//DestroyList
     38 
     39 //重置线性表L为空表
     40 bool ClearList(SqList &L)
     41 {
     42     L.length = 0;
     43     return OK;
     44 }//ClearList
     45 
     46 //查看线性表是否为空表
     47 Status ListEmpty(SqList L)
     48 {
     49     if(L.length == 0)
     50         return OK;
     51     else
     52         return ERROR;
     53 }//ListEmpty
     54 
     55 //查看线性表的元素个数
     56 int ListLength(SqList L)
     57 {
     58     return L.length;    //返回长度
     59 }//ListLength
     60 
     61 //用e返回第i个数据元素的值
     62 Status GetElem(SqList L, int i, ElemType &e)
     63 {
     64     if(i < 1 || i > L.length)    //判断i值是否合法
     65         return ERROR;
     66     e = L.elem[i-1];                //赋值第i个元素值
     67     return OK;
     68 }//GetElem
     69 
     70 //返回L中第一个与e满足关系compare()的数据元素
     71 //若这样的数据元素不存在则返回0
     72 int LocateElem(SqList L, ElemType e, Status(*compare)(ElemType,ElemType))
     73 {
     74     ElemType *p = L.elem;
     75     int i = 1;
     76     while(i <= L.length && !compare(*p++,e))
     77         ++i;
     78     if(i <= L.length)
     79         return i;
     80     else
     81         return -1;
     82 }//LocateElem
     83 
     84 //若cur_e是L的数据元素,且不是第一个,则用pre_e返回他的前驱
     85 //否则操作是啊比,pre_e无定义
     86 Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e)
     87 {
     88     int i = 2;
     89     ElemType *p = L.elem+1;
     90     while(i <= L.length && *p != cur_e)
     91     {
     92         p++;
     93         i++;
     94     }
     95     if(i > L.length)
     96         return ERROR;
     97     else
     98     {
     99         pre_e = *--p;
    100         return OK;
    101     }
    102 }//PriorElem
    103 
    104 //若cur_e是L的数据元素,且不是最后一个,则用next_e返回他的后驱
    105 //否则操作是啊比,next_e无定义
    106 Status NextList(SqList L, ElemType cur_e, ElemType &next_e)
    107 {
    108     int i = 1;
    109     ElemType *p = L.elem;
    110     while(i <= L.length && *p != cur_e)
    111     {
    112         ++p;
    113         ++i;
    114     }
    115     if(i == L.length)
    116         return ERROR;
    117     else
    118     {
    119         next_e = *++p;
    120         return OK;
    121     }
    122 }//NextList
    123 
    124 //插入元素
    125 Status ListInsert(SqList &L, int i, ElemType e)
    126 {
    127     if(i < 1 || i > L.length+1)    //判断i值是否合法
    128         return ERROR;    
    129     SqList newbase;        //用于存储新加元素的位置空间
    130     if(L.length >= L.listsize)    //当前存储分配已满,增加分配
    131     {
    132         newbase.elem = (ElemType *)realloc(L.elem,
    133             (L.listsize + LISTINCREMENT) * sizeof(ElemType));
    134         if(!newbase.elem)    //存储分配失败
    135             return ERROR;        
    136         L.elem = newbase.elem;        //新基址
    137         L.listsize += LISTINCREMENT;    //增加存储容量
    138     }
    139     ElemType *q = &(L.elem[i-1]);    //q指向插入位置
    140     for (ElemType *p = &(L.elem[L.length-1]); p >= q; --p)    //p指向表尾
    141         *(p+1) = *p;    //插入位置及之后的元素右移
    142     *q = e;    //插入元素
    143     ++L.length;    //表长加一
    144     return OK;
    145 }//ListInsert
    146 
    147 //删除第几个元素并返回值
    148 Status ListDelete(SqList &L, int i, ElemType &e)
    149 {
    150     if((i < 1) || (i > L.length))            //判断i值是否合法
    151         return ERROR;                        //i值不合法返回失败
    152     ElemType *p = &(L.elem[i-1]);            //p指向被删除元素的位置
    153     e = *p;                                    //返回被删除元素的值
    154     ElemType *q = L.elem + L.length - 1;    //q指向最后一个元素的位置
    155     for (++p; p <= q; ++p)                    //被删除元素之后的元素左移
    156         *(p-1) = *p;
    157     --L.length;                                //当前表长减一
    158     return OK;
    159 }//ListDelete
    160 
    161 //依次对L的每一个数据元素调用Visit()函数
    162 Status ListTraverse(SqList L, void(*Visit)(ElemType*))
    163 {
    164     ElemType *p = L.elem;
    165     int i;
    166     for(i = 1; i <= L.length; i++)
    167         Visit(p++);
    168     printf("
    ");
    169     return OK;
    170 }//ListTraverse
    171 
    172 //ListTraverse()调用函数Visit()
    173 //Visit函数在这里做输出链表功能
    174 void Visit(ElemType *c)
    175 {
    176     printf("%d",*c);    //%d随data类型而变
    177 }
    178 
    179 //查找元素
    180 int ListLocate(SqList L, ElemType e)
    181 {
    182     int i = 1;
    183     while(i <= L.length)
    184     {
    185         if (L.elem[i-1] == e)
    186             break;
    187         i++;
    188     }
    189     if(i <= L.length)            //找到指定元素则返回位置否则返回-1
    190         return i;
    191     else
    192         return -1;
    193 }//ListLocate

    线性表的顺序表达的13个基本函数。

    参考《数据结构(C语言版)》严蔚敏编著

  • 相关阅读:
    docker 报错 Error response from daemon: error while validating Root CA Certificate: x509: certificate has expired or is not yet valid
    Python list 与 str 互转
    小程序 url传参 参数值过长 接收时候 内容不全的问题
    es6新增对象字面量语法
    Squid Proxy
    常见开发工具安装方法
    批判世界之前先清理你的房间
    windows的双网卡问题
    SSH
    【逆向】Yara规则编写安装与使用教程
  • 原文地址:https://www.cnblogs.com/ABook/p/5370008.html
Copyright © 2011-2022 走看看