• 顺序表的基本操作


      

      1 //顺序线性表
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #define LIST_INIT_SIZE 100 //线性表储存空间的初始分配量
      5 #define LISTINCREMENT 10  //线性表储存空间的分配增量
      6 #define OK 1
      7 #define ERROR 0
      8 typedef double ElemType;
      9 typedef struct {
     10     ElemType *elem;  //储存空间基地址
     11     int length;        //当前长度
     12     int listsize;   //当前分配的储存容量(以sizeof(ElemType))为单位
     13 }SqList;
     14 //顺序表的初始化
     15 void InitList(SqList *L) {
     16     L->elem = (ElemType*)malloc(LIST_INIT_SIZE);
     17     if (!L->elem)  //储存分配失败
     18         exit(-1);
     19     L->length = 0;    //空表长度为0
     20     L->listsize = LIST_INIT_SIZE; //初始储存容量
     21 }
     22 //判断表是否为空
     23 int EmptyList(SqList *L)
     24 {
     25     if (L->length == 0)
     26     {
     27         return OK;
     28     }
     29     return ERROR;
     30 }
     31 //顺序表的插入
     32 int ListInsert(SqList *L,int i,ElemType e) {
     33     //在顺序表L中的第i个位置之前插入新的元素e,L的长度加1
     34     //i=1时头插 i=L->length+1 时尾插
     35     ElemType *newbase, *q, *p;
     36     if (i<1 || i>L->length + 1)  //输入的i值不合法
     37         return ERROR;
     38     if (L->length >= L->listsize)  //当前储存空间已满,增加分配
     39     {
     40         newbase = (ElemType*)realloc(L->elem, (L->listsize +
     41             LISTINCREMENT) * sizeof(ElemType));
     42         if (!newbase)  exit(-1);
     43         L->elem = newbase;  //新基地址
     44         L->listsize += LISTINCREMENT;  //增加储存容量
     45     }
     46     q = L->elem + i - 1;   //获得插入位置的地址
     47     for (p = L->elem + L->length - 1; p >= q; --p)
     48     //q之后的元素右移一步,腾出空间
     49         *(p + 1) = *p;
     50     *q = e;  //插入e
     51     ++L->length;  //表长加1
     52     return OK;
     53 
     54     
     55 }
     56 //头插
     57 int TopInsert(SqList *L, ElemType e) {
     58     ElemType *newbase, *p;
     59     int i;
     60     if (L->length >= L->listsize)  //当前储存空间已满,增加分配
     61     {
     62         newbase = (ElemType*)realloc(L->elem, (L->listsize +
     63             LISTINCREMENT) * sizeof(ElemType));
     64         if (!newbase)  exit(-1);
     65         L->elem = newbase;  //新基地址
     66         L->listsize += LISTINCREMENT;  //增加储存容量
     67     }
     68     p = L->elem + L->length - 1;
     69     for (i = L->length; i > 0; --i)
     70     {//表中所有元素右移一步,腾出空间
     71         *(p + 1) = *p;
     72         p--;
     73     }
     74     *L->elem = e;  //插入e
     75     ++L->length;  //表长加1
     76     return OK;
     77 }
     78 //尾插
     79 int BackInsert(SqList *L,ElemType e) {
     80     ElemType *newbase, *p;
     81     if (L->length >= L->listsize)  //当前储存空间已满,增加分配
     82     {
     83         newbase = (ElemType*)realloc(L->elem, (L->listsize +
     84             LISTINCREMENT) * sizeof(ElemType));
     85         if (!newbase)  exit(-1);
     86         L->elem = newbase;  //新基地址
     87         L->listsize += LISTINCREMENT;  //增加储存容量
     88     }
     89     p = L->elem + L->length;  //p指向最后一个元素的后一个地址
     90     *p = e;       //插入e
     91     L->length++;  //表长加1
     92     return OK;
     93 
     94 }
     95 //顺序表的删除
     96 int ListDelete(SqList *L, int i, ElemType *e) {
     97     //删除L的第i个元素,并用e返回其值,L的表长减1
     98     //i=1 头删  i=L->length+1  尾删
     99     ElemType *p, *q;
    100     if (i<1 || i>L->length + 1)  //输入的i值不合法
    101         return ERROR;
    102     p = L->elem + i - 1;  //p为被删除元素的位置
    103     *e = *p;  //被删除元素的值赋给e
    104     q = L->elem + L->length - 1;  //表尾元素的位置
    105     for (++p; p <= q; ++p)//删除元素后的元素左移
    106         *(p - 1) = *p;
    107     L->length--;  //表长减1
    108     return OK;
    109 
    110 }
    111 //头删
    112 int TopDelete(SqList *L, ElemType *e) {
    113     ElemType *p, *q;
    114     if (EmptyList(L) == OK) return ERROR;
    115     p = L->elem ;  //p为被删除元素的位置
    116     *e = *p;  //被删除元素的值赋给e
    117     q = L->elem + L->length - 1;  //表尾元素的位置
    118     for (++p; p <= q; ++p)//删除元素后的元素左移
    119         *(p - 1) = *p;
    120     L->length--;  //表长减1
    121     return OK;
    122 }
    123 //尾删
    124 int BackDelete(SqList *L, ElemType *e) {
    125     
    126     if (EmptyList(L) == OK) return ERROR;
    127     *e = *L->elem + L->length - 1;
    128     L->length--;  //表长减1
    129     return OK;
    130 }
    131 
    132 //打印表中元素
    133 void PrintList(SqList *L)
    134 {
    135     int i;
    136     if (EmptyList(L)==OK)
    137     {
    138         printf("表为空!
    ");
    139         exit(-1);
    140     }
    141     for (i = 0; i< L->length; i++)
    142     {
    143         printf("%lf ",*( L->elem+i));
    144     }
    145     printf("
    ");
    146 }
    147 //清空表
    148 int ClearList(SqList *L) {
    149     L->length = 0;
    150     return OK;
    151 }
    152 //销毁表
    153 int DestoryList(SqList *L) {
    154     
    155     free(L->elem);
    156     return OK;
    157 }
    158 
    159 int main() {
    160     SqList *L;
    161     L = (SqList*)malloc(sizeof(SqList));
    162     ElemType  *e = (ElemType*)malloc(sizeof(ElemType));
    163     InitList(L);
    164     BackInsert(L, 1);
    165     BackInsert(L, 2);
    166     BackInsert(L, 3);
    167     PrintList(L);
    168 
    169     TopInsert(L, 0);
    170     PrintList(L);
    171 
    172     BackInsert(L, 4);
    173     PrintList(L);
    174 
    175     ListInsert(L, 2, 8);
    176     PrintList(L);
    177 
    178     ListDelete(L, 2, e);
    179     printf("被删除的元素为:%lf
    ", *e);
    180     PrintList(L);
    181 
    182     TopDelete(L, e);
    183     printf("被头删的元素为:%lf
    ", *e);
    184     PrintList(L);
    185 
    186     BackDelete(L, e);
    187     printf("被尾删的元素为:%lf
    ", *e);
    188     PrintList(L);
    189 
    190     if (ClearList(L) == OK) printf("成功清空表
    ");
    191     PrintList(L);
    192     
    193 
    194 
    195     return OK;
    196 }
  • 相关阅读:
    ISAPI_Rewrite规则写法
    用Windows 2003配置邮件服务器
    如何保护.net中的dll文件(防破解、反编译)
    The Tao Of Programming 编程之道
    Request.ServerVariables (server environment variable)
    Windows下搭建Subversion 服务器
    邮件服务器反解析退信问题分析
    关于公网和内网之间Socket的通信
    .net安装部署中添加卸载程序简单方法
    构建高性能ASP.NET站点 剖析页面处理过程
  • 原文地址:https://www.cnblogs.com/mwq1024/p/10224243.html
Copyright © 2020-2023  润新知