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 }
写在最后
所有的代码解释都以注释书写,欢迎交流,欢迎指正。看不懂头文件的同学,直接跳过头文件。