顺序表的基本操作
Posted mwq1024
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序表的基本操作相关的知识,希望对你有一定的参考价值。
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 }
以上是关于顺序表的基本操作的主要内容,如果未能解决你的问题,请参考以下文章