顺序表

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <cmath>
  5 #include <cstring>
  6 #include <cstdlib>
  7 using namespace std;
  8 
  9 /**********线性表---顺序表**********/
 10 // 宏定义常量
 11 #define LIST_INIT_SIZE 100 // 初始分配空间
 12 #define LISTINCREMENT 10   // 空间分配增值
 13 #define TRUE 1
 14 #define FALSE 0
 15 #define OK 1
 16 #define ERROR 0
 17 #define INFEASBLE -1
 18 #define OVERFLOW -2
 19 
 20 typedef int Elemtype;
 21 typedef int Status;
 22 
 23 typedef struct
 24 {
 25     Elemtype *elem; // 头指针
 26     int length;     // 顺序表使用长度
 27     int listsize;   // 顺序表总长
 28 } SqList;
 29 
 30 // 基本操作:
 31 Status InitList_Sq(SqList *L);                      // 构造线性表(算法2.2)
 32 Status ListInsert_Sq(SqList &L, int i, Elemtype e); // 在第i个位置前插入新的元素(算法2.3)
 33 Status ListDelet_Sq(SqList &L, int i, Elemtype &e); // 删除位置i处的元素并用e返回被删除元素(算法2.4)
 34 void ListPrint(SqList *L);
 35 
 36 int main()
 37 {
 38     SqList L; // 定义表头
 39     InitList_Sq(&L);
 40     for (int i = 10; i > 0; i--)
 41         ListInsert_Sq(L, 1, i);
 42     ListInsert_Sq(L, 8, 99);
 43     Elemtype e;
 44     ListPrint(&L);
 45     putchar('\n');
 46     ListDelet_Sq(L, 8, e);
 47     ListPrint(&L);
 48     return 0;
 49 }
 50 
 51 // 构造线性表
 52 Status InitList_Sq(SqList *L)
 53 {
 54     L->elem = (Elemtype *)malloc(LIST_INIT_SIZE * sizeof(Elemtype));
 55     /* 
 56     malloc申请内存    使用格式:(类型*)malloc(空间大小)
 57     elem 指向所申请内存空间的首地址
 58     malloc函数申请空间失败返回值是NULL,若失败L->elem == NULL  */
 59     if (!L->elem) // 等效于 L->elem == NULL
 60         exit(OVERFLOW);
 61     L->length = 0; // 此函数仅仅是创造一片空间,为储存数据时为空表
 62     L->listsize = LIST_INIT_SIZE;
 63     return OK;
 64 } // 函数作用:开辟一连串"物理空间连续"的内存用于数据存储,创建顺序表完后任务结束
 65 
 66 // 在第i个位置前插入新的元素
 67 Status ListInsert_Sq(SqList &L, int i, Elemtype e)
 68 {
 69     if (i < 1 || i > L.listsize)
 70         return ERROR; // 插入位置只能是开始-->末尾(1 <= i <= listsize)
 71     if (L.length >= L.listsize)
 72     {
 73         Elemtype *newbase =
 74             (Elemtype *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(Elemtype));
 75         // 由于空间不够将申请新的空间使用,用newbase记录新的空间的首地址
 76         if (!newbase)
 77             exit(OVERFLOW);
 78         L.elem = newbase; // 让链表头指针指向重新分配的内存
 79         L.listsize += LISTINCREMENT;
 80     }
 81     Elemtype *InsertPozition = &(L.elem[i - 1]); // 记录插入位置的地址
 82     for (Elemtype *p = &(L.elem[L.length]); p >= InsertPozition; --p)
 83         *(p + 1) = *p; // 将a[j]位置的元素拷贝到a[j+1](i <= j <= length+1)
 84     L.length++;
 85     *InsertPozition = e; // 插入新的元素
 86     return OK;
 87 } // 函数作用:将插入位置i后的所有元素往尾挪动一位,空出位置i以存储新的元素
 88 
 89 // 删除位置i处的元素并用e返回被删除元素
 90 Status ListDelet_Sq(SqList &L, int i, Elemtype &e)
 91 {
 92     if (i < 1 || i > L.length)
 93         return ERROR;               // 保证将删除数据合法
 94     Elemtype *p = &(L.elem[i - 1]); // 记录被删除数据的位置
 95     e = L.elem[i - 1];
 96     for (Elemtype *end = &(L.elem[L.length - 1]); p <= end; ++p)
 97         *p = *(p + 1);// end记录结尾位置,p只移动到end
 98     L.length--;
 99     return OK;
100 }// 函数作用:将i --> 最后的元素全部往头挪动一位;用e返回删除的i处的元素
101 
102 void ListPrint(SqList *L)
103 {
104     for (int i = 0; i < L->length; i++)
105         // printf("List[%d] = %d\n", i, L->elem[i - 1]);
106         printf("%d ", L->elem[i]);// 逐个输出表中的元素
107     putchar('\n');
108 }

写在最后

  所有的代码解释都以注释书写,欢迎交流,欢迎指正。看不懂头文件的同学,直接跳过头文件。

上一篇:鼠标操作


下一篇:C语言--数据结构之线性表的顺序存储