顺序表的基本操作

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 }

 

以上是关于顺序表的基本操作的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o

(数据结构)顺序表与链表的基本操作代码以及比较

顺序线性表的代码实现

线性表中的顺序存储与链式存储

数据结构之顺序表的增删查改等操作详解

顺序表详解及其c语言代码实现